尝试从Selenium Docker容器内部访问本地主机

11

我尝试使用Selenium docker运行我的测试,我在9000端口上运行了一个本地的grunt服务器,我启动了以下Selenium docker:

docker run  -d -p 4444:4444 -p 5900:5900 selenium/standalone-chrome-debug

我已经启动了我的测试(使用Capybara),并打开了VNC以观察测试,但我得到的只是Chrome消息“无法访问此网站”。

cabybara.rb:

isWindows = (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil

require 'capybara/rspec'
require 'capybara'
require 'capybara/dsl'
require_relative 'sinatra_proxy'
require 'selenium/webdriver'
require 'selenium/webdriver/remote/http/curb' if !isWindows

Capybara.register_driver :selenium_chrome do |app|
    http_client = isWindows ? nil : Selenium::WebDriver::Remote::Http::Curb.new
    options = {
        http_client: http_client,
        browser: :chrome,
        # service_log_path: 'chromedriver.out', # Enable Selenium logs
        switches: ["--disable-web-security", '--user-agent="Chrome under Selenium for Capybara"']
    }
    options[:url] = "http://172.17.0.2:4444/wd/hub"
    Capybara::Selenium::Driver.new app, options

end

Capybara.default_driver = :selenium_chrome
Capybara.app = SinatraProxy.new
Capybara.app_host = "http://127.0.0.1:9000"
Capybara.server_host = '0.0.0.0'

显示docker0的IP地址

ip addr show docker0                                                                  
6: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:22:ec:65:9e:f1 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe40::42:ecdd:fe73:9ef4/64 scope link 
       valid_lft forever preferred_lft forever

需要使用Docker主机的IP地址,可使用以下命令:

ip route show | grep docker0 | awk '{print $9}' 

对于Capybara.app_host(DOCKER_HOST_IP:PORT)和Capybara.server_host(DOCKER_HOST_IP)


你尝试过这个问题的答案吗?从Docker容器内部,如何连接到主机的本地地址? - Roman
是的,我尝试过使用net=host和Selenium镜像,但是容器因某种原因关闭了。 - Captain_Meow_Meow
1个回答

5

使用:

Capybara.app_host = "http://yourhostip:9000" 

不是本地主机。对于Docker容器,本地主机是它本身。

此外,我建议不要通过其内部IP调用Docker,只需使用:

options[:url] = "http://localhost:4444/wd/hub"

首先解决前面的问题。

谢谢。


我没有另一台机器,这只是应用程序的本地服务器,顺便说一下,容器内部的互联网访问是可以的。 - Captain_Meow_Meow
使用您的手机、平板电脑或任何尝试从IP访问服务器的设备。这有助于缩小问题所在的范围。 - Carlos Rafael Ramirez
我会尽力保持你的更新。 - Captain_Meow_Meow
2
需要使用docker主机的IP,命令为:ip route show | grep docker0 | awk '{print $9}',用于Capybara.app_host(DOCKER_HOST_IP:PORT)和Capybara.server_host(DOCKER_HOST_IP)。 - Captain_Meow_Meow
2
只是提供信息,“host.docker.internal”也可以使用。我在想是否有办法将“host.docker.internal”映射到主机系统的本地主机?!? - Prathamesh dhanawade
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接