Selenoid VS Zalenium VS Selenium Grid

背景

公司內(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

1.gif

查看錄制的視頻

打開:http://localhost:14444/video/,選擇視頻并查看

image.png

查看使用統(tǒng)計(jì)

http://localhost:14444/status

添加瀏覽器

如果當(dāng)前瀏覽器已經(jīng)無(wú)法滿足需求,可以手動(dòng)需要添加瀏覽器,添加步驟如下:

  1. docker pull 需要的瀏覽器版本
  2. 修改browsers.json文件
  3. 重啟 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/#

image.png

image.png

簡(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,706評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,203評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,451評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,677評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,857評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,407評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,643評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容