背景
公司內(nèi)部的Selenium Grid服務(wù)基本都是我?guī)兔Υ罱ㄔ赪in服務(wù)機(jī)器上,使用我的或者admin賬號(hào)運(yùn)行了hub和node節(jié)點(diǎn),那么當(dāng)別的團(tuán)隊(duì)使用Selenium Grid時(shí),如果想查看腳本現(xiàn)在執(zhí)行頁(yè)面情況,經(jīng)常需要找我遠(yuǎn)程鏈接幫忙查看具體頁(yè)面情況,那個(gè)煩!!再加上公司安全性管控較嚴(yán)個(gè)人賬號(hào)也是絕對(duì)不允許同事間分享,全公司的Chrome都是IT推送升級(jí),這樣我就得經(jīng)常去更新node節(jié)點(diǎn)上ChromeDriver的版本,那個(gè)煩煩!
更坑的是,我們所用的電腦都是木有admin權(quán)限,而且Chrome很多功能都加入了admin管理,例如安裝本地插件等都需要admin權(quán)限才能安裝。 而且大家都知道,ChromDriver在2.28(如果我沒記錯(cuò)的話)版本后,啟動(dòng)Chrome都會(huì)本地加載一個(gè)Automation extensions,那么這時(shí)如果你執(zhí)行腳本啟動(dòng)瀏覽器一定會(huì)報(bào)一個(gè)權(quán)限錯(cuò)誤,盡管我們申請(qǐng)了win服務(wù)機(jī)器的admin權(quán)限,也申請(qǐng)了IT把這些機(jī)器排除在管控范圍外,然而。。。呵呵噠,總之煩煩煩!
所以我就默默決定找個(gè)時(shí)間,找個(gè)替代方案,一來(lái)解決腳本執(zhí)行時(shí),可以非常便捷而且不限制用戶的查看服務(wù)器瀏覽器情況,二來(lái)避免IT管控引起的各種問題。
方案確定
經(jīng)過(guò)幾天折騰和比較,最后決定搭建兩套開源方案,供不同項(xiàng)目組不同需求使用。
方案1:Selenoid
方案2:Zalenium
下面簡(jiǎn)單演示兩套方案的搭建和基本使用,并最后列出和Selenium Grid的比較
Selenoid
Selenoid 簡(jiǎn)介
Selenoid是一個(gè)使用Go語(yǔ)言來(lái)實(shí)現(xiàn)的Selenium Gird。它通過(guò)Docker來(lái)啟動(dòng)瀏覽器。
GitHub: https://github.com/aerokube/selenoid
官方幫助文檔: http://aerokube.com/selenoid/latest/#_getting_started
Selenoid 的搭建
Docker 安裝
簡(jiǎn)介中知道是通過(guò)Docker來(lái)啟動(dòng)瀏覽器的,所以如果機(jī)器上沒有docker,需要先安裝docker,安裝步驟和簡(jiǎn)單使用詳細(xì)見:
http://www.lxweimin.com/p/4bc3f8ece55d
https://docs.docker.com/engine/installation/
Selenoid 搭建過(guò)程我們需要用到Selenoid 和Selenoid UI,所以我們需要下載這兩個(gè)的images。
說(shuō)明:
Selenoid UI 是Selenoid 的一個(gè)簡(jiǎn)單頁(yè)面,通過(guò)頁(yè)面可以查看到時(shí)時(shí)狀態(tài)。
GitHub: https://github.com/aerokube/selenoid-ui
官方幫助文檔:http://aerokube.com/selenoid-ui/latest/
docker pull 相關(guān)鏡像:
$ docker pull aerokube/selenoid-ui
$ docker pull aerokube/selenoid
$ docker pull selenoid/video-recorder
$ docker pull selenoid/vnc:firefox_58.0
其中selenoid/video-recorder 用于錄屏,selenoid/vnc:firefox_58.0為有VNC,火狐58版本的鏡像,如果想獲取更多支持的瀏覽器:
http://aerokube.com/selenoid/latest/#_browser_image_information
編寫browsers.json 文件:
如下新建個(gè)browsers.json文件,配上你已經(jīng)下載的瀏覽器版本的鏡像,并放于宿主機(jī)的 /data/selenoid/config/ 路徑下。
{
"chrome": {
"default": "64.0",
"versions": {
"64.0": {
"image": "selenoid/vnc:chrome_64.0",
"port": "4444",
"path": "/"
}
}
},
"firefox": {
"default": "59.0",
"versions": {
"59.0": {
"image": "selenoid/vnc:firefox_59.0",
"port": "4444",
"path": "/wd/hub"
}
}
},
"phantomjs":{
"default": "2.1.1",
"versions": {
"2.1.1": {
"image": "selenoid/phantomjs:2.1.1",
"port": "4444",
"path": "/"
}
}
}
}
啟動(dòng):selenoid
執(zhí)行如下命令:
docker run -d --name selenoid \
-p 14444:4444 \
-v /data/selenoid/:/etc/selenoid/ \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/selenoid/video/:/data/selenoid/video/ \
-e OVERRIDE_VIDEO_OUTPUT_DIR=/data/selenoid/video/ \
--privileged aerokube/selenoid:latest \
-conf /etc/selenoid/config/browsers.json -limit 10 -video-output-dir /data/selenoid/video/
selenoid命令支持以下配置:
-capture-driver-logs
是否向Selenoid輸出添加驅(qū)動(dòng)程序日志
-conf String
瀏覽器配置文件(默認(rèn)為“config / browsers.json”)
-container -network String
用于容器的網(wǎng)絡(luò)(默認(rèn)為“default”)
-cpu value
容器cpu限制為float,例如0.2或1.0
-disable-docker
禁用docker 支持
-disable-privileged
是否禁用特權(quán)容器模式
-disable-queue
禁用等待隊(duì)列
-enable-file-upload
文件上傳支持
-limit int
同時(shí)容器運(yùn)行(默認(rèn)5)
-listen string
網(wǎng)絡(luò)地址接受連接(默認(rèn)為“4444”)
-log-conf string
字符串容器日志記錄配置文件(默認(rèn)為“config / container-logs.json”)-
-mem value
容器內(nèi)存限制,例如128m或1g
-retry-count int
新會(huì)話嘗試重試計(jì)數(shù)(默認(rèn)值為1)
-service-startup-timeout duration
服務(wù)啟動(dòng)超時(shí)時(shí)間。持續(xù)格式(默認(rèn)為30秒)
-session-attempt-timeout持續(xù)時(shí)間
新會(huì)話嘗試超時(shí)time.Duration格式(默認(rèn)30秒)
-session-delete-timeout duration
會(huì)話刪除超時(shí)時(shí)間。持續(xù)格式(默認(rèn)30秒)
-timeout duration
持續(xù)時(shí)間會(huì)話空閑超時(shí)時(shí)間。持續(xù)格式(默認(rèn)1m0s)
-version
顯示版本并退出
-video-output-dir String
將錄制視頻保存到(默認(rèn)“video”)的目錄
-video-recorder-image string
用作錄像機(jī)的images(默認(rèn)為“selenoid / video-recorder”)
啟動(dòng):selenoid-ui:
docker run -d --name selenoid-ui -p 8080:8080 aerokube/selenoid-ui --selenoid-uri http://${SELENOID_HOST}:4444
編寫測(cè)試腳本
public void test6666() throws MalformedURLException, InterruptedException {
DesiredCapabilities capabilities = new DesiredCapabilities();
// 設(shè)置要啟動(dòng)的瀏覽器
capabilities.setBrowserName("chrome");
// 設(shè)置要啟動(dòng)的瀏覽器版本
capabilities.setVersion("64.0");
// 設(shè)置是否實(shí)時(shí)查看 默認(rèn)false
capabilities.setCapability("enableVNC", true);
// 設(shè)置是否錄制視頻 默認(rèn)false
capabilities.setCapability("enableVideo", true);
// 設(shè)置錄制視頻名稱,可選,默認(rèn)值為session ID
capabilities.setCapability("videoName", "name");
// 設(shè)置測(cè)試名稱 可選
capabilities.setCapability("name", "BOTeam");
// 設(shè)置時(shí)區(qū) 可選
capabilities.setCapability("timeZone", "Asia/Shanghai");
// 設(shè)置標(biāo)簽名,用于標(biāo)識(shí) 可選
capabilities.setCapability("labels", "botest");
RemoteWebDriver driver = new RemoteWebDriver(
URI.create("http://localhost:14444/wd/hub").toURL(),
capabilities
);
driver.manage().window().setSize(new Dimension(1980, 1080));
driver.get("http://www.google.com");
System.out.println(driver.getTitle());
Thread.sleep(20000);
driver.getWindowHandle();
driver.quit();
}
實(shí)時(shí)查看
打開selenoid-ui 界面:http://localhost:8080。
查看錄制的視頻
打開:http://localhost:14444/video/,選擇視頻并查看
查看使用統(tǒng)計(jì)
添加瀏覽器
如果當(dāng)前瀏覽器已經(jīng)無(wú)法滿足需求,可以手動(dòng)需要添加瀏覽器,添加步驟如下:
- docker pull 需要的瀏覽器版本
- 修改browsers.json文件
- 重啟 selenoid
Zalenium
Zalenium 簡(jiǎn)介
Zalenium 是一個(gè)Selenium Grid的擴(kuò)展,同樣帶有視頻錄制,實(shí)時(shí)預(yù)覽,基本認(rèn)證和儀表盤等功能。也是使用docker-selenium在本地運(yùn)行Firefox和Chrome中的測(cè)試,如果需要不同的瀏覽器,可以把測(cè)試重定向到云測(cè)提供商(Sauce Labs,BrowserStack,TestingBot)。 Zalenium也可以在Kubernetes中使用。
github:https://github.com/zalando/zalenium
官網(wǎng):https://zalando.github.io/zalenium/
Zalenium 安裝
Zalenium 安裝前也得先安裝Dcoker引擎,而且官方給了版本限制必須Docker Version >=1.11.1。
docker pull 相關(guān)鏡像:
$ docker pull elgalu/selenium
$ docker pull dosel/zalenium
啟動(dòng)Zalenium
Docker 執(zhí)行如下面命令:
docker run -ti --name zalenium -p 4444:4444 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp/videos:/home/seluser/videos \
--privileged dosel/zalenium start --timeZone "Asia/Shanghai"
--timeZone "Asia/Shanghai" : 表示設(shè)置啟動(dòng)的容器的時(shí)區(qū)為上海時(shí)間,更多時(shí)區(qū)查看:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
/tmp/videos :為視頻保存的宿主機(jī)路徑
更多配置參數(shù)
名稱 | 默認(rèn)值 | 描述 |
---|---|---|
--desiredContainers |
2 | 啟動(dòng)時(shí)創(chuàng)建的node/容器的數(shù)量。 |
--maxDockerSeleniumContainers |
10 | Docker-selenium 同時(shí)運(yùn)行的容器的最大數(shù)量。 |
--sauceLabsEnabled |
false | 是否啟動(dòng)Sauce Labs節(jié)點(diǎn)。 |
--browserStackEnabled |
false | 是否啟動(dòng)BrowserStack節(jié)點(diǎn)。 |
--testingbotEnabled |
false | 是否啟動(dòng)TestingBot節(jié)點(diǎn)。 |
--startTunnel |
false | 當(dāng)啟用云測(cè)試平臺(tái)時(shí),啟動(dòng)隧道以允許進(jìn)行本地測(cè)試。請(qǐng)參閱每個(gè)提供商的文檔以了解使用情況和所需的Selenium功能。[Sauce Labs][BrowserStack][TestingBot]創(chuàng)建隧道時(shí)使用的本地標(biāo)識(shí)符是zalenium 。 |
--videoRecordingEnabled |
true | 設(shè)置是否在每次測(cè)試中錄制視頻。 |
--screenWidth |
1920 | 設(shè)置屏幕寬度。 |
--screenHeight |
1080 | 設(shè)置屏幕高度。 |
--timeZone |
“Europe/Berlin" | 設(shè)置容器中的時(shí)區(qū)。更多https://en.wikipedia.org/wiki/List_of_tz_database_time_zones |
--debugEnabled |
假 | 啟用LogLevel.FINE。 |
--seleniumImageName |
“elgalu /selenium” | 啟用覆蓋要使用的Docker-selenium 鏡像。 |
--gridUser |
- | 允許指定用戶啟用基本身份驗(yàn)證保護(hù)。--gridPassword 也必須提供。 |
--gridPassword |
- | 允許指定密碼以啟用基本身份驗(yàn)證保護(hù)。--gridUser 也必須提供。 |
--maxTestSessions |
1 | 每個(gè)容器執(zhí)行的最大測(cè)試數(shù)量。 |
--keepOnlyFailedTests |
false | 只保存失敗測(cè)試的視頻(您需要發(fā)送包含測(cè)試結(jié)果的cookie)。 |
編寫測(cè)試腳本
@Test
public void test1() throws MalformedURLException, InterruptedException {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setBrowserName("chrome");
String className = this.getClass().getName();
String an = className + Thread.currentThread().getStackTrace()[1].getMethodName();
// 設(shè)置錄制視頻name (可選)
capabilities.setCapability("name", "testName");
// 設(shè)置構(gòu)建名 (可選)
capabilities.setCapability("build", "BOTeam");
// 啟動(dòng)容器的時(shí)區(qū) (可選)
capabilities.setCapability("timeZone", "Asia/Shanghai");
RemoteWebDriver driver = new RemoteWebDriver(
URI.create("http://localhost:4444/wd/hub").toURL(),
capabilities
);
driver.manage().window().maximize();
driver.get("http://www.google.com");
System.out.println(driver.getTitle());
driver.getWindowHandle();
Thread.sleep(20000);
driver.quit();
}
實(shí)時(shí)查看
打開http://localhost:4444/grid/admin/live,我們可以看到如下,可以通過(guò)VNC查看到瀏覽器執(zhí)行腳本情況。
查看錄制的視頻和log日志
打開:http://localhost:4444/dashboard/#
簡(jiǎn)單對(duì)比
對(duì)比項(xiàng) | Selenium Grid | Selenoid | Zalenium |
---|---|---|---|
實(shí)時(shí)預(yù)覽 | N | Y | Y |
錄屏 | N | Y | Y |
多版本瀏覽器 | Y | Y | N (取決于Zalenium的版本)當(dāng)然可以搭建多個(gè)版本的zalenium |
多瀏覽器 | Y | Y | N (除Chrome和Firefox外,其余需要用云服務(wù)) |
log回溯 | Y(但及其不方便) | N | Y |
搭建難度 | 簡(jiǎn)單 | 復(fù)雜 | 簡(jiǎn)單 |
資源自動(dòng)回收 | N | Y | Y |