【暴力填坑】死磕Zalenium容器與Ubuntu宿主機時間同步

在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)然前置條件肯定是你的測試腳本是正確的。

Dashboard(儀表盤---視頻回放、查看log)

【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í)行的情況。

VNC
  • 怎么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容器,如下圖:
#docker ps
3.利用**#docker exec 容器ID date **的方式來查看容器的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所示。


方案二:圖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所示。


方案二:圖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 方式

這個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"

坑---官網(wǎng)再次坑

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

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

修改hub容器的zalenium.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時間同步,見下圖:


宿主機Ubuntu與容器hub時間同步

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

還有的坑

執(zhí)行不了,方法不能調(diào)用

待續(xù)........

END!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容