在docker中使用selenium做自動化測試,聽起來好有B格。筆者在學(xué)習(xí)的過程中也遇到了很多坑,本文zalenium的坑,筆者用了三天才爬出來,這三天填坑的過程中,筆者幾次都想放棄,但是堅持堅持,終于在早上任督二脈貫通,順利解決了docker容器和宿主機的時間同步問題,請注意這個zalenium容器的時間與別的docker容器同Ubuntu宿主機時間同步的解決方法不一樣。【PS:筆者會在下文中說明為何“傳統(tǒng)時間同步”的方法不得行,非要采用“暴力”的方式解決時間同步?!?/p>
下面先推薦幾篇docker與selenium相結(jié)合的文章:
下面向大家推薦,筆者經(jīng)常使用的selenium——docker鏡像:
【1】https://hub.docker.com/r/yukinying/chrome-headless/
【2】https://hub.docker.com/r/yukinying/chrome-headless-browser-selenium/
【3】https://hub.docker.com/r/caryyu/selenium-chrome/
【4】https://hub.docker.com/r/baozhida/selenium-hub/ 【PS:文章1中談及提供的docker images】
在學(xué)習(xí)selenium的征程中,筆者是通過TesterHome中的《Docker 在 WebUI 自動化測試中的應(yīng)用》這篇文章,了解和學(xué)會了怎么樣在Ubuntu的docker中運行創(chuàng)建Selenium hub和Selenium node(即Selenium Gird),從而掌握了在遠程主機的Chrome和Firefox上運行Selenium腳本。
但是,文章一的作者當(dāng)時提供的docker images中的Firefox和Chrome的版本都很低[目前主要提供的版本:Chrome48,Chrome58;Firefox47,Firefox52],這幾個版本的瀏覽器不滿足運行Chrome Headless模式和FireFox HeadLess模式的要求。什么是Headless模式可參考此文。
| 瀏覽器 (Headless模式) | 版本要求 |
|---|---|
| Chrome | >=60 |
| Firefox | >=56 |
為什么使用zalenium?
前幾天,文章二的作者大神,給我推薦的。他說這個docker selenium鏡像有“錄像”功能;同時,還內(nèi)置了VNC.哇,還可以錄像,好高端。大神就給了我一個zalenium作者的github鏈接,拜讀了下,決定親手修煉下?!綪S:以前自己學(xué)會的腳本運行錄像是通過文章----Selenium技巧 - 利用MonteScreenRecorder錄制視頻,個人感受此種方式錄屏下來的視頻大小往往都是80MB+的,視頻文件太大了,有點費磁盤空間?!?/p>
Zalenium的相關(guān)介紹
- 先來看看Zalenium的GitHub。
zalenium
-
三大特性:
Why?
-
運行zalenium鏡像的前期準備:
運行zalenium鏡像的前期準備
# code
1. #docker pull elgalu/selenium 【pull “ elgalu/selenium” 這個basic鏡像】
2. #docker pull dosel/zalenium 【pull “dosel/zalenium”鏡像】
- Dashboard[即腳本視頻回放、查看log]:
Dashboard只能在腳本執(zhí)行完畢后,才能查看,當(dāng)然前置條件肯定是你的測試腳本是正確的。

【PS:視頻回放功能只能在Chrome中能夠使用;筆者也試了Firefox,但是就是不能回放腳本視頻。因為,建議多使用Chrome。還有就是Zalenium錄制腳本的視頻格式是MP4;如果你用命令"sz xxx.mp4”講文件發(fā)送到你的Windows中,然后用windows上的視頻播放器來播放這個xxx.mp4文件,你會驚人的發(fā)現(xiàn)播放不起。反正,這個視頻回放也是一個坑,后面會說到?!?p>
- 內(nèi)置VNC
Zalenium中內(nèi)置了VNC,可以在腳本運行的過程中通過--http://localhost:4444/grid/admin/live來查看測試腳本執(zhí)行的情況。

-
怎么Run Zalenium?
Run it
【吐槽1】上圖中Zalenium作者dorcker run 中使用了--rm,使用--rm參數(shù),當(dāng)你docker restart 后,容器中的數(shù)據(jù)就會CleanUp。what?。?!還要清空容器內(nèi)部的數(shù)據(jù),筆者覺得還是不加--rm參數(shù)最好?!?-rm不能和-d一起使用,即--rm最好和-it使用。】
1. 筆者使用的Ubuntu16.04 Server版本,下面我們docker run:
#code
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
2.利用#docker ps查看正在運行的docker容器,如下圖:

3.利用**#docker exec 容器ID date **的方式來查看容器的date,如下圖所示:

