SeleniumHQ官方項目:https://github.com/seleniumHQ/docker-selenium
項目目前快速迭代中。
###Docker
一般叫docker容器,一個可愛的鯨魚,上面坨着集裝箱。先來搞清楚它里面的幾個概念。
-
Docker鏡像,運行Docker容器的一個環境。
-
Docker容器,簡單的說,容器是獨立運行的一個或一組應用,以及它們的運行態環境。 如果把鏡像看成面向對象中的 “類” 的話,那么容器就是“類”的實例化“ 對象”。
-
Docker倉庫,存放Docker鏡像的倉庫。作用和GitHub類似。
### Selenium
這里主要針對的是 Selenium Grid,它用於分布式自動化測試,就是一套Selenium 代碼可在不同的環境上運行。剛好,Docker可快速的創建各種環境。
Selenium Grid 有兩個概念
hub :主節點,你可以看作 “北京總公司的測試經理”。
node:分支節點,你可以看作 “北京總公司的測試小兵A” 和 “上海分公司的測試小兵B”,還有 “深圳分公司的測試小兵C” ...。
也就是說在Selenium Grid中只能有一個主hub,但可以在本地或遠程建立 N 多個分支node,測試腳本指向主hub,由主hub 分配給本地/遠程node 運行測試用例。
### docker selenium 環境安裝
以Ubuntu為例,在Ubuntu下安裝Docker,請參考:Docker安裝(Ubuntu)
docker hub(倉庫):
https://hub.docker.com/r/selenium/hub/
1、下載主hub鏡像(北京總公司的測試經理)
$ sudo docker pull selenium/hub
2、下載主node chrome 鏡像(上海分公司的測試小兵B)
$ sudo docker pull selenium/node-chrome
3、查看鏡像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
selenium/node-chrome latest 1eba57bd3d79 12 days ago 823MB
selenium/hub latest d1437f7d9f87 12 days ago 285MB
4、啟動主hub容器
$ sudo docker run -d -P --name selenium-hub selenium/hub
- -d 表示容器以守護態(Daemonized)形式運行。
- -P 表示 Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口。
5、啟動分支node chrome 容器
$ sudo docker run -d --link selenium-hub:hub selenium/node-chrome
- --link 通過 link 關聯
selenium-hub
容器,並為其設置了別名hub
6、查看容器
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cd0dac69875 selenium/hub "/opt/bin/entry_poin…" 12 hours ago Up 12 hours 0.0.0.0:32768->4444/tcp selenium-hub
18d139a6c36d selenium/node-chrome "/opt/bin/entry_poin…" 12 hours ago Up 12 hours eloquent_gates
這里需要注意,Selenium/hub 容器的端口號為 4444
,對Ubuntu映射的端口為 32768
,前面通過 -P
參數自動分配。
工作原理:
selenium Grid腳本 -> ubuntu(32768) -> Hub容器(4444) -> Node Chrome 容器
### 創建Grid測試腳本與運行
1、編寫Selenium Grid 腳本(grid_demo.py)
from selenium import webdriver
from time import sleep
driver = webdriver.Remote(
command_executor='http://127.0.0.1:32768/wd/hub',
desired_capabilities={'browserName': 'chrome'}
)
driver.get('https://www.baidu.com')
print("get baidu")
driver.find_element_by_id("kw").send_keys("docker selenium")
driver.find_element_by_id("su").click()
sleep(1)
driver.get_screenshot_as_file("/home/fnngj/mypro/baidu_img.png")
driver.quit()
print("end...")
注意訪問的端口號和瀏覽器,因為我們只啟動了node chrome容器,如果這里設置Friefox的話,需要你啟動 node firefox
容器,hub找不到合適的node會報錯。
另外,我們為了驗證腳本是否真的執行加上了打印和截圖。
2、運行腳本
$ python3 grid_demo.py
get baidu
end...
3、查看截圖
百度頁面是被渲染出來了,但中文有亂碼。