Docker+Selenium搭建和踩坑記錄


 前記:Python+flask+bootstrap+macaca 搭建 web/  Android  自動化測試管理平台
  使用  python + flask 搭建的 selenium  web 自動化測試平台已經運行一段時間。 一直以來都是需要在自己的 windows 機上啟動 selenium  server 作為運行的媒介,不是很方便。於是考慮使用docker 來作為運行用例的平台。
   安裝步驟:
  1. 安裝docker。
  首先打算在測試的linux 服務器上搭建,無奈服務器linux版本太低(上面的部署的服務還挺多的,不想冒升級內核版本的風險),嘗試了很多次都無法愉快地把docker 跑起來,最終選擇先在Windows 服務器下先嘗試搭起來。 具體安裝步驟網上很多,這里就不多說了。
   2. 拉取所需的docker鏡像。
  目前使用到兩個鏡像:
  docker pull selenium/hub
  docker pull selenium/node-chrome
   3. 啟動對應docker鏡像。
  按selenium docker 官方GitHub上的推薦方式啟動如下:
docker network create grid
docker run -d -p 4444:4444 --net grid --name selenium-hub selenium/hub
docker run -d --net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-chrome
  服務順利起來了,可以查看到對應selenium節點:
  http://192.168.99.100:4444/grid/console#
   4. 跑一下測試腳本,可以正常調用服務進行測試:
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Remote(command_executor='http://192.168.99.100:4444/wd/hub',
desired_capabilities = chrome_options.to_capabilities())
driver.get('http://www.baidu.com/')
driver.find_element_by_id("kw").send_keys("docker selenium test")
driver.find_element_by_id("su").click()
driver.get_screenshot_as_file("c://img1.png")
driver.quit()
   踩坑記
  1. 外網訪問docker 里的selenium 服務。
  設計的架構里,測試平台將調用對應的 selenium server 服務發起測試。但現在docker只能在Windows 服務器內訪問,因此需要把對應的端口轉發出去。
  步驟:
  1.1 把selenium docker鏡像對應的 ip 192.168.99.100,端口為4444 的docker服務轉發到本地(對應的局域網ip 為 172.16.100.1):
  cmd 執行:
  netsh interface portproxy add v4tov4 listenport=4444 listenaddress=172.16.100.1 connectport=4444 connectaddress=192.168.99.100
  1.2 Windows 防火牆中添加端口4444 的對應轉發規則(防火牆》高級設置 ,分別添加入站規則和出站規則)
  這樣,局域網的服務器就可以通過 172.16.100.1:4444 調用selenium hub 的服務了。
   2. 窗口最大化失敗
  在腳本中對 瀏覽器進行最大化操作:
  driver.maximize_window()
  這個命令一向運行是沒問題的,但是在docker 中卻報錯如下:
  Message: unknown error: failed to change window state to maximized, current state is normal
  查了一下,說是selenium 的bug。 找了一下,沒有合適的解決方案,粗暴解決如下:
try:
driver.maximize_window()
except WebDriverException as e:
log.log().logger.info(e)
driver.set_window_size(1920, 1080)  #如果最大化失敗,設置窗口大小為 1920*1080
   3. chrome option 不生效。
  因為部分用例需要模擬移動設備,或設置瀏覽器為英文,所以使用 chrome option進行設置。 原來的初始化腳本如下:
desired_caps_web = webdriver.DesiredCapabilities.CHROME
deviceList = ['Galaxy S5', 'Nexus 5X', 'Nexus 6P', 'iPhone 6', 'iPhone 6 Plus', 'iPad', 'iPad Pro']
if devicename!='' :
if devicename not in deviceList:
devicename = deviceList[2]
chrome_option = {
'args': ['lang=en_US','start-maximized'],
'extensions': [], 'mobileEmulation': {'deviceName': ''}
}
chrome_option['mobileEmulation']['deviceName'] = devicename
else:
chrome_option = {
'args': ['lang=en_US','--start-maximized'],
'extensions': []
}
desired_caps_web['goog:chromeOptions']=chrome_option
log.log().logger.info(desired_caps_web)
driver = webdriver.remote.webdriver.WebDriver(command_executor=server_url,desired_capabilities=desired_caps_web)
  但同樣,之前一直正常運行的腳本,到 docker 里不起作用。
  看下docker selenium node 節點的log ,發現打印了如下信息:
  Capabilities are: Capabilities {browserName: chrome, chromeOptions: {args: [lang=zh_CN.UTF-8],  mobileEmulation: {deviceName: iPhone 6}}, goog:chromeOptions: {}, javascriptEnabled: true, version: }
  多了個 goog:chromeOptions {} 的配置項是怎么回事?
  認真看下,Capabilities 里我設置的 chromeOptions 已經正確傳進來了,但是后面的 goog:chromeOptions: {} 似乎覆蓋了對應的配置。
  嘗試下把腳本里的參數名稱從 “chromeOptions ” 改為 “goog:chromeOptions” ,奇跡出現了:
  Capabilities are: Capabilities {browserName: chrome, goog:chromeOptions: {args: [lang=zh_CN.UTF-8], mobileEmulation: {deviceName: iPhone 6}}, javascriptEnabled: true, version: }
  腳本也能正常運行了,對應的瀏覽器語言、移動設備模擬設置也已生效!
  於是修改對應腳本為:
  desired_caps_web['goog:chromeOptions']=chrome_option
  問題解決!
  至此,腳本可以愉快的跑起來了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM