做過selenium自動化項目的同學應該都遇到過這樣的問題:測試用例太多,運行速度過慢導致團隊成員怨聲載道。
於是便有了selenium grid和多線程運行selenium測試用例的方法。這些方法各有利弊這里就不一一列舉了。但總的來說,如果瀏覽器運行的速度足夠快,那么多線程並發時的用例執行速度應該是可以滿足實際項目需求的。
再想象一下這樣的情景:如果你手頭的機器是沒有gui的(這是可能的,我以前的幾台centos的server根本就沒有ui),如何在這樣的headless的機器上運行selenium用例呢?
答案是可以用selenium自帶的HtmlUnitDriver。不過可惜的是HtmlUnitDriver對js的支持不是特別完美,所以該方案可行但是不完善,不是特別適合用於真實項目。
好在現在有了phantomjs和ghostdriver,我們可以用ghostdriver來運行selenium測試用例。所有的用例都是在沒有gui的瀏覽器里運行,運行速度可以得到極大的提升。再加上phantomjs是基於webkit的,所以ghostdriver完全可以模擬chrome和safari的行為。
在我的macbookpro上,chromedriver的表現不是特別令人滿意,而我又沒有安裝firefox和safari driver,所以對於一般的頁面(js交互不是特別多的頁面),我都是用ghost driver在調試問題,快速而簡便。最主要是沒有真實的瀏覽器彈出來,不會像chromedriver那樣經常意外退出造成內存泄漏,也不會像firefox那樣運行緩慢。
下面簡單介紹一下ghost driver 與selenium合體的過程。
背景知識
下面的內容要求你已經成功的安裝好python的selenim binding。如果你有pip,直接運行 pip install selenium
即可。如果被牆,請使用豆瓣源。
或者成功的安裝好ruby的watir-webdriver。如果你有gem,直接運行 gem install watir-webdriver
即可。如果被牆,請使用淘寶源。
安裝ghost driver
ghost driver現在已經跟phantomjs合體,所以安裝好最新版本的phantomjs就等於安裝好了ghostdriver。
在這里下載對應平台的phantomjs。
-
首先解壓下載好的zip文件或tar文件(linux only);
-
windows用戶將解壓過后的得到的phantomjs.exe文件加入系統的PATH中。簡單點說如果你使用pyhon,就把phantomjs.exe放到python的安裝目錄下,ruby用戶放到ruby/bin目錄下;
-
mac和linux用戶可以把解壓后得到的phantomjs建個軟鏈到/usr/local/bin目錄下。
ln -s /where/is/phantomjs /usr/local/bin/phantomjs
;
快速開始
python用戶新建itest.py文件然后敲入下面的內容
from selenium import webdriver
dr = webdriver.PhantomJS('phantomjs')
dr.get('http://baidu.info')
print dr.title
print dr.current_url
dr.quit()
watir-webdriver用戶新建文件itest.rb然后敲入下面的內容
require 'watir-webdriver'
b = Watir::Browser.new :phantomjs
b.goto 'www.baidu.com'
puts b.title
puts b.url
b.close
討論
-
ghostdriver盡管對js的支持是不錯的,但是如果你的頁面上js交互過多的話,ghostdriver是會繳械投降的;
-
用ghostdriver+selenium的語法可以做一些不錯的爬蟲;
-
用java用戶請使用maven下載java的ghostdriver binding;
-
當頁面上有flash播放器時,phantom可能會萌萌噠的卡在那里一動不動;
-
ghostdriver基於phantomjs,phantomjs可以做爬蟲,簡單的性能測試,ui自動化測試和其他一些工作;
-
由於沒有ui,當測試發生錯誤的時候調試的工作量就會變大;
看不到運行的過程,心中惶恐不安怎么辦
答案是截圖拯救人員,截圖拯救世界。
運行到關鍵的節點或步驟時截個圖,即方便了調試又使你的測試擁有足夠多的輸出,一舉兩得何樂不為?
python代碼
from selenium import webdriver
dr = webdriver.PhantomJS('phantomjs')
dr.get('http://baidu.info')
print dr.title
print dr.current_url
dr.save_screenshot('./baidu.png')
dr.quit()
ruby代碼
require 'watir-webdriver'
b = Watir::Browser.new :phantomjs
b.goto 'www.baidu.com'
puts b.title
puts b.url
b.driver.save_screenshot('./baidu.jpg')
b.close