上圖中,Ubuntu宿主機的時間與Zalennium三個容器的時間相差7個小時,并且一個時區(qū)是 CST,一個是CET(歐洲中部時間),詳細的時區(qū)介紹,見這里。
【問題1】官方推薦的docker run 方式指定的時區(qū)與中國所處的東八區(qū)不相同,就需要更改容器中的時區(qū),Zaleniume這個images是基于Ubuntu dockerfile的。
網(wǎng)上提供宿主機與容器時間同步的解決方案主要有三種,筆者按照難易程度重新梳理這三種方案:
-
【方案一: 復(fù)制宿主機的localtime】docker cp (宿主機) /ect/localtime 容器[id/name]:/etc/localtime
方案一:圖1
重啟下hub容器,查看date是否同步見方案一:圖1。
方案一:圖2
【PS:是不是方案一有問題,不可行?筆者只能說方案一對于Zalenium這個images的確不能同步時間,但是對于其他容器(筆者采用caryyu/selenium-chrome這個鏡像)是可以的,見方案一:圖3所示:】
方案一:圖3 【方案二: 共享主機的localtime 】docker run --name <name> -v /etc/localtime:/etc/localtime:ro ....
#code
docker run -it --name zalenium -p 4444:4444 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/localtime:/etc/localtime:ro \
-v /tmp/videos:/home/seluser/videos \
--privileged=true dosel/zalenium start
執(zhí)行完上面的docker run 后,然后也docker exec 容器[id/name] date及宿主機的date,如方案二:圖1所示。

[PS是不是方案二有問題,不可行?筆者只能說對于zalenium鏡像這種方法不可行。不信,換caryyu/selenium-chrome這個鏡像試試。]
#code
docker run -d --name selenium-chrome -p 9515:9515 \
-v /etc/localtime:/etc/localtime:ro \
caryyu/selenium-chrome:latest
上面docker run執(zhí)行效果見圖方案二:圖2所示。

- 【方案三: 創(chuàng)建自定義的Dockerfile】
#code
#在Dockerfile文件中添加如下code
#設(shè)置時區(qū)
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone \
筆者從zalenium的Github上git clone整個Zalenium項目,按照方案三說的添加“RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
&& echo 'Asia/Shanghai' >/etc/timezone \”到Dockerfile文件中,重新"Docker bulid -t xxx ."。由于Zalenium鏡像作者在Dockerfile中的添加了很多在整個zalenium項目找不到的環(huán)境定義的文件,因此方案三就在此處不能成功執(zhí)行。
坑點1
【PS:此zalenium鏡像不能用 “-v /etc/localtime:/etc/locatime”和“docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime” 這兩種常用的方式,筆者試了千萬遍這兩種方式對其他鏡像的時間同步有想過,但是對zalenium這個鏡像不起效果。時間同步主要是為了視頻頁面的時間顯示正確,不可能讓界面顯示的時間和北京時間有7個小時的差異。
】
【PS:坑點不止這一個,下面繼續(xù)說明】
筆者在查閱Zalenium的github,翻到了如下圖所示的docker run 方式。

這個docker run 在start后面居然加了一個timezone的參數(shù),what?!還可以這樣寫,好興奮,筆者將timezone修改成timezone="Asia/Shanghai",try it.....
#code
docker run --rm -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 --screenWidth 1440 --screenHeight 810 --timeZone "Asia/Shanghai"

坑,巨坑.....為何docker run 的dosel/zalenium 后面有個start,難道是需要啟動內(nèi)部的什么shell腳本?筆者跑到Zalenium的Dockerfile文件中看到了如下圖所示的相關(guān)shell腳本。

在zalenium項目的scripts文件下發(fā)現(xiàn)了zalenium.sh等相關(guān)的shell文件。打開zalenium.sh文件,發(fā)現(xiàn)了和時區(qū)時間相關(guān)的屬性設(shè)置項,如下圖所示。



筆者l利用“docker rm -f $(docker ps -a -q)”刪除所有容器;重新docker run,然后再修改hub容器的zalenium.sh的TZ項。
#code---docker rm
docker rm -f $(docker ps -a -q)
#code---docker run
docker rm -f $(docker ps -a -
筆者最后自己打包了一個鏡像
鏡像主要是在zalenium鏡像的基礎(chǔ),做了如下圖所示的修改:

用法如下:
docker run -it --name zalenium -p 4444:4444 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v zalenium-videos:/home/seluser/videos \
--privileged jamesz2011/selenium-chrome-firefox-v1 start
宿主機Ubuntu與容器hub時間同步,見下圖:

[PS]慢慢文章終于寫完------親們,不想折騰還是用筆者重新構(gòu)建打包的zalenium鏡像吧。還有一些坑,不想詳細寫了,截圖表示。
還有的坑







