【自動化測試&爬蟲系列】Selenium Webdriver

文章來源:公衆號-智能化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系統。每週都有技術文章推送,包括原創技術乾貨,以及技術工做的心得分享。掃描下方關注。

相關文章
相關標籤/搜索