【问题标题】:Ruby Selenium Capybara not timing outRuby Selenium Capybara 不会超时
【发布时间】:2018-05-07 21:16:10
【问题描述】:

我的规格没有超时。我的一些规格已经到了一定程度,只是挂了。我确定其中一个规范有问题导致它被破坏,我无法弄清楚为什么当我定义超时时它们只是无限期地挂起......

# frozen-string-literal: true
require 'rspec'
require 'capybara/rspec'
require 'capybara/dsl'
require 'selenium-webdriver'
require 'site_prism'

Dir[File.dirname(__FILE__) + '/page_objects/*/*.rb'].each do |page_object|
  require page_object
end

def wait_for_ajax
  Timeout.timeout(Capybara.default_max_wait_time) do
    loop until page.evaluate_script('jQuery.active').zero? && page.has_no_css?(".k-loading-color")
  end
end

def whole_page
  Capybara.current_session
end

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome)
end

Capybara.default_driver = :selenium
Capybara.app_host = #REDACTED
Capybara.default_max_wait_time = 20

RSpec.configure do |config|
  config.before(:each) do
    config.include Capybara::DSL
  end

  config.after(:each) do
    Capybara.reset_sessions! 
  end
end

【问题讨论】:

    标签: ruby selenium selenium-webdriver rspec capybara


    【解决方案1】:

    你没有提到它挂在什么命令上,但我猜它在你的 wait_for_ajax 方法中。如果是这种情况,那是因为您使用的是 Timeout.timeout,这是 Ruby 提供的最危险的使用方法。它的工作方式是启动第二个线程,然后在发生超时时在原始线程中引发异常。问题是异常可能发生在原始线程中的任何地方,这意味着如果timeout 调用中的块正在做任何不平凡的事情,它可能最终处于完全不可恢复的状态(网络通信等)。基本上Timeout.timeout 只能在非常详细地了解其块中发生的每一件小事的情况下才能安全地使用,这意味着它永远不应该有效地用于对第三方库的任何调用。相反,如果您需要超时,您应该只使用计时器并休眠。类似的东西

    def wait_for_ajax
      start = Time.now
      until page.evaluate_script('jQuery.active').zero? && page.has_no_css?(".k-loading-color", wait: false) do
        sleep 0.1
        raise <Some Error> if (Time.now - start) > Capybara.default_max_wait_time
      end
    end
    

    话虽如此,您确实不需要具有可用 UI 和正确编写的测试的 wait_for_ajax

    此外,通过包含capybara/rspec,您已经设置了在每次测试后调用reset_sessions,并将Capybara::DSL 包含在应该包含到的测试类型中 - https://github.com/teamcapybara/capybara/blob/master/lib/capybara/rspec.rb#L9 - 所以通过添加您自己的 after 块,您最终会在每次测试后调用 reset_sessions 两次,这只是浪费时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-14
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2022-11-29
      • 2013-03-17
      相关资源
      最近更新 更多