【问题标题】:Selenium routing with subdomainsSelenium 路由与子域
【发布时间】:2018-08-17 13:36:13
【问题描述】:

我创建了一个 docker compose 文件,用于在容器内进行 Capybara 测试。 我目前面临的问题是我找不到路由我的 lvh.me 域的子域的能力。当我将 lvh.me 添加到 Selenium 的主机文件时,我得到的结果与我的测试失败的结果相同。我可以通过哪种方式将子域的一些路由添加到 Selenium 以接受像 {{user}}.lvh.me:3001

这样的子域

我的水豚配置

Capybara.register_driver :selenium do |app|
  Capybara.app_host = "http://0.0.0.0:3001"
  Capybara.server_host = '0.0.0.0'
  Capybara.server_port = '3001'
  Capybara.always_include_port = true

  args = ['--no-default-browser-check', '--headless', '--start-maximized']
  caps = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => {"args" => args})

  Capybara::Selenium::Driver.new(
      app,
      browser: :remote,
      url: "http://hub:4444/wd/hub",
      desired_capabilities: caps
    )
end

Capybara.configure do |config|
  config.default_driver = :rack_test
  config.javascript_driver = :selenium
end

还有我的 docker 撰写文件

version: '3'
services:
  db:
    image: postgres
    volumes:
    - ./tmp/db:/var/lib/postgresql/data
  redis:
    image: redis
    volumes:
    - ./tmp/redis:/var/lib/redis/data
  web:
    build: .
    environment:
    - REDIS_URL=redis://redis
    - DATABASE_HOST=db
    command: sh "/myapp/docker-entrypoint.sh"
    volumes:
    - .:/myapp
    links:
    - db
    - redis
    - hub
    depends_on:
    - db
    - redis
    ports:
      - "3001:3001"
      - "3000:3000"
  hub:
    container_name: hub
    image: selenium/hub:3.9
    ports:
    - "4444:4444"
  selenium:
    container_name: selenium
    image: selenium/node-chrome:3.9
    environment:
      HUB_PORT_4444_TCP_ADDR: hub
      HUB_PORT_4444_TCP_PORT: 4444
    depends_on:
      - hub
    links:
      - hub

【问题讨论】:

    标签: ruby-on-rails docker-compose capybara selenium-chromedriver


    【解决方案1】:

    首先,您不应该在驱动程序注册中指定 Capybara 配置。其次,这将假设您在 web docker 实例上运行测试——如果您实际上是在尝试在主机上运行测试,那么情况会略有不同。

    Capybara.app_host 需要设置为从浏览器的角度指向被测应用程序运行位置的 URL。在您的情况下,浏览器在selenium docker 实例上运行,并且测试应该在web 实例上启动AUT - 这意味着Capybara.app_host 应该是http://web(不需要端口,因为您已经指定alway_include_port)。这意味着你应该最终得到

    Capybara.register_driver :selenium do |app|
      args = ['--no-default-browser-check', '--headless', '--start-maximized']
      caps = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => {"args" => args})
    
      Capybara::Selenium::Driver.new(
        app,
        browser: :remote,
        url: "http://hub:4444/wd/hub",
        desired_capabilities: caps
      )
    end
    
    Capybara.configure do |config|
      config.app_host = "http://web"
      config.server_host = '0.0.0.0'
      config.server_port = '3001'
      config.always_include_port = true
    
      config.default_driver = :rack_test
      config.javascript_driver = :selenium
    end
    

    您的下一个问题是您想使用解析为127.0.0.1lvh.me,但您需要将其解析为分配给web docker 实例的任何IP。如果您在测试中使用了固定数量的子域,您应该能够通过在selenium docker 实例配置中指定的link 别名 - https://docs.docker.com/compose/compose-file/#links - 或者通过网络别名(如果您在 docker compose 中指定网络)来处理它配置-https://docs.docker.com/compose/compose-file/#aliases。如果您确实需要解析通配符 (*.lvh.me),那么您需要运行自己的 DNS 服务器(可能在您的 docker 设置中),并使用将 *.lvh.me 解析为 web 的通配符 CNAME 条目

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 2014-02-26
      • 2021-07-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多