2017-08-12 95 views
0

我試圖讓我的測試運行器應用程序完全Docker化。我使用公共集線器和節點圖像來創建一個可以正常工作的Selenium Grid - 我可以在Dockerized Grid上本地運行我的測試。現在,我需要做的就是Dockerize我的測試應用程序代碼,並在網格中運行它。我創建了一個docker-compose文件來設置網格,然後運行測試代碼。不幸的是,當測試從Docker容器運行時,他們似乎無法連接到集線器。我檢查了測試運行器容器的日誌,並從測試的第一步看到了一些輸出。然後,它掛在那兒了1分鐘左右,並輸出以下內容:如何在Docker容器的網格上運行硒UI測試?

Net::ReadTimeout (Net::ReadTimeout) 

我炮轟進泊塢窗測試運行容器,並能夠從那裏ping通樞紐,所以我相信測試運行可以跟樞紐。我指定像這樣我的驅動程序配置:

Capybara.register_driver :remote_hub_chrome do |app| 
    caps = Selenium::WebDriver::Remote::Capabilities.chrome 
    caps.version = "59.0.3071.115" 
    caps.platform = "LINUX" 
    Capybara::Selenium::Driver.new(
     app, 
     :browser => :chrome, 
     :url => "http://hub-container:4444/wd/hub", 
     :desired_capabilities => caps 
    ) 
end 

正如你所看到的,它會嘗試打轂容器域,它應該可以,因爲我可以從容器內ping通。

我沒有看到瀏覽器節點容器上的任何日誌信息,所以它似乎甚至沒有試圖達成。我能夠在Docker容器以外的本地機器上運行完全相同的測試。唯一的區別是我必須將hub-container更改爲localhost,因爲我不再從容器中運行。

有沒有人有任何想法,爲什麼我不能從碼頭集裝箱內運行測試?

撰寫文件:

version: "3" 

services: 

    hub: 
    image: selenium/hub 
    ports: 
     - "4444:4444" 
    networks: 
     - ui-test 

    firefox: 
    image: selenium/node-firefox-debug 
    ports: 
     - "5900" 
    depends_on: 
     - hub 
    environment: 
     - HUB_PORT_4444_TCP_ADDR=hub 
     - HUB_PORT_4444_TCP_PORT=4444 
    networks: 
     - ui-test 

    chrome: 
    image: selenium/node-chrome-debug 
    ports: 
     - "5900" 
    depends_on: 
     - hub 
    environment: 
     - HUB_PORT_4444_TCP_ADDR=hub 
     - HUB_PORT_4444_TCP_PORT=4444 
    networks: 
     - ui-test 

    test-runner: 
    image: test-runner 
    depends_on: 
     - hub 
     - chrome 
     - firefox 
    networks: 
     - ui-test 

networks: 
    ui-test: 
    driver: bridge 
+0

發佈您的撰寫文件 –

+0

添加撰寫文件 – Barodapride

回答

0

更新:url選項在驅動程序配置:url => "http://hub:4444/wd/hub"。主機名必須與您的撰寫文件中定義的hub服務的名稱相匹配。

+0

是的我試過兩種方法。我以前開始使用容器名稱hub-container的集線器。無論哪種方式,我都可以成功地從測試運行器容器ping集線器和集線器容器。似乎沒有任何區別。 – Barodapride

+0

@Barodapride你的'test-runner' Dockerfile看起來像什麼? –

+0

不,中心日誌表示網格已啓動並正在運行,並且它註冊了一對節點。節點日誌以「節點註冊到集線器並準備使用」結束,所以我假設它們很好。我假設Dockerized網格工作正常,因爲我可以通過將它們發送到網格在本地運行我的測試。只有區別我可以認爲在容器測試跑步者是那裏的geckodriver/chromedriver設置。不知道還有什麼問題可能。 – Barodapride

0

許多事情可能會出現這樣一個複雜的設置錯誤。我目前在沒有電網的情況下工作,經過許多時間的調試。既然你是發佈Chrome瀏覽器的設置,這裏是我如何設法使其運行:

caps = Selenium::WebDriver::Remote::Capabilities.chrome(
    'chromeOptions' => { 'args' => 
     ['--start-maximized', '--disable-infobars', 
     '--no-sandbox', '--whitelisted-ips'] } 
) 

所以,你應該爲了使chromedriver二進制與泊塢窗/遠程設置工作添加這兩個'--no-sandbox', '--whitelisted-ips'。你也可以通過ls -la來檢查你的二進制文件是否有實際的權限,如果不是嘗試運行chmod +x chromedriverchmod 777 chromedriver(對於geckodriver應該是一樣的,根據Mozilla dos應該放在user/bin中)。如果您仍然有與後來的問題,你必須遵循Mozilla docs

「儘管該項目已更名爲GeckoDriver,許多硒的客戶尋找舊名 您需要重命名的二進制文件。文件轉換爲'wires'(舊名稱),並確保它可執行。「

最後一件事,它可以告訴你,如果有與驅動程序可執行的問題是運行它們作爲獨立的,只是拿到了自己的位置(geckodriver/usr/bin),並啓動它,像這樣./geckodriver,輸出應該幫助如果出現這種情況,你會發現錯誤。

如果您的節點沒有顯示器 - 您需要使用headlessxvfb設置,請務必對此進行故障排除。顯示端口也應該可以訪問。

+0

如果我在另一臺機器上運行測試,我需要無頭還是xvfb嗎? – Barodapride

+0

是的,如果機器沒有顯示器,因爲容器通常沒有這樣的顯示。 – ekostadinov

+0

但是爲什麼?我正在遠程運行測試,我所需要的只是命令行。要清楚,集線器和節點都有顯示。測試運動員應該只是將測試發送到集線器,但是它在這方面失敗了。 – Barodapride