javascript - cucumber + ruby + capybara + Selenium : How to make the 'visit' method wait for dynamic content

标签 javascript ruby selenium cucumber capybara

这是一个已经困扰了数周的问题,网上找到的所有解决方案似乎都不起作用......即。等待ajax等...

这里是 gems 的版本:

  • capybara (2.10.1、2.7.1)
  • selenium-webdriver(3.0.1、3.0.0)
  • rspec (3.5.0)

运行 ruby 2.2.5 ruby 2.2.5p319(2016-04-26 修订版 54774)[x64-mingw32]

在 env.rb 中

Capybara.register_driver :selenium do | app |
browser = (ENV['browser'] || 'firefox').to_sym
Capybara::Driver::Selenium.new(app, :browser => browser.to_sym, :resynchronize => true)
Capybara.default_max_wait_time = 5
end

这是我的动态页面.feature

Given I visit page X
Then placeholder text appears
And the placeholder text is replaced by the content provided by the json service 

和step.rb

When(/^I visit page X$/) do
visit('mysite.com/productx/')
end

When(/^placeholder text appears$/) do
  expect(page).to have_css(".text-replacer-pending")
end

Then(/^the placeholder text is replaced by the content provided by the json service$/) do
    expect(page).to have_css(".text-replacer-done")
end

相关网页(我无法在此处添加它,因为它不可公开访问)在页面加载时包含以下内容:

1- <span class="text-replacer-pending">Placeholder Text</span>

调用外部服务(提供 Json 数据)后,相同的 Span 类将刷新/更新为以下内容;

2- <span class="text-replacer-done">Correct Data</span>

我在 capybara +selenium中使用“visit”方法遇到的问题是,一旦它访问页面,它就会认为所有内容都已加载并卡住浏览器,并且它永远不会让服务被调用来动态更新内容。 我尝试了以下解决方案但没有成功:

  1. capybara .default_max_wait_time = 5
  2. Capybara::Driver::Selenium.new(app, :browser => browser.to_sym, :resynchronize => true)
  3. 在访问方法后添加 sleep 5
  4. 等待多个网站的ajax解决方案等...
  5. 添加在钩子(Hook)之后 等等...

我完全不知道为什么“访问”不能等待,或者至少为我确信很常见的问题提供一个简单的解决方案。 我知道 capybara 的等待方法和不等待的方法,例如“访问”,但问题是;

  1. 没有内容从隐藏变为显示
  2. 也没有用户交互,只是内容在更新。

也不确定这是 capybara 问题还是 Selenium 问题或两者兼而有之。

对任何解决方案有见解吗?我对 ruby​​ 和 cucumber 相当陌生,所以具体什么代码放在什么文件/文件夹中将非常感激。

梅尔

最佳答案

恢复wait_until方法(将其添加到您的spec_helpers.rb)

def wait_until(timeout = DEFAULT_WAIT_TIME)
  Timeout.timeout(timeout) do
    sleep(0.1) until value = yield
    value
  end
end

然后:

# time in seconds
wait_until(20) { has_no_css?('.text-replacer-pending') }
expect(page).to have_css(".text-replacer-done")

关于javascript - cucumber + ruby + capybara + Selenium : How to make the 'visit' method wait for dynamic content,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41644473/

相关文章:

java - 如何从代码获取 Selenium 版本

ruby-on-rails - 根据提交恢复到 gem 版本

ruby-on-rails - 对象数组比字符串数组慢得多

ruby - 强参数 : Unpermitted parameters: tags in has_many_through relation

python - Selenium 和 python3 激活文本框而不输入值

javascript - 在 &lt;script&gt; 标签中声明一个 function() 是必要的吗?

javascript - 我如何在 Javascript 中使用 goto?

javascript - 使用 jQuery Mobile 刷新表单页面

javascript - 仅在表格第一页上显示工具提示

javascript - onCleanUp() vs onComplete() vs afterLaunch()