Selenium 是最廣泛使用的開源 Web UI(用戶界面)自動化測試套件之一。Selenium 支持的語言包括C#,Java,Perl,PHP,Python 和 Ruby。目前,Selenium Web 驅動程序最受 Python 和 C#歡迎。 Selenium 測試腳本可以使用任何支持的編程語言進行編碼,并且可以直接在大多數現代 Web 瀏覽器中運行。在爬蟲領域 selenium 同樣是一把利器,能夠解決大部分的網頁的反爬問題,但也不是萬能的,它最明顯的缺點就是速度慢。下面就進入正式的 study 階段。
打開 cmd,輸入下面命令進行安裝。
pip install -i https://pypi.douban.com/simple selenium
執(zhí)行后,使用 pip show selenium
查看是否安裝成功。
針對不同的瀏覽器,需要安裝不同的驅動。下面列舉了常見的瀏覽器與對應的驅動程序下載鏈接,部分網址需要 “科學上網” 才能打開哦(ffffdd)。
這里以安裝 Chrome
驅動作為演示,同時也推薦大家使用 Chrome
,別的瀏覽器有些方面有些不足。
在新標簽頁輸入 chrome://settings/
進入設置界面,然后選擇 【關于 Chrome】
查看自己的版本信息。這里我的版本是94,這樣在下載對應版本的 Chrome
驅動即可。
打開 Chrome驅動 。單擊對應的版本。
根據自己的操作系統,選擇下載。
下載完成后,壓縮包內只有一個exe文件。
將 chromedriver.exe
保存到任意位置,并把當前路徑保存到環(huán)境變量中(我的電腦>>右鍵屬性>>高級系統設置>>高級>>環(huán)境變量>>系統變量>>Path),添加的時候要注意不要把path變量給覆蓋了,如果覆蓋了千萬別關機,然后百度。添加成功后使用下面代碼進行測試。
from selenium import webdriver# Chrome瀏覽器driver = webdriver.Chrome()
使用 selenium
定位頁面元素的前提是你已經了解基本的頁面布局及各種標簽含義,當然如果之前沒有接觸過,現在我也可以帶你簡單的了解一下。
以我們熟知的 CSDN 為例,我們進入首頁,按 F12 進入開發(fā)者工具。紅框中顯示的就是頁面的代碼,我們要做的就是從代碼中定位獲取我們需要的元素。
想要定位并獲取頁面中的信息,首先要使用 webdriver
打開指定頁面,再去定位。
from selenium import webdriver# Chrome瀏覽器driver = webdriver.Chrome()driver.get("https://www.csdn.net/")
執(zhí)行上面語句后會發(fā)現,瀏覽器打開 CSDN 主頁后會馬上關閉,想要防止瀏覽器自動關閉,可以添加下面代碼。
# 不自動關閉瀏覽器option = webdriver.ChromeOptions()option.add_experimental_option("detach", True)
這樣將上面的代碼組合再打開瀏覽器就不會自動關閉了。
下面我們再來看看幾種常見的頁面元素定位方式。
標簽的 id
具有唯一性,就像人的身份證,假設有個 input
標簽如下。
<input id="toolbar-search-input" autocomplete="off" type="text" value="" placeholder="C++難在哪里?">
我們可以通過 id
定位到它,由于 id
的唯一性,我們可以不用管其他的標簽的內容。
driver.find_element_by_id("toolbar-search-input")
name
指定標簽的名稱,在頁面中可以不唯一。假設有個 meta
標簽如下
<meta name="keywords" content="CSDN博客,CSDN學院,CSDN論壇,CSDN直播">
我們可以使用 find_element_by_name
定位到 meta
標簽。
driver.find_element_by_name("keywords")
class
指定標簽的類名,在頁面中可以不唯一。假設有個 div
標簽如下
<div class="toolbar-search-container">
我們可以使用 find_element_by_class_name
定位到 div
標簽。
driver.find_element_by_class_name("toolbar-search-container")
每個 tag
往往用來定義一類功能,所以通過 tag
來識別某個元素的成功率很低,每個頁面一般都用很多相同的 tag
,比如:/
、/
等。這里還是用上面的 div
作為例子。
<div class="toolbar-search-container">
我們可以使用 find_element_by_class_name
定位到 div
標簽。
driver.find_element_by_tag_name("div")
xpath
是一種在 XML
文檔中定位元素的語言,它擁有多種定位方式,下面通過實例我們看一下它的幾種使用方式。
<html> <head>...<head/> <body> <div id="csdn-toolbar"> <div class="toolbar-inside"> <div class="toolbar-container"> <div class="toolbar-container-left">...div> <div class="toolbar-container-middle"> <div class="toolbar-search onlySearch"> <div class="toolbar-search-container"> <input id="toolbar-search-input" autocomplete="off" type="text" value="" placeholder="C++難在哪里?">
根據上面的標簽需要定位 最后一行 input
標簽,以下列出了四種方式,xpath
定位的方式多樣并不唯一,使用時根據情況進行解析即可。
# 絕對路徑(層級關系)定位driver.find_element_by_xpath( "/html/body/div/div/div/div[2]/div/div/input[1]")# 利用元素屬性定位driver.find_element_by_xpath( "http://*[@id="toolbar-search-input"]"))# 層級+元素屬性定位driver.find_element_by_xpath( "http://div[@id="csdn-toolbar"]/div/div/div[2]/div/div/input[1]")# 邏輯運算符定位driver.find_element_by_xpath( "http://*[@id="toolbar-search-input" and @autocomplete="off"]")
CSS
使用選擇器來為頁面元素綁定屬性,它可以較為靈活的選擇控件的任意屬性,一般定位速度比 xpath
要快,但使用起來略有難度。
CSS
選擇器常見語法:
方法 | 例子 | 描述 |
---|---|---|
.class | .toolbar-search-container | 選擇 class = "toolbar-search-container" 的所有元素 |
#id | #toolbar-search-input | 選擇 id = "toolbar-search-input" 的元素 |
* | * | 選擇所有元素 |
element | input | 選擇所有 元素 |
element>element | div>input | 選擇父元素為 的所有 元素 |
element+element | div+input | 選擇同一級中在 之后的所有 元素 |
[attribute=value] | type="text" | 選擇 type = "text" 的所有元素 |
舉個簡單的例子,同樣定位上面實例中的 input
標簽。
driver.find_element_by_css_selector("#toolbar-search-input")driver.find_element_by_css_selector("html>body>div>div>div>div>div>div>input")
link
專門用來定位文本鏈接,假如要定位下面這一標簽。
<div class="practice-box" data-v-04f46969="">加入!每日一練div>
我們使用 find_element_by_link_text
并指明標簽內全部文本即可定位。
driver.find_element_by_link_text("加入!每日一練")
partial_link
翻譯過來就是“部分鏈接”,對于有些文本很長,這時候就可以只指定部分文本即可定位,同樣使用剛才的例子。
<div class="practice-box" data-v-04f46969="">加入!每日一練div>
我們使用 find_element_by_partial_link_text
并指明標簽內部分文本進行定位。
driver.find_element_by_partial_link_text("加入")
from selenium import webdriver# Chrome瀏覽器driver = webdriver.Chrome()driver.get("https://www.csdn.net/")# 設置瀏覽器瀏覽器的寬高為:600x800driver.set_window_size(600, 800)
使用 maximize_window()
方法可以實現瀏覽器全屏顯示。
from selenium import webdriver# Chrome瀏覽器driver = webdriver.Chrome()driver.get("https://www.csdn.net/")# 設置瀏覽器瀏覽器的寬高為:600x800driver.maximize_window()
webdriver
提供 back
和 forward
方法來實現頁面的后退與前進。下面我們 ①進入CSDN首頁,②打開CSDN個人主頁,③back
返回到CSDN首頁,④ forward
前進到個人主頁。
from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome()# 訪問CSDN首頁driver.get("https://www.csdn.net/")sleep(2)#訪問CSDN個人主頁driver.get("https://blog.csdn.net/qq_43965708")sleep(2)#返回(后退)到CSDN首頁driver.back()sleep(2)#前進到個人主頁driver.forward()
細心的讀者會發(fā)現第二次 get()
打開新頁面時,會在原來的頁面打開,而不是在新標簽中打開。如果想的話也可以在新的標簽頁中打開新的鏈接,但需要更改一下代碼,執(zhí)行 js
語句來打開新的標簽。
# 在原頁面打開driver.get("https://blog.csdn.net/qq_43965708")# 新標簽中打開js = "window.open("https://blog.csdn.net/qq_43965708")"driver.execute_script(js)
在一些特殊情況下我們可能需要刷新頁面來獲取最新的頁面數據,這時我們可以使用 refresh()
來刷新當前頁面。
# 刷新頁面driver.refresh()
在很多時候我們都需要用到窗口切換,比如:當我們點擊注冊按鈕時,它一般會打開一個新的標簽頁,但實際上代碼并沒有切換到最新頁面中,這時你如果要定位注冊頁面的標簽就會發(fā)現定位不到,這時就需要將實際窗口切換到最新打開的那個窗口。我們先獲取當前各個窗口的句柄,這些信息的保存順序是按照時間來的,最新打開的窗口放在數組的末尾,這時我們就可以定位到最新打開的那個窗口了。
# 獲取打開的多個窗口句柄windows = driver.window_handles# 切換到當前最新打開的窗口driver.switch_to.window(windows[-1])
webdriver中的常見操作有:
方法 | 描述 |
---|---|
send_keys() | 模擬輸入指定內容 |
clear() | 清除文本內容 |
is_displayed() | 判斷該元素是否可見 |
get_attribute() | 獲取標簽屬性值 |
size | 返回元素的尺寸 |
text | 返回元素文本 |
接下來還是用 CSDN 首頁為例,需要用到的就是搜素框和搜索按鈕。通過下面的例子就可以氣息的了解各個操作的用法了。
from selenium import webdriverdriver = webdriver.Chrome()driver.get("https://www.csdn.net/")sleep(2)# 定位搜索輸入框text_label = driver.find_element_by_xpath("http://*[@id="toolbar-search-input"]")# 在搜索框中輸入 Dream丶Killertext_label.send_keys("Dream丶Killer")sleep(2)# 清除搜索框中的內容text_label.clear()# 輸出搜索框元素是否可見print(text_label.is_displayed())# 輸出placeholder的值print(text_label.get_attribute("placeholder"))# 定位搜索按鈕button = driver.find_element_by_xpath("http://*[@id="toolbar-search-button"]/span")# 輸出按鈕的大小print(button.size)# 輸出按鈕上的文本print(button.text)"""輸出內容Truepython面試100問{"height": 32, "width": 28}搜索"""
在webdriver 中,鼠標操作都封裝在ActionChains類中,常見方法如下:
方法 | 描述 |
---|---|
click() | 單擊左鍵 |
context_click() | 單擊右鍵 |
double_click() | 雙擊 |
drag_and_drop() | 拖動 |
move_to_element() | 鼠標懸停 |
perform() | 執(zhí)行所有ActionChains中存儲的動作 |
模擬完成單擊鼠標左鍵的操作,一般點擊進入子頁面等會用到,左鍵不需要用到ActionChains。
# 定位搜索按鈕button = driver.find_element_by_xpath("http://*[@id="toolbar-search-button"]/span")# 執(zhí)行單擊操作button.click()
鼠標右擊的操作與左擊有很大不同,需要使用ActionChains。
from selenium.webdriver.common.action_chains import ActionChains# 定位搜索按鈕button = driver.find_element_by_xpath("http://*[@id="toolbar-search-button"]/span")# 右鍵搜索按鈕ActionChains(driver).context_click(button).perform()
模擬鼠標雙擊操作
# 定位搜索按鈕button = driver.find_element_by_xpath("http://*[@id="toolbar-search-button"]/span")# 執(zhí)行雙擊動作ActionChains(driver).double_click(button).perform()
模擬鼠標拖動操作,該操作有兩個必要參數,
# 定位要拖動的元素source = driver.find_element_by_xpath("xxx")# 定位目標元素target = driver.find_element_by_xpath("xxx")# 執(zhí)行拖動動作ActionChains(driver).drag_and_drop(source, target).perform()
模擬懸停的作用一般是為了顯示隱藏的下拉框,比如 CSDN 主頁的收藏欄,我們看一下效果。
# 定位收藏欄collect = driver.find_element_by_xpath("http://*[@id="csdn-toolbar"]/div/div/div[3]/div/div[3]/a")# 懸停至收藏標簽處ActionChains(driver).move_to_element(collect).perform()
webdriver中Keys類幾乎提供了鍵盤上的所有按鍵方法,我們可以使用send_keys + Keys實現輸出鍵盤上的組合按鍵如“Ctrl + C”、“Ctrl + V”等。
# 定位輸入框并輸入文本driver.find_element_by_id("xxx").send_keys("Dream丶killer")# 模擬回車鍵進行跳轉(輸入內容后) driver.find_element_by_id("xxx").send_keys(Keys.ENTER)# 使用 Backspace 來刪除一個字符driver.find_element_by_id("xxx").send_keys(Keys.BACK_SPACE)# Ctrl + A 全選輸入框中內容driver.find_element_by_id("xxx").send_keys(Keys.CONTROL, "a")# Ctrl + C 復制輸入框中內容driver.find_element_by_id("xxx").send_keys(Keys.CONTROL, "c")# Ctrl + V 粘貼輸入框中內容driver.find_element_by_id("xxx").send_keys(Keys.CONTROL, "v")
其他常見鍵盤操作:
操作 | 描述 |
---|---|
Keys.F1 | F1鍵 |
Keys.SPACE | 空格 |
Keys.TAB | Tab鍵 |
Keys.ESCAPE | ESC鍵 |
Keys.ALT | Alt鍵 |
Keys.SHIFT | Shift鍵 |
Keys.ARROW_DOWN | 向下箭頭 |
Keys.ARROW_LEFT | 向左箭頭 |
Keys.ARROW_RIGHT | 向右箭頭 |
Keys.ARROW_UP | 向上箭頭 |
未完待續(xù)~
??往期精彩,不容錯過??
總結篇
??兩萬字,50個pandas高頻操作【圖文并茂,值得收藏】??
??吐血總結《Mysql從入門到入魔》,圖文并茂(建議收藏)??
工具篇
??Python實用小工具之制作酷炫二維碼(有界面、附源碼)??
??Python實用工具之制作證件照(有界面、附源碼)??
??女朋友桌面文件雜亂無章?氣得我用Python給她做了一個文件整理工具??
更多有趣的文章及干貨,盡在
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/121155.html
摘要:耗時代碼運行到這句之后觸發(fā)隱式等待,在輪詢檢查后仍然沒有定位到元素,拋出異常。耗時值得一提的是,對于定位不到元素的時候,從耗時方面隱式等待和強制等待沒什么區(qū)別。 ...
本文是為了幫大家快速回顧了測試中知識點,這套面試手冊整整花了一個月的時間整理出來,上傳到Git上目前star數達到了27K+。內容涵蓋了諸多技術棧的面試題和答案,相信可以幫助大家在最短的時間內用作面試復習,能達到事半功倍效果。 同時用XMind畫了一張導圖記錄軟件測試的學習筆記,有需要的朋友,幫作者關注點贊收藏三連一下,即可無償下載一份! 測試開發(fā)手冊完整版PDF??? 軟件測試核心知識點目錄內容...
年輕人都會犯的3個職場錯誤,你有幾個? 測試人員如何才能快速成長? 軟件測試行業(yè),去大公司還是小公司好? 同學們可以用這 10 道題目,找到自己的薄弱點,對癥下藥哦。 我的建議是:你們可以拿出紙筆,寫下這 10 道題的答案,然后再與文末的答案進行對照~ 選擇題 1. (單選)當需要對某個系統進行測試的時候,應該從哪些方面來設計測試用例? A. 功能驗證 B. 性能相關的驗證 C. 兼容性相關的驗...
摘要:我是布小禪,一枚自學萌新,跟著我每天進步一點點吧說了這么多暫時也就夠了,那么就告辭吧 文章目錄 ?? 前言 ??? 作者簡介 ??文件操作?1??、open函數...
摘要:難在哪里根據上面的標簽需要定位最后一行標簽,以下列出了四種方式,定位的方式多樣并不唯一,使用時根據情況進行解析即可。加入每日一練我們使用并指明標簽內全部文本即可定位。 ...
閱讀 1952·2021-11-23 09:51
閱讀 1094·2021-10-08 10:05
閱讀 3700·2021-09-26 09:55
閱讀 1186·2021-09-22 15:21
閱讀 1759·2021-09-09 09:33
閱讀 1570·2019-08-30 15:56
閱讀 1413·2019-08-30 15:55
閱讀 1103·2019-08-30 13:19