水豚/硒在location.reload()上随机获取一个Net :: ReadTimeout

Zac*_*ght 6 javascript selenium ruby-on-rails capybara selenium-chromedriver

我正在使用Capybara,selenium-webdriver gem和chromedriver来驱动启用了JavaScript的测试。

问题是我们的构建中约有50%由于Net::ReadTimeout错误而失败。最初,这表现为“找不到元素”错误,但是当我将Capybara的默认最大等待时间提高到30秒后,我开始看到超时。

我检查了屏幕截图,该屏幕截图显示了超时发生时的画面,该画面停留在“成功登录”模式中,在使用Javascript函数location.reload()重新加载页面之前,我们简要介绍了该模式。

我已经在本地进行了测试,有时可以随机复制它。有时,它会以这种模式压缩,并且重新加载的速度如此之快,以至于您几乎看不到它,而有时它会永远挂起。

我认为这不是资产编译问题,因为该站点已经在该点加载,以便用户访问登录表单。

想知道是否有人以前见过这种情况并且知道解决方案。

具体代码:

    visit login_path

    page.within '#sign-in-pane__body' do
      fill_in 'Email', with: user.email
      click_button 'Submit'
    end

    expect(page).to have_content 'Enter Password'

    page.within '#sign-in-pane__body' do
      fill_in 'Password', with: user.password
      click_button 'Submit'
    end

    expect(page).to have_text 'Home page landing text'
Run Code Online (Sandbox Code Playgroud)

挂断发生在click_button 'Submit'期望首页文本之间。

导致超时的逻辑流程是用户提交登录表单,我们等待服务器呈现.js.erb成功登录后触发JS事件的模板。当触发发生时,我们会显示一个模态说登录成功,然后执行location.reload()

Zac*_*ght 5

事实证明,这并不是location.reload()在JS中进行独占。有时只是访问页面而发生。

对我来说,解决方案是为硒驱动程序创建一个HTTP客户端并指定更长的超时时间:

Capybara.register_driver :chrome do |app|
  client = Selenium::WebDriver::Remote::Http::Default.new
  client.read_timeout = 120

  Capybara::Selenium::Driver.new(app, {browser: :chrome, http_client: client})
end
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用,我继续收到错误 (4认同)