【问题标题】:Cucumber+Ruby+Capybara+Selenium: How to make the 'visit' method wait for dynamic contentCucumber+Ruby+Capybara+Selenium:如何让'visit'方法等待动态内容
【发布时间】:2017-05-29 09:47:00
【问题描述】:

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

这里是 gems 的版本:

  • 水豚 (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 中的“访问”方法遇到的问题是,一旦它访问页面,它就会认为所有内容都已加载并冻结浏览器,并且它永远不会让服务被调用来动态更新内容。 我尝试了以下解决方案,但没有成功:

  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. 在挂钩之后添加 等等……

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

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

也不确定这是水豚问题还是硒问题或两者兼而有之。

对任何解决方案有什么见解吗?我对 ruby​​ 和 cucumber 还很陌生,所以特别是哪些文件/文件夹中的代码将不胜感激。

梅尔

【问题讨论】:

  • Capybara 不会以任何方式“冻结”浏览器,或阻止它运行任何东西。如果您的内容没有加载,那么这是因为您的 JS 或提供数据的服务存在问题。访问后中断测试(pry、byebug 等),然后在打开的浏览器窗口中查看开发人员控制台并检查错误。 Capybara 多年来不支持 :resynchronize 选项。
  • 除了default_wait_time 之外,还可能有“显式等待” - 请参阅stackoverflow.com/questions/34889248/… Capybara 显然放弃了任何方法来做到这一点,但你仍然可以在 selenium 中做到这一点。
  • 谢谢托马斯。实际上,当我手动运行它时。没有 cucumber/capybara/selenium,我可以直观地看到内容正在更新,但是在观看 cucumber 测试运行时,我清楚地看到浏览器保留了占位符内容。我将检查 pry 以进行调试。感谢 Maxple,我相信我可能需要在我的 env.rb 中添加 selenium 驱动程序说明。我将尝试显式等待,看看是否有效。如果解决了问题,我会报告。
  • @maxple 使用“显式等待”只不过是 Capybaras 查找器和匹配器已经自动完成的工作(这就是 Capybara 放弃其他方法的原因)
  • @Melie 你得到的错误到底是什么?

标签: javascript ruby selenium cucumber capybara


【解决方案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")

【讨论】:

  • wait_until 这里完全没有必要,只要使用 Capybara 提供的功能即可。 expect(page).to have_no_css('.text-replacer-pending', wait: 20)expect(page).not_to have_css('.text-replacer-pending', wait: 20)
【解决方案2】:

@maxple 和 @nattf0dd 只是为了在这里结束我们的问题......

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

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

我非常感谢您的回复和建议,并将记住这些以备将来使用。 再次感谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 2020-12-06
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多