1. 程式人生 > >Selenium2.0介紹--Selenium Grid,並行啟動多個瀏覽器.

Selenium2.0介紹--Selenium Grid,並行啟動多個瀏覽器.

當你寫的selenium的case數達到幾十個之後,它的執行時間慢慢的可能就會成為你的一塊心病——慢!

怎麼辦呢?很顯然,最有效的降低執行時間就是並行來執行這些case啊。並行執行case需要兩個條件,缺一不可。

1. 在執行case端,需要並行的執行。例如寫一個多執行緒/多程序來同時執行多個case。
2. 在Selenium Server端,也要並行的開啟多個瀏覽器視窗,並且各個瀏覽器視窗之間互不干擾

對於#1,如果是使用JUnit來執行cases,可以使用maven的一個外掛:surefire
對於#2,selenium的解決方案是Selenium Grid

在Selenium2.0之前,Selenium Grid是獨立提供服務的。自2.0之後,Selenium Grid被整合到了Selenium Server中了(包含在selenium-server-standalone-.jar中)。

先理解一下Grid是如何工作的?一圖勝千言:

Selenium Grid裡面有兩種角色:Hub和Node。Hub(集線器)是接收所有的請求,然後它會將請求分發給不同的Node,Node來實際驅動瀏覽器。

1. 啟動Grid
使用Selenium Grid與普通的Selenium Server的區別在於是否帶上了-role引數。

# 啟動Selenium Server
java –jar selenium-server-standalone-2.22.0.jar -port 4444

# 啟動Selenium Grid的Hub
java –jar selenium-server-standalone-2.22.0.jar -port 4000 -role hub

# 啟動Selenium Grid的Node,其中的-hub引數,是Selenium Grid的Hub的URL
java -jar selenium-server-standalone-2.22.0.jar -port 4001 -role node -hub http://127.0.0.1:4000/grid/register

#顯然,可以啟動多個Node:
java -jar selenium-server-standalone-2.22.0.jar -port 4002 -role node -hub http://127.0.0.1:4000/grid/register

java -jar selenium-server-standalone-2.22.0.jar -port 4003 -role node -hub

http://127.0.0.1:4000/grid/register

......

2. 客戶端的呼叫
對於Selenium Grid,客戶端Selenium test的開發也是完全和Selenium Server一樣的。不過考慮到並行執行,需要儘量避免tests之間的依賴。

3. 啟動Grid的一些重要選項

-host: 如果您的本機只有一個IP地址(ipconfig /all),基本上可以忽略這個選項。如果本機還有其他的IP地址(如多網絡卡、或安裝過虛擬機器、或使用了VPN等),那最好是指定一個正確的IP地址(能夠讓Selenium Hub訪問到的IP地址)。

-browser:這個選項是其help幫助中(java -jar selenium-server-standalone.jar -help)是沒有的。它的作用是指定這個Node支援了哪些瀏覽器、平臺、可以啟動幾個瀏覽器例項等。它是可以重複指定的。例如:-browser browserName=chrome,maxInstances=1 -browser browserName=firefox -browser browserName="internet explorer",其含義是本Node支援啟動一個Chrome瀏覽器,啟動默認個數的Firefox(默認個數是5),啟動默認個數的IE(默認個數 是1)

4. 啟動Grid的批處理指令碼示例

當需要啟動多個Grid Node的時候,想寫一個簡單的批處理檔案來實現它,發現比想象的要複雜一些,幾經周折(MS-DOS批處理的語法真的難用),下面的程式碼可以參考一下:

file=D:\selenium\selenium-standalone.jar

set port_start=5555
set num=2

start java -jar %file% -port 4000 -role hub

for /l %%i in (1 1 %num%) do (
call:mystart %%i %port_start%
)

goto:eof

:mystart
set /a port=%1+%2

start java -Dwebdriver.chrome.driver=d:\selenium\chromedriver.exe -jar %file% -port %port% -role node -hub http://127.0.0.1:4000/grid/register

rem 等待2秒。原因是selenium grid使用啟動時間作為sessionid的一部分,如果是同時啟動,會導致兩個selenium node的session id重複的。
ping 127.0.0.1 -n 3