【自動化測試&爬蟲系列】Selenium Webdriver 介紹
一. Selenium Webdriver技術介紹
1. 簡介
selenium Webdriver是一套針對不同瀏覽器而開發的web應用自動化測試程式碼庫。使用這套庫可以進行頁面的互動操作,並且可以重複地在不同瀏覽器上進行各種測試操作。
以python為例,在cmd輸入python-m pip install selenium --upgrade pip進行安裝。
2. 特點
開源免費
支援多種語言:Java、Python、Ruby、C#、JavaScript、C++等。
直接讓測試工具呼叫瀏覽器和作業系統本身提供的內建方法,以此繞過JavaScript環境的沙盒限制。
支援多種瀏覽器。包括:Chrome、ie6-11、Firefox大部分版本、Mac作業系統的Safari預設版本、Opera、HtmlUnit、Android手機作業系統的預設瀏覽器、iOS手機作業系統的預設瀏覽器。
3. 實現原理
如圖,測試指令碼作為客戶端,在執行指令碼的時候,
呼叫瀏覽器各自的webdriver(如Firefox的geckodriver)並建立session
webdriver啟動瀏覽器,並繫結某埠成為Webdriver的Remote Server(作為服務端)
測試指令碼傳送基於selenium自己設計的The WebDriverWire Protocol協議的命令請求到Remote Server(這套協議幾乎可以操作瀏覽器做任何事情,如開啟、關閉、最大化、最小化、元素定位、元素點選、上傳檔案等。)
Remote Server將Web Service的命令轉化成瀏覽器native的呼叫,在瀏覽器中
4. 基本的元素定位方式
根據上述的實現原理,可知用selenium對瀏覽器進行頁面操作的關鍵就是定位出頁面上相應的元素,然後傳送基於selenium自己設計的The WebDriver Wire Protocol協議的命令請求。
瀏覽器中,按F12或者各個瀏覽器提供的開發者工具,可檢視頁面元素。
Selenium提供了八種定位方式:
--id定位
§用法:find_element_by_id(“id對應的值”)
--name定位
§用法:find_element_by_name(“name對應的值”)
--class定位
§用法:find_element_by_class_name(“class對應的值”)
--tag定位
§用法:find_element_by_tag_name(“tag對應的值”)
--link定位(用於定位文字連結)
§用法:find_element_by_link_text(“連結的文字內容”)
--partial link定位(link定位的補充,可取連結部分文字內容進行定位)
§用法:find_element_by_partial_link_text(“連結的部分文字內容”)
--XPath定位
§用法:find_element_by_xpath(“xpath的值,可選中元素後,滑鼠右鍵複製xpath”)
--CSS定位
§用法:find_element_by_css_selector(“CSS路徑,同樣可選中元素後,滑鼠右鍵複製CSS路徑”)
還可以用By定位元素(其實就是8種定位方法的另一種較靈活的寫法):
--統一呼叫find_element()方法,通過By來宣告定位方法(前面提到的8中定位方法),並傳入對應定位方法的定位引數。
§用法:find_element(By.定位方法,“定位引數”)
e.g. find_element(By.ID,“txtAcc”)
二. Linux伺服器環境部署注意事項
桌面環境使用Selenium預設會開啟瀏覽器介面,但是如果要部署到無桌面環境的伺服器環境,使用普通方法沒法執行Selenium。解決方法有:
使用HtmlUnitDriver或者PhantomJSDriver
使用XVFB(X virtual frame buffer)虛擬顯示伺服器,不需要藉助任何顯示裝置,在記憶體中執行所有的圖形操作。
本文采用安裝Xvfb的方式。部署步驟如下:
1. 安裝pyvirtualdisplay
pip install pyvirtualdisplay
2. 安裝Xvfb(作為後端)
yum install xorg-x11-server-Xvfb
3. 安裝Firefox
cd /usr/local
Wget https://ftp.mozilla.org/pub/firefox/releases/56.0.2/linux-x86_64/en-US/firefox-56.0.2.tar.bz2
tar xjvf firefox-56.0.2.tar.bz2
ln -s /usr/local/firefox/firefox /usr/bin/firefox
4. 下載geckodriver
wget https://github.com/mozilla/geckodriver/releases/download/v0.19.1/geckodriver-v0.19.1-linux64.tar.gz
5. 解壓geckodriver-v0.19.1-linux64.tar.gz
tar xvzf geckodriver-*.tar.gz
6. 在環境變數目錄/usr/bin/中新增geckodriver的硬連結
ln -s /usr/local/geckodriver /usr/bin/geckodriver
7. 測試指令碼中新增程式碼
匯入Display模組
from pyvirtualdisplay import Display
在建立webdriver例項前,設定Display環境變數。visible傳0表示使用Xvfb作為後端,size傳的引數就是設定瀏覽器頁面大小。
Display = Display(visible=0, size=(1280, 1024))
啟動虛擬顯示服務
Display.start()
執行完用例後,關閉瀏覽器後,也需要終止Xvfb程序。
display.sendstop() # 先發送SIGTERM訊號給Xvfb,讓Xvfb自行了斷,如果Xvfb程序還在,則繼續傳送SIGKILL強制結束Xvfb程序。
部署時可能遇到的坑:
1. 執行webdriver.Firefox()後等待很久報錯並退出,顯示selenium.common.exceptions.WebDriverException: Message: other os error:
可能是版本不相容,可以把firefox,geckodriver以及selenium全部升級到新版本。