Selenium并行啟動多個(gè)瀏覽器
快速上手
如果你對 Selenium 自動化測試已經(jīng)非常熟悉,你僅僅需要一個(gè)快速上手來使程序運(yùn)行起來。本章節(jié)的內(nèi)容能滿足不同的技術(shù)層次,但是如果你僅僅需要一個(gè)可以快速上手的指引,那么就顯得有點(diǎn)多。如果是這樣,你可以參考 Selenium Wiki 的相關(guān)文章。
什么是 Selenium-Grid ?
Selenium-Grid 允許你在多臺機(jī)器的多個(gè)瀏覽器上并行的進(jìn)行測試,也就是說,你可以同時(shí)運(yùn)行多個(gè)測試。本質(zhì)上來說就是,Selenium-Grid 支持分布式的測試執(zhí)行。它可以讓你的測試在一個(gè)分布式的執(zhí)行環(huán)境中運(yùn)行。
何時(shí)需要使用
通常,以下兩種情況你都會需要使用 Selenium-Grid。
在多個(gè)瀏覽器中運(yùn)行測試,在多個(gè)版本的瀏覽器中進(jìn)行測試,或在不同操作系統(tǒng)的瀏覽器中進(jìn)行測試。
減少測試運(yùn)行時(shí)間。
Selenium-Grid 通過使用多臺機(jī)器并行地運(yùn)行測試來加速測試的執(zhí)行過程。例如,如果你有一個(gè)包含100個(gè)測試用例的測試套件,你使用 Selenium-Grid 支持4臺不同的機(jī)器(虛擬機(jī)或?qū)嶓w機(jī)均可)來運(yùn)行那些測試,同僅使用一臺機(jī)器相比,你的測試所需要的運(yùn)行時(shí)間大致為其 1/4。對于大型的測試套件和那些會進(jìn)行大量數(shù)據(jù)校驗(yàn)的需要長時(shí)間運(yùn)行的測試套件來說,這將節(jié)約很多時(shí)間。有些測試套件可能要運(yùn)行好幾小時(shí)。另一個(gè)需要縮短套件運(yùn)行時(shí)間的原因是開發(fā)者檢入(check-in)AUT 代碼后,需要縮短測試的運(yùn)行周期。越來越多的團(tuán)隊(duì)使用敏捷開發(fā),相比整夜整夜的等待測試通過,他們希望盡快地看到測試反饋。
Selenium-Grid 也可以用于支持多執(zhí)行環(huán)境的測試運(yùn)行,典型的,同時(shí)在多個(gè)不同的瀏覽器中運(yùn)行。例如,Grid 的虛擬機(jī)可以安裝測試必須的各種瀏覽器。于是,機(jī)器 1 上有 ie8,機(jī)器 2 上有 ie9,機(jī)器 3 上有最新版的 chrome,而機(jī)器 4 上有最新版的 firefox。當(dāng)測試套件運(yùn)行時(shí),Selenium-Grid 可以使測試在指定的瀏覽器中運(yùn)行,并且接收每個(gè)瀏覽器的運(yùn)行結(jié)果。
另外,我們可以擁有一個(gè)裝有多個(gè)類型和版本都一樣的瀏覽器 Grid。例如,一個(gè) Grid 擁有 4 臺機(jī)器,每臺機(jī)器可以運(yùn)行 3 個(gè) firefox 12 實(shí)例,形成一個(gè) firefox 的服務(wù)農(nóng)場。當(dāng)測試套件運(yùn)行時(shí),每個(gè)傳遞給 Selenium-Grid 的測試都被指派給下一個(gè)可用的 firefox 實(shí)例。通過這種方式,我們可以使得同時(shí)有 12 個(gè)測試在并行的運(yùn)行以完成測試,顯著地縮短了測試完成需要的時(shí)間。
Selenium-Grid 非常靈活。以上兩個(gè)例子可以聯(lián)合起來使用,這樣可以就可以使得不同類型和版本的瀏覽器有多個(gè)可運(yùn)行實(shí)例。使用這樣的配置,既并行地執(zhí)行測試,同時(shí)又可以測試多個(gè)瀏覽器類型和版本。
Selenium-Grid 2.0
Selenium-Grid 2.0 是在編寫本文時(shí)(5/26/2012)已發(fā)布的最新版本。它同版本 1 有很多不同之處。在 2.0 中,Selenium-Grid 和 Selenium-RC 服務(wù)端進(jìn)行了合并。現(xiàn)在,你僅需要下載一個(gè) jar 包就可以獲得它們。
Selenium-Grid 1.0
版本 1 是 Selenium-Grid 的第一個(gè)發(fā)布版本。如果你是一個(gè) Selenium-Grid 新手,你應(yīng)該選擇版本 2 。新版本已經(jīng)在原有基礎(chǔ)上進(jìn)行了更新,頁增加了一些新特性,并且支持 Selenium-WebDriver。一些老的系統(tǒng)可能仍然在使用版本 1.關(guān)于 Selenium-Grid 版本 1 的信息可以參考 Selenium-Grid website
Selenium-Grid 的 Hub 和 Nodes 是如何工作的?
Grid 由一個(gè)中心和一到多個(gè)節(jié)點(diǎn)組成。兩者都是通過 selenium-server.jar 啟動。在接下來的章節(jié)中,我們列出了一些例子。
中心接收要執(zhí)行的測試信息,包括在哪些平臺和瀏覽器執(zhí)行等。它知道每個(gè)注冊了的節(jié)點(diǎn)的配置。根據(jù)測試信息,它會選擇符合需求的節(jié)點(diǎn)進(jìn)行測試。一旦選定了一個(gè)節(jié)點(diǎn),測試腳本就會初始化 Selenium 命令,并且由重心發(fā)送給選定的要運(yùn)行測試的節(jié)點(diǎn)。這個(gè)節(jié)點(diǎn)會啟動瀏覽器,然后在瀏覽器中執(zhí)行這個(gè) AUT 的 Selenium 命令。
我們提供了一些圖標(biāo)來演示其原理。第二張圖標(biāo)是用以說明 Selenium-Grid 1 的,版本 2 也適用并且對于我們的描述是一個(gè)很好的說明。唯一的區(qū)別在于相關(guān)術(shù)語。使用“Selenium-Grid 節(jié)點(diǎn)”替換“Selenium Remote Control”即符合我們對 Selenium-Grid 2 的描述。
下載
下載過程很簡單。從 SeleniumHq 站點(diǎn)的下載頁面下載 Selenium-Server jar 包。你需要的鏈接在“Selenium-Server (以前是 Selenium-RC)”章節(jié)中。
將它存放到任意文件夾中。你需要確保機(jī)器上正確的安裝了 java。如果 java 沒有正常運(yùn)行,檢查你系統(tǒng)的 path 變量是否包含了 java.exe 的路徑。
啟動 Selenium-Grid
由于節(jié)點(diǎn)對中心有依賴,所以你通常需要先啟動一個(gè)中心。這也不是必須的,因?yàn)楣?jié)點(diǎn)可以識別其中心是否已經(jīng)啟動,反之亦然。作為教程,我們建議你先啟動中心,否則會顯示一些錯(cuò)誤信息,你應(yīng)該不會想在第一次使用 Selenium-Grid 的時(shí)候就看到它們。
啟動中心
通過在命令行執(zhí)行以下命令,可以啟動一個(gè)使用默認(rèn)設(shè)置的中心。所有平臺可用,包括 Windows Linux, 或 MacOs 。
java -jar selenium-server-standalone-2.21.0.jar -role hub
我們將在接下來的章節(jié)中解釋各個(gè)參數(shù)。注意,你可能需要修改上述命令中 jar 包的版本號,這取決于你使用的 selenium-server 的版本。
啟動節(jié)點(diǎn)
通過在命令行執(zhí)行以下命令,可以你懂一個(gè)使用默認(rèn)設(shè)置的節(jié)點(diǎn)。
java -jar selenium-server-standalone-2.21.0.jar -role node -hub http://localhost:4444/grid/register
該操作假設(shè)中心是使用默認(rèn)設(shè)置啟動的。中心用于監(jiān)聽請求使用的默認(rèn)端口號為 4444,這就是為什么端口 4444 被用于中心 url 中。同時(shí)“localhost”假定你的節(jié)點(diǎn)和中心運(yùn)行在同一臺機(jī)器上。對于新手來說,這是最簡單的方式。如果要在兩臺不同的機(jī)器上運(yùn)行中心和節(jié)點(diǎn),只需要將“localhost”替換成中心所在機(jī)器的 hostname 即可。
警告: 確保運(yùn)行中心和節(jié)點(diǎn)的機(jī)器均已關(guān)閉防火墻,否則你將看到一個(gè)連接錯(cuò)誤。
配置 Selenium-Grid
默認(rèn)配置
JSON 配置文件
通過命令行選項(xiàng)配置
中心配置
通過指定 -role hub 即以默認(rèn)設(shè)置啟動中心:
java -jar selenium-server-standalone-2.21.0.jar -role hub
你將看到以下日志輸出:
Jul 19, 2012 10:46:21 AM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a selenium grid server
2012-07-19 10:46:25.082:INFO:osjs.Server:jetty-7.x.y-SNAPSHOT
2012-07-19 10:46:25.151:INFO:osjsh.ContextHandler:started o.s.j.s.ServletContextHandler{/,null}
2012-07-19 10:46:25.185:INFO:osjs.AbstractConnector:Started SocketConnector@0.0.0.0:4444
指定端口
中心默認(rèn)使用的端口是 4444 。這是一個(gè) TCP/IP 端口,被用于監(jiān)聽客戶端,即自動化測試腳本到 Selenium-Grid 中心的連接。如果你電腦上的另一個(gè)應(yīng)用已經(jīng)占用這個(gè)接口,或者你已經(jīng)啟動了一個(gè) Selenium-Server,你將看到以下輸出:
10:56:35.490 WARN - Failed to start: SocketListener0@0.0.0.0:4444
Exception in thread "main" java.net.BindException: Selenium is already running on port 4444. Or some other service is.
如果看到這個(gè)信息,你可以關(guān)掉在使用端口 4444 的進(jìn)程,或者告訴 Selenium-Grid 使用一個(gè)別的端口來啟動中心。-port 選項(xiàng)用于修改中心的端口:
java -jar selenium-server-standalone-2.21.0.jar -role hub -port 4441
即使已經(jīng)有一個(gè)中心運(yùn)行在這臺機(jī)器上,只要它們不使用同一個(gè)端口,就能正常工作。
你可能想知道哪個(gè)進(jìn)程使用了 4444 端口,這樣你就可以讓中心使用這個(gè)默認(rèn)端口。使用以下命令可以查看你機(jī)器上所有運(yùn)行程序使用的端口:
netstat -a
Unix/Linux, MacOs 和 Windows 均支持此命令,只是在 Windows 中 -a 參數(shù)為必須的。基本上,你需要顯示進(jìn)程 id 和端口。在 Unix 中,你可以通過管道 “grep” 輸出那些你關(guān)心的端口相關(guān)的條目。
節(jié)點(diǎn)配置
時(shí)間參數(shù)
獲取命令行幫助
Selenium-Server 提供了一個(gè)可選項(xiàng)列表,每個(gè)選項(xiàng)都有一個(gè)簡短的描述。目前(2012夏),命令行幫助還有一些奇怪,但是如果你知道如何去找、如何解讀信息會對你很有幫助。
Selenium-Server 提供了兩種不同的功能,Selenium-RC server 和 Selenium-Grid。它們是兩個(gè)不同的團(tuán)隊(duì)編寫的,所以每個(gè)功能的命令行幫助被放置在不同的地方。因此,對于新手來說,在初次使用任意一個(gè)功能時(shí),幫助都不是那么顯而易見。
如果你僅傳遞一個(gè) -h 選項(xiàng),你將看到 Selenium-RC Server 的可選項(xiàng)而不是 Selenium-Grid 的。
java -jar selenium-server-standalone-2.21.0.jar -h
上述代碼將顯示 Selenium-RC server 選項(xiàng)。如果你想看到 Selenium-Grid 的命令行幫助,你需要先使用 -hub 或 -node 選項(xiàng)告訴 Selenium-Server 你想看的是關(guān)于 Selenium-Grid 的,然后再追加 -h 選項(xiàng)。
java -jar selenium-server-standalone-2.21.0.jar -role node -h
對于這個(gè)問題,你還可以給 -role node 傳遞一個(gè)垃圾參數(shù):
java -jar selenium-server-standalone-2.21.0.jar -role node xx
你將先看到 “INFO...” 和一個(gè) “ERROR”,在其后你將看到 Selenium-Grid 的命令行選項(xiàng)。我們沒有列出這個(gè)命令的所有輸出,因?yàn)樗鼘?shí)在太長了,這個(gè)輸出的最初幾行看起來如下:
Jul 19, 2012 10:10:39 AM org.openqa.grid.selenium.GridLauncher main INFO: Launching a selenium grid node org.openqa.grid.common.exception.GridConfigurationException: You need to specify a hub to register to using -hubHost X -hubPort 5555. The specified config was -hubHost null -hubPort 4444 at org.openqa.grid.common.RegistrationRequest.validate(RegistrationRequest.java:610) at org.openqa.grid.internal.utils.SelfRegisteringRemote.startRemoteServer(SelfRegisteringRemote.java:88) at org.openqa.grid.selenium.GridLauncher.main(GridLauncher.java:72) Error building the config :You need to specify a hub to register to using -hubHost X -hubPort 5555. The specified config was -hubHost null -hubPort 4444 Usage : -hubConfig: (hub) a JSON file following grid2 format. -nodeTimeout: (node) <XXXX> the timeout in seconds before the hub automatically ends a test that hasn't had aby activity than XX sec.The browser will be released for another test to use.This typically takes care of the client crashes. |
常見錯(cuò)誤
Unable to acess the jarfile
Unable to access jarfile selenium-server-standalone-2.21.0.jar
無論是啟動中心還是節(jié)點(diǎn)都有可能產(chǎn)生這個(gè)錯(cuò)誤。這意味著 java 無法找到 selenium-server jar 包。你需要從 selenium-server-XXXX.jar 文件存放在目錄運(yùn)行命令或者指定 jar 包的完整路徑。
posted on 2014-11-06 10:03 順其自然EVO 閱讀(4559) 評論(0) 編輯 收藏 所屬分類: selenium and watir webdrivers 自動化測試學(xué)習(xí)