基于python的selenium全網(wǎng)最新超詳細(xì)教程
一.安裝
安裝WebDriver
查看chrome版本號,設(shè)置-幫助-關(guān)于Google chrome,找到版本號。
可以到這個(gè)網(wǎng)站進(jìn)行下載對應(yīng)版本的chromedriver,如果chrome瀏覽器版本過高,可以下載最新版的chromedriver進(jìn)行使用 Chrome for Testing availability
下載下來之后,將chromedriver.exe放到安裝的Python環(huán)境的文件夾內(nèi)
終端輸入chromedriver -version驗(yàn)證
必要的話,可以重啟電腦,可能進(jìn)行編寫完代碼進(jìn)行啟動(dòng)的過程很慢,可以耐心等待一段時(shí)間,基本上都是可以運(yùn)行的
二.源碼分析
- 首先啟動(dòng)WebDriver并綁定特定端口開啟Web服務(wù),當(dāng)作Remote Server
- Client 首次請求會創(chuàng)建1個(gè)Session,向remote server發(fā)送HTTP請求啟動(dòng)瀏覽器,Remote Server解析請求,完成相應(yīng)操作并返回response
- 啟動(dòng)瀏覽器后,Client Cookie攜帶session id,再次給Remote Server發(fā)送HTTP請求操作瀏覽器,定位頁面元素等等
- 解析response,判斷腳本是否繼續(xù)還是結(jié)束
三.webdriver操作方法
1.元素操作
click()點(diǎn)擊事件 clear()清空事件 send_keys()輸入事件
拿百度舉例,我們可以現(xiàn)在搜索輸入框中清空數(shù)據(jù)(clear),然后輸入數(shù)據(jù)(send_keys),最后點(diǎn)擊按鈕進(jìn)行跳轉(zhuǎn)(click)
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://www.baidu.com/") driver.find_element(By.ID,'kw').clear() driver.find_element(By.ID, 'kw').send_keys('zxn') driver.find_element(By.ID,'su').click() time.sleep(2) driver.close()
2.瀏覽器操作
1. maximize_window() 最大化瀏覽器窗口-->模擬瀏覽器最大化按鈕
2. set_window_size(width,height) 設(shè)置瀏覽器窗口大小-->設(shè)置瀏覽器寬、高(像素點(diǎn))
3. set_window_position(x, y) 設(shè)置瀏覽器窗口位置-->設(shè)置瀏覽器位置
4. back() 后退-->模擬瀏覽器后退按鈕
5. forward() 前進(jìn)-->模擬瀏覽器前進(jìn)按鈕
6. refresh() 刷新-->模擬瀏覽器F5刷新
7. close() 關(guān)閉當(dāng)前窗口-->模擬點(diǎn)擊瀏覽器關(guān)閉按鈕
8. quit() 關(guān)閉瀏覽器驅(qū)動(dòng)對象-->關(guān)閉所有程序啟動(dòng)的窗口
9. title 獲取頁面title
10. current_url 獲取當(dāng)前頁面URL
可以根據(jù)以下的代碼進(jìn)行理解
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com/") driver.find_element(By.ID,'kw').clear() driver.find_element(By.ID, 'kw').send_keys('zxn') driver.find_element(By.ID,'su').click() time.sleep(2) driver.back() time.sleep(2) driver.forward() time.sleep(2) driver.refresh() time.sleep(2) driver.close()
close() 關(guān)閉當(dāng)前窗口-->模擬點(diǎn)擊瀏覽器關(guān)閉按鈕 關(guān)閉單個(gè)頁面
注意:當(dāng)打開新的頁面時(shí),close方法關(guān)閉的是原頁面
比如下面的代碼,打開了百度的頁面,之后點(diǎn)擊百度地圖頁面,打開了一個(gè)新的標(biāo)簽頁,close方法關(guān)閉了百度頁面,而,百度地圖頁面并沒有被關(guān)閉
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com/") driver.find_element(By.CSS_SELECTOR,'a[ rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ]').click() time.sleep(2) driver.close() time.sleep(2)
quit() 關(guān)閉瀏覽器驅(qū)動(dòng)對象-->關(guān)閉所有程序啟動(dòng)的窗口 #關(guān)閉所有的頁面
webdriver的屬性:
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com/") print(driver.title) print(driver.current_url)
3.獲取元素信息
1. size 返回元素大小
2. text 獲取元素的文本
3. get_attribute( "xxx") 獲取屬性值,傳遞的參數(shù)為元素的屬性名4. is_displayed() 判斷元素是否可見
5. is_enabled() 判斷元素是否可用
6. is_selected() 判斷元素是否選中,用來檢查復(fù)選框或單選按鈕是否被選中
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com/") print(driver.find_element(By.CSS_SELECTOR,'a[ rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ]').size) print(driver.find_element(By.CSS_SELECTOR, 'a[ rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ]').text) print(driver.find_element(By.CSS_SELECTOR, 'a[ rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ]').get_attribute('href')) driver.quit()
4.鼠標(biāo)操作
常見的鼠標(biāo)操作有:點(diǎn)擊、右擊、雙擊、懸停、拖拽等,對于這些鼠標(biāo)操作Selenium都封裝了相應(yīng)的操作方法。
說明:在Selenium中將操作鼠標(biāo)的方法封裝在ActionChains類中
實(shí)例化對象:
action =ActionChains(driver)方法:
1. context_click(element) 右擊-->模擬鼠標(biāo)右鍵點(diǎn)擊效果
2. double_click(element) 雙擊--〉模擬鼠標(biāo)雙擊效果
3. drag_and_drop(source,target) 拖動(dòng)--〉模擬鼠標(biāo)拖動(dòng)效果4. move_to_element(element) 懸停-->模擬鼠標(biāo)懸停效果
5. perform() 執(zhí)行-->此方法用來執(zhí)行以上所有鼠標(biāo)操作
為了更好的學(xué)習(xí)其他方法,我們先學(xué)習(xí)perform()執(zhí)行方法,因?yàn)樗械姆椒ǘ夹枰獔?zhí)行才能生效
from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com/") action=ActionChains(driver) action.context_click(driver.find_element(By.ID,'su')) action.perform() time.sleep(2) driver.quit()
其他的操作都類似,注意懸停鼠標(biāo)操作的時(shí)候不要?jiǎng)邮髽?biāo)
也可以直接perform操作
action=ActionChains(driver) action.move_to_element(driver.find_element(By.ID,'s-usersetting-top')).perform()
5.鍵盤操作
導(dǎo)包:from selenium.webdriver.common. keys import Keys
1. send_keys ( Keys.BACK_SPACE) 刪除鍵(BackSpace)
2. send_keys(Keys.SPACE) 空格鍵(Space)
3. send_keys(Keys.TAB) 制表鍵(Tab)
4. send_keys (Keys.ESCAPE) 回退鍵(Esc)
5. send_keys (Keys.ENTER) 回車鍵(Enter)
6. send_keys (Keys.coTROL , 'a ') 全選(Ctrl+A)
7. send_keys(Keys.CONTROL, 'c ') 復(fù)制(Ctrl+C)
下面是一個(gè)示例代碼
from selenium import webdriver from selenium.webdriver import Keys from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com/") driver.find_element(By.ID,'kw').send_keys('woshini') time.sleep(2) driver.find_element(By.ID, 'kw').send_keys(Keys.BACKSPACE) time.sleep(2) driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL,'a') driver.find_element(By.ID, 'kw').send_keys(Keys.BACKSPACE) time.sleep(2) driver.quit()
6.元素等待
概念:在定位頁面元素時(shí)如果未找到,會在指定時(shí)間內(nèi)一直等待的過程
元素等待的類型: 1.隱式等待2.顯示等待
1.隱式等待
概念:定位元素時(shí),如果能定位到元素則直接返回該元素,不觸發(fā)等待;如果不能定位到該元素,則間隔一段時(shí)間后再去定位元素;如果在達(dá)到最大時(shí)長時(shí)還沒有找到指定元素,則拋出元素不存在的異常NoSuchElementException 。
方法: driver. implicitly_wait(timeout)
(timeout:為等待最大時(shí)長,單位:秒)
說明:隱式等待為全局設(shè)置(只需要設(shè)置一次,就會作用于所有元素)
注意:當(dāng)隱式等待被激活時(shí),雖然目標(biāo)元素已經(jīng)出現(xiàn)了,但是還是會由于當(dāng)前頁面內(nèi)的其他元素的未加載完成,而繼續(xù)等待,進(jìn)而增加代碼的執(zhí)行時(shí)長
from selenium import webdriver from selenium.webdriver.common.by import By if __name__ == '__main__': driver=webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com/") driver.implicitly_wait(10) driver.find_element(By.ID,'kw').send_keys('woshini') driver.find_element(By.ID, 'su').click() driver.quit()
2.顯式等待
概念:定位指定元素時(shí),如果能定位到元素則直接返回該元素,不觸發(fā)等待:如果不能定位到該元素,則間隔一段時(shí)間后再去定位元素;如果在達(dá)到最大時(shí)長時(shí)還沒有找到指定元素,則拋出超時(shí)異常TimeoutException 。
在Selenium中把顯式等待的相關(guān)方法封裝在WebDriverWait類中
1.導(dǎo)包等待類--> from selenium. webdriver. support.wait import webDriverWait
2. webDriverWait(driver,timeout, poll_frequency=o.5)
driver:瀏覽器驅(qū)動(dòng)對象
timeout:超時(shí)的時(shí)長,單位:秒
poll_frequency:檢測間隔時(shí)間,默認(rèn)為0.5秒
3.調(diào)用方法until(method):直到...時(shí)method:函數(shù)名稱,該函數(shù)用來實(shí)現(xiàn)對元素的定位
一般使用匿名函數(shù)來實(shí)現(xiàn): lambda x: x.find_element_by_id("userA")
4. element = webDriverwait(driver,10,1).until( lambda x: x.find_element_by_id("userA")
from selenium.webdriver.common.by import By import time from selenium.webdriver.support.wait import WebDriverWait if __name__ == '__main__': driver=webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com/") element=WebDriverWait(driver,10,1).until(lambda x:x.find_element(By.ID,'kw')) element.send_keys('zxn') time.sleep(2) driver.quit()
隱式等待和顯式等待對比
元素個(gè)數(shù)調(diào)用方法異常類型隱式等待全局瀏覽器對象調(diào)用NoSuchElementException顯式等待單個(gè)實(shí)例化對象調(diào)用TimeoutException
四.元素定位
1.常見的元素定位
2.ID定位 By.ID
id屬性在HTML中是唯一的,因此使用id定位可以確保找到頁面上唯一的元素。
由于id是唯一的,瀏覽器在查找元素時(shí)可以快速定位到目標(biāo)元素,提高了定位的效率
例如百度的搜索框的id為kw
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() driver.find_element(By.ID,'kw').send_keys('woshi') driver.find_element(By.ID,'su').click() time.sleep(2)
3.類名定位 By.CLASS_NAME
因?yàn)閕d是唯一的,但是className相同的element是很多的,因此使用find_element顯示是不妥的,但是也是可以使用的,默認(rèn)找到的是第一個(gè)className相同的標(biāo)簽
比如下面的標(biāo)簽,我們通過find_elements,通過className找到值為channel-link的標(biāo)簽(返回的是list集合),然后點(diǎn)擊綜藝標(biāo)簽.
代碼實(shí)現(xiàn)具體如下
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.bilibili.com/") #頁面最大化 driver.maximize_window() driver.find_elements(By.CLASS_NAME,'channel-link')[4].click() time.sleep(2)
注意:如果一個(gè)標(biāo)簽有多個(gè)class(中間用空格隔開),此時(shí)我們只能用單個(gè)class進(jìn)行定位
4.標(biāo)簽名定位 By.TAG_NAME
通過標(biāo)簽名定位元素位置
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.bilibili.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.TAG_NAME,'input').send_keys('zxn') driver.find_elements(By.TAG_NAME,'a')[0] time.sleep(2) driver.close()
5.名稱定位 By.NAME
name屬性通常在表單中有,比如百度的輸入框
注意name也不是唯一的
6.鏈接文本定位 By.LINK_TEXT
使用鏈接(a標(biāo)簽)的全部文字定位元素,比如通過百度頁面的新聞文本進(jìn)行定位
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.LINK_TEXT,'新聞').click() time.sleep(2) driver.close()
7.鏈接部分文本定位 By.PARTIAL_LINK_TEXT
使用鏈接(a標(biāo)簽)的部分文字定位元素,相當(dāng)于模糊匹配,比如下面代碼,模糊匹配文本含'聞'的可點(diǎn)擊文本
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.PARTIAL_LINK_TEXT,'聞').click() time.sleep(2) driver.close()
8.css_selector定位 By.CSS_SELECTOR
選擇器 | 格式 | 示例 | 示例說明 |
標(biāo)簽選擇器 | html標(biāo)簽 | input | 選擇所有<input>元素 |
ID選擇器 | #id屬性值 | #kw | 選擇所有id='kw'的元素 |
類選擇器 | .class屬性值 | .nav-search-input | 選擇所有class='nav-search-input'的元素 |
屬性選擇器 | [屬性名] | [name="wd"] | 選擇所有name等于"wd"的元素 |
組合選擇器 | 標(biāo)簽加屬性描述 | input.s_ipt | 選擇所有class='_ipt'的<input>元素 |
父子關(guān)系 | 元素1>元素2 | div>a | 選擇所有父級是<div>的<a>元素 |
后代關(guān)系 | 元素1 元素2 | div a | 選擇<div>中的所有<a>元素 |
第一子元素 | :first-child | a:first-child | 選擇所有<a>元素且該元素是其父級的第一個(gè)元素 |
最后一個(gè)元素 | :last-child | a:last-child | 選擇所有<a>元素且該元素是其父級的最后一個(gè)元素 |
順序選擇器 | :nth-child(n) | a:nth-child(2) | 選擇所有<a>元素且該元素是其父級的第二個(gè)子元素 |
1. ID選擇器
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('測試') driver.find_element(By.CSS_SELECTOR,'#su').click() time.sleep(2) driver.close()
2.類選擇器
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.bilibili.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.CSS_SELECTOR,'.nav-search-input').send_keys('測試') driver.find_element(By.CSS_SELECTOR,'.nav-search-btn').click() time.sleep(2) driver.close()
3.屬性選擇器
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.CSS_SELECTOR,'[name="wd"]').send_keys('測試') driver.find_element(By.CSS_SELECTOR,'#su').click() time.sleep(2) driver.close()
4.標(biāo)簽選擇器
選擇a標(biāo)簽中href="http://image.baidu.com/"的element
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.CSS_SELECTOR,'a[ rel="external nofollow" ]').click() time.sleep(2) driver.close()
href后面加*表示模糊匹配,此時(shí)href中只要包含 image.baidu即可
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.CSS_SELECTOR,'a[href*="image.baidu"]').click() time.sleep(2) driver.close()
href后面加^表示匹配開頭,結(jié)尾模糊匹配,此時(shí)href中只要開頭為http://image即可
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.CSS_SELECTOR,'a[href^="http://image"]').click() time.sleep(2) driver.close()
href后面加$表示匹配開頭,開頭模糊匹配,此時(shí)href中只要結(jié)尾為image.baidu.com/即可
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.CSS_SELECTOR,'a[href$="image.baidu.com/"]').click() time.sleep(2) driver.close()
5.組合選擇器
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.CSS_SELECTOR,'input.s_ipt').send_keys("測試") driver.find_element(By.CSS_SELECTOR,'#su').click() time.sleep(2) driver.close()
6.父子關(guān)系
可以看到form > span > input總共有兩個(gè)標(biāo)簽,其中一個(gè)為輸入框,一個(gè)為點(diǎn)擊搜索
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_elements(By.CSS_SELECTOR,'form > span > input')[0].send_keys("測試") driver.find_elements(By.CSS_SELECTOR,'form > span > input')[1].click() time.sleep(2) driver.close()
7.后代關(guān)系
當(dāng)我們form input,此時(shí)表示form標(biāo)簽下的所有input標(biāo)簽,不管多少層級,都篩選出來
8.順序選擇器
選擇視頻進(jìn)行點(diǎn)擊,此時(shí)視頻位于第8個(gè)a標(biāo)簽(注意從1開始)
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.CSS_SELECTOR,'div#s-top-left > a:nth-child(6)').click() time.sleep(2) driver.close()
tips:可以通過以下操作進(jìn)行復(fù)制selector進(jìn)行CSS_SELECTOR的便捷操作
9. xpath定位 By.XPATH
說明 | 舉例 |
從根節(jié)點(diǎn)開始選取(絕對路徑) | /html/div/ |
從任意節(jié)點(diǎn)開始選取(相對路徑) | //div,列舉出所有div標(biāo)簽 |
選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) | //input/.. 會選取 input 的父節(jié)點(diǎn) |
選取屬性,或者根據(jù)屬性選取 | |
使用id屬性定位 | //div[@id='id_value'] |
使用class屬性定位 | //a[@class="mnav"] |
使用name屬性定位 | //div[@name='wd'] |
多個(gè)屬性定位 | //input[@name="wd" and @class="s_ipt"] |
第n個(gè)元素,使用index定位 | //div[@id="s-top-left"]/a[3] |
最后一個(gè)元素 | //a[@class="mnav"][last()] |
屬性包含某字段 | //div[contains(@title,'text')] |
屬性以某字段開頭 | //div[starts-with(@title,'text')] |
屬性以某字段結(jié)尾 | //div[ends-with(@title,'text')] |
文本包含 | //a[contains(text(),"網(wǎng)盤")] |
文本等于 | //span[text() = "菜單"] |
同級弟弟元素 | //div[@id=='id']/following-sibling::div |
同級哥哥元素 | //div[@id=='id']/preceding-sibling::div |
因?yàn)楹蚦ss_selector類似,所以不過多演示
from selenium import webdriver from selenium.webdriver.common.by import By import time #實(shí)例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標(biāo)簽只有一個(gè) driver.find_element(By.XPATH,'//div[@id="s-top-left"]/a[3]').click() time.sleep(2) driver.close()
通用的xpath也可以直接進(jìn)行復(fù)制
五.不同元素定位實(shí)戰(zhàn)
可以到此網(wǎng)站進(jìn)行訓(xùn)練:https://iviewui.com/view-ui-plus/component/
1.單選框
現(xiàn)在的需求是將Apple,Android,Window進(jìn)行依次點(diǎn)擊
通過標(biāo)簽屬性進(jìn)行定位
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://iviewui.com/view-ui-plus/component/form/radio") driver.find_elements(By.XPATH,'//input[@type="radio" and @class="ivu-radio-input"]')[1].click() time.sleep(2) driver.find_elements(By.XPATH, '//input[@type="radio" and @class="ivu-radio-input"]')[2].click() time.sleep(2) driver.find_elements(By.XPATH, '//input[@type="radio" and @class="ivu-radio-input"]')[3].click() time.sleep(2) driver.close()
通過文本內(nèi)容進(jìn)行定位:
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://iviewui.com/view-ui-plus/component/form/radio") driver.find_element(By.XPATH,'//span[text()="Apple"]').click() time.sleep(2) driver.find_element(By.XPATH, '//span[text()="Android"]').click() time.sleep(2) driver.find_element(By.XPATH, '//span[text()="Windows"]').click() time.sleep(2) driver.close()
2.多選框
同理
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://iviewui.com/view-ui-plus/component/form/checkbox") driver.find_elements(By.XPATH,'//span[text()="香蕉"]')[0].click() time.sleep(2) driver.find_elements(By.XPATH, '//span[text()="蘋果"]')[0].click() time.sleep(2) driver.find_elements(By.XPATH, '//span[text()="西瓜"]')[0].click() time.sleep(2) driver.close()
3.下拉框
到這個(gè)網(wǎng)址進(jìn)行鍛煉:https://sahitest.com/demo/selectTest.htm
select.select_by_index:
通過option的順序來選擇(從0開始)
from selenium import webdriver from selenium.webdriver.common.by import By import time from selenium.webdriver.support.select import Select if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://sahitest.com/demo/selectTest.htm") time.sleep(2) select=Select(driver.find_element(By.ID,'s1')) select.select_by_index(1) time.sleep(2) driver.close()
select.select_by_value:
通過option的value屬性值來選擇
if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://sahitest.com/demo/selectTest.htm") time.sleep(2) select=Select(driver.find_element(By.ID,'s1')) select.select_by_value("51") time.sleep(2) driver.close()
select.
select_by_visible_text
通過option文本值來選擇
from selenium import webdriver from selenium.webdriver.common.by import By import time from selenium.webdriver.support.select import Select if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://sahitest.com/demo/selectTest.htm") time.sleep(2) select=Select(driver.find_element(By.ID,'s1')) select.select_by_visible_text("Cell Phone") time.sleep(2) driver.close()
4.級聯(lián)選擇器
在網(wǎng)站:https://iviewui.com/view-ui-plus/component/form/cascader
進(jìn)行級聯(lián)選擇器的訓(xùn)練
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://iviewui.com/view-ui-plus/component/form/cascader") driver.find_element(By.XPATH,'//input[@class="ivu-input ivu-input-default"]').click() time.sleep(2) driver.find_element(By.XPATH,'//li[contains(text(),"北京")]').click() time.sleep(2) driver.find_element(By.XPATH, '//li[contains(text(),"故宮")]').click() time.sleep(2) driver.close()
5.日期選擇器
在https://iviewui.com/view-ui-plus/component/form/date-picker
進(jìn)行訓(xùn)練
此時(shí)我們使用的是直接send_keys進(jìn)行操作
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://iviewui.com/view-ui-plus/component/form/date-picker") driver.find_element(By.XPATH,'//input[@class="ivu-input ivu-input-default ivu-input-with-suffix"]').send_keys("2023-12-12") time.sleep(2) driver.find_elements(By.XPATH,'//input[@class="ivu-input ivu-input-default ivu-input-with-suffix"]')[1].send_keys("2023-12-18 - 2024-01-16") time.sleep(2) driver.close()
6.三種彈框
1.alert
進(jìn)行訓(xùn)練
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://sahitest.com/demo/alertTest.htm") driver.find_element(By.NAME,'b1').click() time.sleep(2) print(driver.switch_to.alert.text) driver.switch_to.alert.accept() time.sleep(2) driver.close()
2.confirm
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://sahitest.com/demo/confirmTest.htm") driver.find_element(By.NAME,'b1').click() time.sleep(2) print(driver.switch_to.alert.text) #點(diǎn)擊確定 # driver.switch_to.alert.accept() #點(diǎn)擊取消 driver.switch_to.alert.dismiss() time.sleep(2) driver.close()
3.Prompt
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://sahitest.com/demo/promptTest.htm") driver.find_element(By.NAME,'b1').click() time.sleep(2) driver.switch_to.alert.send_keys("測試") time.sleep(2) #點(diǎn)擊確定 driver.switch_to.alert.accept() #點(diǎn)擊取消 # driver.switch_to.alert.dismiss() time.sleep(2) driver.close()
7.文件上傳
這個(gè)網(wǎng)站:https://sahitest.com/demo/php/fileUpload.htm
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://sahitest.com/demo/php/fileUpload.htm") driver.find_element(By.ID,'file').send_keys(r'C:\Users\lenovo\Desktop\認(rèn)證\阿里云.png') time.sleep(2) driver.find_element(By.NAME,'submit').click() time.sleep(2) driver.close()
8.文件下載
到這個(gè)網(wǎng)站:http://chromedriver.storage.googleapis.com/index.html
from selenium import webdriver from selenium.webdriver.common.by import By import time,os if __name__ == '__main__': chromeOptions=webdriver.ChromeOptions() #設(shè)置下載路徑 prefs={"download.default_directory":r"D:\PythonCave\selenium\file"} chromeOptions.add_experimental_option("prefs",prefs) driver=webdriver.Chrome(chromeOptions) driver.get("http://chromedriver.storage.googleapis.com/index.html") time.sleep(2) driver.find_element(By.XPATH,'/html/body/table/tbody/tr[3]/td[2]/a').click() time.sleep(2) driver.find_element(By.XPATH, '/html/body/table/tbody/tr[7]/td[2]/a').click() time.sleep(2) driver.close()
9.iframe框架
frame是網(wǎng)頁開發(fā)中常見應(yīng)用。例如頁面布局、局部刷新,頁面分割,都是frame的用途表現(xiàn)
使用frame會給用戶帶來非常舒適的使用感受。
frame包括(frameset標(biāo)簽、frame標(biāo)簽、iframe標(biāo)簽)
frameset和frame結(jié)合一起使用,可以對頁面進(jìn)行分割。例如sahitest的Frames Test。對頁面進(jìn)行上下切割,并嵌套html頁面
iframe是個(gè)內(nèi)聯(lián)框架,是在頁面里生成個(gè)內(nèi)部框架??梢郧短锥鄠€(gè)html頁面。大多網(wǎng)頁使用的是iframe框架。比如163郵箱
這個(gè)網(wǎng)站練習(xí):IFRAME Tests
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://sahitest.com/demo/iframesTest.htm") driver.find_element(By.ID,'checkRecord').clear() driver.find_element(By.ID, 'checkRecord').send_keys('wuhu~') time.sleep(2) #用下標(biāo)定位iframe driver.switch_to.frame(0) driver.find_element(By.CSS_SELECTOR, 'a[href="linkTest.htm" rel="external nofollow" rel="external nofollow" ]').click() time.sleep(2) driver.close()
同樣的也可以通過id,name進(jìn)行定位,也可以使用下面的元素定位來進(jìn)行切換
driver.switch_to.frame(driver.find_element(By.XPATH,"/html/body/iframe"))
可以切換到上一級iframe
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.get("https://sahitest.com/demo/iframesTest.htm") driver.find_element(By.ID,'checkRecord').clear() driver.find_element(By.ID, 'checkRecord').send_keys('wuhu~') time.sleep(2) #用下標(biāo)定位iframe driver.switch_to.frame(driver.find_element(By.XPATH,"/html/body/iframe")) driver.find_element(By.CSS_SELECTOR, 'a[href="linkTest.htm" rel="external nofollow" rel="external nofollow" ]').click() driver.switch_to.parent_frame() driver.find_element(By.ID,'checkRecord').clear() driver.find_element(By.ID, 'checkRecord').send_keys('wula~') time.sleep(2) time.sleep(2) driver.close()
也可以直接切換到default_content
driver.switch_to.default_content()
注意:frame之間不能互相切換,只能主頁面和frame之間進(jìn)行切換
10.多窗口切換
在Selenium中封裝了獲取當(dāng)前窗口包柄、獲取所有窗口句柄和切換到指定句柄窗口的方法句柄:
英文handle,窗口的唯一識別碼
方法:
1). driver. current_window_handle -->獲取當(dāng)前窗口句柄2). drhver.window_handles -->獲取所有窗口句柄
3). driver.switch_to.window( handle) -->切換指定句柄窗口
任意一個(gè)窗口都有唯一的一個(gè)句柄值,可以通過句柄值完成窗口切換操作
from selenium import webdriver from selenium.webdriver.common.by import By import time if __name__ == '__main__': driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(10) driver.get("https://www.baidu.com/") driver.find_element(By.CSS_SELECTOR,'a[ rel="external nofollow" ]').click() print('當(dāng)前頁面的句柄值:',driver.current_window_handle) #切換窗口操作 handles=driver.window_handles driver.switch_to.window(handles[-1]) driver.find_element(By.ID,'wd1').send_keys('抗壓背鍋') driver.find_element(By.XPATH,'//*[@id="tb_header_search_form"]/span[1]/a').click() time.sleep(2) driver.quit()
注意:如果關(guān)閉了當(dāng)前頁面,你需要切換到原頁面才能進(jìn)行相應(yīng)的操作,否則會報(bào)錯(cuò)
11.截圖操作
from selenium import webdriver from selenium.webdriver.common.by import By import time,os if __name__ == '__main__': if not os.path.exists('./img'): os.mkdir('./img') driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(10) driver.get("https://www.baidu.com/") driver.find_element(By.ID,'kw').send_keys('woshi') driver.find_element(By.ID,'su').click() time.sleep(2) #推薦使用png #使用時(shí)間戳來標(biāo)記文件,windows系統(tǒng)文件名不支持特殊符號,盡量只是用下劃線 cur_time=time.strftime('%Y%m%d_%H%M%S') driver.get_screenshot_as_file('./img/info_{}.png'.format(cur_time)) driver.quit()
12.驗(yàn)證碼處理
在web應(yīng)用中,大部分系統(tǒng)在用戶登錄注冊的時(shí)候都要求輸入驗(yàn)證碼,而我們在設(shè)計(jì)自動(dòng)化測試腳本的時(shí)候,就需要面臨處理驗(yàn)證碼的問題。
說明: Selenium中并沒有對驗(yàn)證碼處理的方法,在這里我們介紹一下針對驗(yàn)證碼的幾種常用處理方式
方式:
- 去掉驗(yàn)證碼(測試環(huán)境下-采用)
- 設(shè)置萬能驗(yàn)證碼(生產(chǎn)環(huán)境和測試環(huán)境下-采用)
- 驗(yàn)證碼識別技術(shù)(通過Python-tesseract來識別圖片類型驗(yàn)證碼;識別率很難達(dá)到100%)
- 記錄cookie(通過記錄cookie進(jìn)行跳過登錄)
什么是cookie
- Cookie是由web服務(wù)器生成的,并且保存在用戶瀏覽器上的小文本文件,它可以包含用戶相關(guān)的信息。
- Cookie數(shù)據(jù)格式:鍵值對組成(python中的字典)
- Cookie產(chǎn)生:客戶端請求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就向客戶端瀏覽器頒發(fā)一個(gè)Cookie數(shù)據(jù)
- Cookie使用:當(dāng)瀏覽器再次請求該網(wǎng)站時(shí),瀏覽器把請求的數(shù)據(jù)和Cookie數(shù)據(jù)一同提交給服務(wù)器,服務(wù)器檢查該Cookie,以此來辨認(rèn)用戶狀態(tài)。
cookie繞過驗(yàn)證碼登錄的原理:
說明:客戶端登錄賬號后,將登錄狀態(tài)相關(guān)的cookie 信息發(fā)送給服務(wù)器保存,在發(fā)送請求,攜帶的cookie 信息如果和服務(wù)器保留的一致,則服務(wù)器任務(wù)客戶端為登錄狀態(tài)
應(yīng)用場景:
- 實(shí)現(xiàn)會話跟蹤,記錄用戶登錄狀態(tài)
- 實(shí)現(xiàn)記住密碼和自動(dòng)登錄的功能
- 用戶未登錄的狀態(tài)下,記錄購物車中的商品
現(xiàn)在進(jìn)行代碼實(shí)驗(yàn):
字段數(shù)據(jù)的key必須為name和value
from selenium import webdriver import time if __name__ == '__main__': driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(10) driver.get("https://www.baidu.com/") cookie_dict={'name':'BDUSS', 'value':'FNxNDNHTXRNSjNoS0M5SjNHbE9GV0pjTlBHaGJhWjJnZFF3SVhub2VyZXJRNnBsRUFBQUFBJCQAAAAAAAAAAAEAAADzfmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKu2gJlU'} driver.add_cookie(cookie_dict) #刷新頁面,發(fā)送cookie信息給服務(wù)器進(jìn)行驗(yàn)證 driver.refresh() time.sleep(2) driver.quit()
注意:
- 本地瀏覽器中登錄的賬號,不能退出,否則cookie信息過期,需要重新獲取
- 不同項(xiàng)目的能夠進(jìn)行登錄功能繞過的 cookie字段信息都不相同,具體需要詢問開發(fā)
- 利用cookie 繞過登錄,則不能對登錄功能本身進(jìn)行測試
- 個(gè)別項(xiàng)如果想要繞過登錄,有可能需要添加多個(gè)cookie字段
到此這篇關(guān)于基于python的selenium的文章就介紹到這了,更多相關(guān)python的selenium內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
matplotlib階梯圖的實(shí)現(xiàn)(step())
這篇文章主要介紹了matplotlib階梯圖的實(shí)現(xiàn)(step()),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python學(xué)習(xí)之圖片濾鏡效果的實(shí)現(xiàn)
濾鏡效果是圖像處理中常用的一種技術(shù),可以用來增強(qiáng)圖像的視覺效果,實(shí)現(xiàn)不同的效果,本文就來利用Python中的Image模塊實(shí)現(xiàn)常見的幾個(gè)圖片濾鏡吧2023-05-05Python二叉搜索樹與雙向鏈表轉(zhuǎn)換實(shí)現(xiàn)方法
這篇文章主要介紹了Python二叉搜索樹與雙向鏈表轉(zhuǎn)換實(shí)現(xiàn)方法,涉及Python二叉搜索樹的定義、實(shí)現(xiàn)以及雙向鏈表的轉(zhuǎn)換技巧,需要的朋友可以參考下2016-04-04Python設(shè)計(jì)模式之模板方法模式實(shí)例詳解
這篇文章主要介紹了Python設(shè)計(jì)模式之模板方法模式,結(jié)合實(shí)例形式較為詳細(xì)的分析了模板方法模式的概念、原理及Python定義、使用模板方法模式相關(guān)操作技巧,需要的朋友可以參考下2019-01-01Python中l(wèi)ambda的用法及其與def的區(qū)別解析
這篇文章主要介紹了Python中l(wèi)ambda的用法及其與def的區(qū)別解析,需要的朋友可以參考下2014-07-07Django admin實(shí)現(xiàn)TextField字段changelist頁面換行、空格正常顯示
本文主要介紹了Django admin實(shí)現(xiàn)TextField字段changelist頁面換行、空格正常顯示,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01服務(wù)器端jupyter notebook映射到本地瀏覽器的操作
這篇文章主要介紹了服務(wù)器端jupyter notebook映射到本地瀏覽器的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04