Cucumber + Ruby + Capybara + Selenium:如何让'visit'方法等待动态内容

时间:2017-01-13 22:31:34

标签: javascript ruby selenium cucumber capybara

这个问题一直困扰着几个星期,所有在线发现的解决方案似乎都不起作用...即。等ajax等...

这里是宝石的版本:

  • 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

这是我的dynamicpage.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 =&gt; browser.to_sym,:resynchronize =&gt; true)
  3. 访问方法后添加睡眠5
  4. 等待来自多个网站等的ajax解决方案......
  5. 挂钩后添加 等...
  6. 我完全失去了为什么“访问”不能等待或至少提供一个简单的解决方案,我相信这是非常常见的问题。 我知道等待的水豚方法和那些不等待的方法,例如“访问”,但问题是;

    1. 没有内容从隐藏到显示
    2. 也没有用户互动,只是内容正在更新。
    3. 也不确定这是水豚问题还是硒问题,或两者兼而有之。

      无论如何都有任何解决方案的见解?我对红宝石和黄瓜相当新,所以特别是什么代码在什么文件/文件夹中会很受欢迎。

      梅尔

2 个答案:

答案 0 :(得分:1)

恢复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")

答案 1 :(得分:0)

@maxple和@ nattf0dd 只是为了关闭我们这个问题的循环......

从不同的角度看待这个问题后, 我们终于发现Cucumber / Capybara /根本不是问题: - )

我们遇到的问题在于浏览器Firefox驱动程序(与SSL相关),因为在使用Chrome驱动程序运行相同测试时我们没有任何问题。

我非常感谢回复和建议,并将在未来考虑到这些。 再次感谢!