基于python的selenium全網最新超詳細教程
一.安裝
安裝WebDriver
查看chrome版本號,設置-幫助-關于Google chrome,找到版本號。
可以到這個網站進行下載對應版本的chromedriver,如果chrome瀏覽器版本過高,可以下載最新版的chromedriver進行使用 Chrome for Testing availability
下載下來之后,將chromedriver.exe放到安裝的Python環(huán)境的文件夾內
終端輸入chromedriver -version驗證
必要的話,可以重啟電腦,可能進行編寫完代碼進行啟動的過程很慢,可以耐心等待一段時間,基本上都是可以運行的
二.源碼分析
- 首先啟動WebDriver并綁定特定端口開啟Web服務,當作Remote Server
- Client 首次請求會創(chuàng)建1個Session,向remote server發(fā)送HTTP請求啟動瀏覽器,Remote Server解析請求,完成相應操作并返回response
- 啟動瀏覽器后,Client Cookie攜帶session id,再次給Remote Server發(fā)送HTTP請求操作瀏覽器,定位頁面元素等等
- 解析response,判斷腳本是否繼續(xù)還是結束
三.webdriver操作方法
1.元素操作
click()點擊事件 clear()清空事件 send_keys()輸入事件
拿百度舉例,我們可以現在搜索輸入框中清空數據(clear),然后輸入數據(send_keys),最后點擊按鈕進行跳轉(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) 設置瀏覽器窗口大小-->設置瀏覽器寬、高(像素點)
3. set_window_position(x, y) 設置瀏覽器窗口位置-->設置瀏覽器位置
4. back() 后退-->模擬瀏覽器后退按鈕
5. forward() 前進-->模擬瀏覽器前進按鈕
6. refresh() 刷新-->模擬瀏覽器F5刷新
7. close() 關閉當前窗口-->模擬點擊瀏覽器關閉按鈕
8. quit() 關閉瀏覽器驅動對象-->關閉所有程序啟動的窗口
9. title 獲取頁面title
10. current_url 獲取當前頁面URL
可以根據以下的代碼進行理解
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() 關閉當前窗口-->模擬點擊瀏覽器關閉按鈕 關閉單個頁面
注意:當打開新的頁面時,close方法關閉的是原頁面
比如下面的代碼,打開了百度的頁面,之后點擊百度地圖頁面,打開了一個新的標簽頁,close方法關閉了百度頁面,而,百度地圖頁面并沒有被關閉
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() 關閉瀏覽器驅動對象-->關閉所有程序啟動的窗口 #關閉所有的頁面
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") 獲取屬性值,傳遞的參數為元素的屬性名4. is_displayed() 判斷元素是否可見
5. is_enabled() 判斷元素是否可用
6. is_selected() 判斷元素是否選中,用來檢查復選框或單選按鈕是否被選中
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.鼠標操作
常見的鼠標操作有:點擊、右擊、雙擊、懸停、拖拽等,對于這些鼠標操作Selenium都封裝了相應的操作方法。
說明:在Selenium中將操作鼠標的方法封裝在ActionChains類中
實例化對象:
action =ActionChains(driver)方法:
1. context_click(element) 右擊-->模擬鼠標右鍵點擊效果
2. double_click(element) 雙擊--〉模擬鼠標雙擊效果
3. drag_and_drop(source,target) 拖動--〉模擬鼠標拖動效果4. move_to_element(element) 懸停-->模擬鼠標懸停效果
5. perform() 執(zhí)行-->此方法用來執(zhí)行以上所有鼠標操作
為了更好的學習其他方法,我們先學習perform()執(zhí)行方法,因為所有的方法都需要執(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()
其他的操作都類似,注意懸停鼠標操作的時候不要動鼠標
也可以直接perform操作
action=ActionChains(driver) action.move_to_element(driver.find_element(By.ID,'s-usersetting-top')).perform()
5.鍵盤操作
導包: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 ') 復制(Ctrl+C)
下面是一個示例代碼
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.元素等待
概念:在定位頁面元素時如果未找到,會在指定時間內一直等待的過程
元素等待的類型: 1.隱式等待2.顯示等待
1.隱式等待
概念:定位元素時,如果能定位到元素則直接返回該元素,不觸發(fā)等待;如果不能定位到該元素,則間隔一段時間后再去定位元素;如果在達到最大時長時還沒有找到指定元素,則拋出元素不存在的異常NoSuchElementException 。
方法: driver. implicitly_wait(timeout)
(timeout:為等待最大時長,單位:秒)
說明:隱式等待為全局設置(只需要設置一次,就會作用于所有元素)
注意:當隱式等待被激活時,雖然目標元素已經出現了,但是還是會由于當前頁面內的其他元素的未加載完成,而繼續(xù)等待,進而增加代碼的執(zhí)行時長
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.顯式等待
概念:定位指定元素時,如果能定位到元素則直接返回該元素,不觸發(fā)等待:如果不能定位到該元素,則間隔一段時間后再去定位元素;如果在達到最大時長時還沒有找到指定元素,則拋出超時異常TimeoutException 。
在Selenium中把顯式等待的相關方法封裝在WebDriverWait類中
1.導包等待類--> from selenium. webdriver. support.wait import webDriverWait
2. webDriverWait(driver,timeout, poll_frequency=o.5)
driver:瀏覽器驅動對象
timeout:超時的時長,單位:秒
poll_frequency:檢測間隔時間,默認為0.5秒
3.調用方法until(method):直到...時method:函數名稱,該函數用來實現對元素的定位
一般使用匿名函數來實現: 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()
隱式等待和顯式等待對比
元素個數調用方法異常類型隱式等待全局瀏覽器對象調用NoSuchElementException顯式等待單個實例化對象調用TimeoutException
四.元素定位
1.常見的元素定位
2.ID定位 By.ID
id屬性在HTML中是唯一的,因此使用id定位可以確保找到頁面上唯一的元素。
由于id是唯一的,瀏覽器在查找元素時可以快速定位到目標元素,提高了定位的效率
例如百度的搜索框的id為kw
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化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
因為id是唯一的,但是className相同的element是很多的,因此使用find_element顯示是不妥的,但是也是可以使用的,默認找到的是第一個className相同的標簽
比如下面的標簽,我們通過find_elements,通過className找到值為channel-link的標簽(返回的是list集合),然后點擊綜藝標簽.
代碼實現具體如下
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化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)
注意:如果一個標簽有多個class(中間用空格隔開),此時我們只能用單個class進行定位
4.標簽名定位 By.TAG_NAME
通過標簽名定位元素位置
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.bilibili.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 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標簽)的全部文字定位元素,比如通過百度頁面的新聞文本進行定位
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 driver.find_element(By.LINK_TEXT,'新聞').click() time.sleep(2) driver.close()
7.鏈接部分文本定位 By.PARTIAL_LINK_TEXT
使用鏈接(a標簽)的部分文字定位元素,相當于模糊匹配,比如下面代碼,模糊匹配文本含'聞'的可點擊文本
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 driver.find_element(By.PARTIAL_LINK_TEXT,'聞').click() time.sleep(2) driver.close()
8.css_selector定位 By.CSS_SELECTOR
選擇器 | 格式 | 示例 | 示例說明 |
標簽選擇器 | html標簽 | input | 選擇所有<input>元素 |
ID選擇器 | #id屬性值 | #kw | 選擇所有id='kw'的元素 |
類選擇器 | .class屬性值 | .nav-search-input | 選擇所有class='nav-search-input'的元素 |
屬性選擇器 | [屬性名] | [name="wd"] | 選擇所有name等于"wd"的元素 |
組合選擇器 | 標簽加屬性描述 | input.s_ipt | 選擇所有class='_ipt'的<input>元素 |
父子關系 | 元素1>元素2 | div>a | 選擇所有父級是<div>的<a>元素 |
后代關系 | 元素1 元素2 | div a | 選擇<div>中的所有<a>元素 |
第一子元素 | :first-child | a:first-child | 選擇所有<a>元素且該元素是其父級的第一個元素 |
最后一個元素 | :last-child | a:last-child | 選擇所有<a>元素且該元素是其父級的最后一個元素 |
順序選擇器 | :nth-child(n) | a:nth-child(2) | 選擇所有<a>元素且該元素是其父級的第二個子元素 |
1. ID選擇器
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 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 #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.bilibili.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 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 #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 driver.find_element(By.CSS_SELECTOR,'[name="wd"]').send_keys('測試') driver.find_element(By.CSS_SELECTOR,'#su').click() time.sleep(2) driver.close()
4.標簽選擇器
選擇a標簽中href="http://image.baidu.com/"的element
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 driver.find_element(By.CSS_SELECTOR,'a[ rel="external nofollow" ]').click() time.sleep(2) driver.close()
href后面加*表示模糊匹配,此時href中只要包含 image.baidu即可
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 driver.find_element(By.CSS_SELECTOR,'a[href*="image.baidu"]').click() time.sleep(2) driver.close()
href后面加^表示匹配開頭,結尾模糊匹配,此時href中只要開頭為http://image即可
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 driver.find_element(By.CSS_SELECTOR,'a[href^="http://image"]').click() time.sleep(2) driver.close()
href后面加$表示匹配開頭,開頭模糊匹配,此時href中只要結尾為image.baidu.com/即可
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 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 #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 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.父子關系
可以看到form > span > input總共有兩個標簽,其中一個為輸入框,一個為點擊搜索
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 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.后代關系
當我們form input,此時表示form標簽下的所有input標簽,不管多少層級,都篩選出來
8.順序選擇器
選擇視頻進行點擊,此時視頻位于第8個a標簽(注意從1開始)
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 driver.find_element(By.CSS_SELECTOR,'div#s-top-left > a:nth-child(6)').click() time.sleep(2) driver.close()
tips:可以通過以下操作進行復制selector進行CSS_SELECTOR的便捷操作
9. xpath定位 By.XPATH
說明 | 舉例 |
從根節(jié)點開始選取(絕對路徑) | /html/div/ |
從任意節(jié)點開始選取(相對路徑) | //div,列舉出所有div標簽 |
選取當前節(jié)點的父節(jié)點 | //input/.. 會選取 input 的父節(jié)點 |
選取屬性,或者根據屬性選取 | |
使用id屬性定位 | //div[@id='id_value'] |
使用class屬性定位 | //a[@class="mnav"] |
使用name屬性定位 | //div[@name='wd'] |
多個屬性定位 | //input[@name="wd" and @class="s_ipt"] |
第n個元素,使用index定位 | //div[@id="s-top-left"]/a[3] |
最后一個元素 | //a[@class="mnav"][last()] |
屬性包含某字段 | //div[contains(@title,'text')] |
屬性以某字段開頭 | //div[starts-with(@title,'text')] |
屬性以某字段結尾 | //div[ends-with(@title,'text')] |
文本包含 | //a[contains(text(),"網盤")] |
文本等于 | //span[text() = "菜單"] |
同級弟弟元素 | //div[@id=='id']/following-sibling::div |
同級哥哥元素 | //div[@id=='id']/preceding-sibling::div |
因為和css_selector類似,所以不過多演示
from selenium import webdriver from selenium.webdriver.common.by import By import time #實例化webdriver driver=webdriver.Chrome() driver.get("https://www.baidu.com/") #頁面最大化 driver.maximize_window() #input標簽只有一個 driver.find_element(By.XPATH,'//div[@id="s-top-left"]/a[3]').click() time.sleep(2) driver.close()
通用的xpath也可以直接進行復制
五.不同元素定位實戰(zhàn)
可以到此網站進行訓練:https://iviewui.com/view-ui-plus/component/
1.單選框
現在的需求是將Apple,Android,Window進行依次點擊
通過標簽屬性進行定位
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()
通過文本內容進行定位:
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.下拉框
到這個網址進行鍛煉: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.級聯選擇器
在網站:https://iviewui.com/view-ui-plus/component/form/cascader
進行級聯選擇器的訓練
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
進行訓練
此時我們使用的是直接send_keys進行操作
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
進行訓練
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) #點擊確定 # driver.switch_to.alert.accept() #點擊取消 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) #點擊確定 driver.switch_to.alert.accept() #點擊取消 # driver.switch_to.alert.dismiss() time.sleep(2) driver.close()
7.文件上傳
這個網站: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\認證\阿里云.png') time.sleep(2) driver.find_element(By.NAME,'submit').click() time.sleep(2) driver.close()
8.文件下載
到這個網站: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() #設置下載路徑 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是網頁開發(fā)中常見應用。例如頁面布局、局部刷新,頁面分割,都是frame的用途表現
使用frame會給用戶帶來非常舒適的使用感受。
frame包括(frameset標簽、frame標簽、iframe標簽)
frameset和frame結合一起使用,可以對頁面進行分割。例如sahitest的Frames Test。對頁面進行上下切割,并嵌套html頁面
iframe是個內聯框架,是在頁面里生成個內部框架??梢郧短锥鄠€html頁面。大多網頁使用的是iframe框架。比如163郵箱
這個網站練習: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) #用下標定位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進行定位,也可以使用下面的元素定位來進行切換
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) #用下標定位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之間進行切換
10.多窗口切換
在Selenium中封裝了獲取當前窗口包柄、獲取所有窗口句柄和切換到指定句柄窗口的方法句柄:
英文handle,窗口的唯一識別碼
方法:
1). driver. current_window_handle -->獲取當前窗口句柄2). drhver.window_handles -->獲取所有窗口句柄
3). driver.switch_to.window( handle) -->切換指定句柄窗口
任意一個窗口都有唯一的一個句柄值,可以通過句柄值完成窗口切換操作
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('當前頁面的句柄值:',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()
注意:如果關閉了當前頁面,你需要切換到原頁面才能進行相應的操作,否則會報錯
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 #使用時間戳來標記文件,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.驗證碼處理
在web應用中,大部分系統(tǒng)在用戶登錄注冊的時候都要求輸入驗證碼,而我們在設計自動化測試腳本的時候,就需要面臨處理驗證碼的問題。
說明: Selenium中并沒有對驗證碼處理的方法,在這里我們介紹一下針對驗證碼的幾種常用處理方式
方式:
- 去掉驗證碼(測試環(huán)境下-采用)
- 設置萬能驗證碼(生產環(huán)境和測試環(huán)境下-采用)
- 驗證碼識別技術(通過Python-tesseract來識別圖片類型驗證碼;識別率很難達到100%)
- 記錄cookie(通過記錄cookie進行跳過登錄)
什么是cookie
- Cookie是由web服務器生成的,并且保存在用戶瀏覽器上的小文本文件,它可以包含用戶相關的信息。
- Cookie數據格式:鍵值對組成(python中的字典)
- Cookie產生:客戶端請求服務器,如果服務器需要記錄該用戶狀態(tài),就向客戶端瀏覽器頒發(fā)一個Cookie數據
- Cookie使用:當瀏覽器再次請求該網站時,瀏覽器把請求的數據和Cookie數據一同提交給服務器,服務器檢查該Cookie,以此來辨認用戶狀態(tài)。
cookie繞過驗證碼登錄的原理:
說明:客戶端登錄賬號后,將登錄狀態(tài)相關的cookie 信息發(fā)送給服務器保存,在發(fā)送請求,攜帶的cookie 信息如果和服務器保留的一致,則服務器任務客戶端為登錄狀態(tài)
應用場景:
- 實現會話跟蹤,記錄用戶登錄狀態(tài)
- 實現記住密碼和自動登錄的功能
- 用戶未登錄的狀態(tài)下,記錄購物車中的商品
現在進行代碼實驗:
字段數據的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信息給服務器進行驗證 driver.refresh() time.sleep(2) driver.quit()
注意:
- 本地瀏覽器中登錄的賬號,不能退出,否則cookie信息過期,需要重新獲取
- 不同項目的能夠進行登錄功能繞過的 cookie字段信息都不相同,具體需要詢問開發(fā)
- 利用cookie 繞過登錄,則不能對登錄功能本身進行測試
- 個別項如果想要繞過登錄,有可能需要添加多個cookie字段
到此這篇關于基于python的selenium的文章就介紹到這了,更多相關python的selenium內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python中l(wèi)ambda的用法及其與def的區(qū)別解析
這篇文章主要介紹了Python中l(wèi)ambda的用法及其與def的區(qū)別解析,需要的朋友可以參考下2014-07-07Django admin實現TextField字段changelist頁面換行、空格正常顯示
本文主要介紹了Django admin實現TextField字段changelist頁面換行、空格正常顯示,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01服務器端jupyter notebook映射到本地瀏覽器的操作
這篇文章主要介紹了服務器端jupyter notebook映射到本地瀏覽器的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04