文章來源:公衆號-智能化IT系統。css
轉載自:https://www.cnblogs.com/xtary/p/9528147.htmlhtml
一. Selenium Webdriver技術介紹python
1. 簡介linux
selenium Webdriver是一套針對不一樣瀏覽器而開發的web應用自動化測試代碼庫。使用這套庫能夠進行頁面的交互操做,而且能夠重複地在不一樣瀏覽器上進行各類測試操做。git
以python爲例,在cmd輸入python-m pip install selenium --upgrade pip進行安裝。github
2. 特色web
-
開源免費後端
-
支持多種語言:Java、Python、Ruby、C#、JavaScript、C++等。瀏覽器
-
直接讓測試工具調用瀏覽器和操做系統自己提供的內置方法,以此繞過JavaScript環境的沙盒限制。服務器
-
支持多種瀏覽器。包括:Chrome、ie6-十一、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所有升級到新版本。
公衆號-智能化IT系統。每週都有技術文章推送,包括原創技術乾貨,以及技術工做的心得分享。掃描下方關注。