首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby Selenium Capybara未超时

Ruby Selenium Capybara未超时
EN

Stack Overflow用户
提问于 2018-05-08 05:16:10
回答 1查看 143关注 0票数 0

我的规格有问题,没有超时。我的一些规范已经到了一定程度,然后就挂起来了。我确定其中一个规范出了问题,导致它被破坏,我不明白的是,当我定义了超时时,它们为什么会无限期地挂起……

代码语言:javascript
运行
复制
# 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
EN

回答 1

Stack Overflow用户

发布于 2018-05-08 06:25:06

您没有提到它挂起的是什么命令,但我会猜测它在您的wait_for_ajax方法中。如果是这样的话,那是因为您正在使用Timeout.timeout,这是使用Ruby提供的方法最危险的。它的工作方式是启动第二个线程,当超时发生时,该线程将在原始线程中引发异常。这样做的问题是,异常可能发生在原始线程的任何地方,这意味着如果timeout调用中的块正在做一些非常重要的事情,它可能会以完全不可恢复的状态结束(网络通信等)。基本上,只有在对其代码块中发生的每一件小事都有非常详细的了解的情况下,才能安全地使用Timeout.timeout,这意味着不应该在调用第三方库时有效地使用它。相反,如果你需要超时,你应该只使用计时器和睡眠。就像这样

代码语言:javascript
运行
复制
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两次,这只是浪费时间。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50222543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档