【问题标题】:How to make Capybara find an element that appears and disappears quickly (loading spinner)如何让 Capybara 找到一个快速出现和消失的元素(加载微调器)
【发布时间】:2020-11-17 03:42:48
【问题描述】:

我有一个应用程序,您可以选择一个复选框,单击提交按钮,然后更新值。在现实世界中,单击会触发 API 调用,并且值会随响应更新。在调用 API 和返回值之间,我还将 value-to-be-updated-area 设置为使用微调器(加载微调器)填充。这在现实生活中非常有用。但是,在测试中,我想确保微调器出现、消失,然后新值就位。在测试环境中(使用rspec)我设置了一个sinatra假服务来响应所有通过webmockstub_request的API调用。

所以问题在于,sinatra 真的很快就给出了价值,如此之快,以至于水豚永远看不到旋转器。 (我认为这就是问题所在)

我尝试人为地减慢对这类功能规范的 sinatra 响应,但没有奏效。此外,我宁愿不这样做,因为我希望套件速度快。这是一个示例规范:

    it 'lets the user change the pickup library of a hold', js: true do
      visit holds_path
      page.check 'hold_list__3911148'
      page.select 'A terrific value', from: 'some_dropdown'
      page.click_button 'Update Selected Things'
      expect(page).to have_css 'spinner-border' # this will _always_ fail to be detected
      expect(page).to have_css '#hold3911148 .pickup_at', text: 'York'
    end

【问题讨论】:

  • 你用的是什么驱动?
  • 我试过:selenium:selenium_headless:selenium_chrome:selenium_chrome_headless。我默认使用 :selenium_chrome_headless 作为 js 功能规范的默认设置。
  • 你确定元素真的出现了吗?在减慢 Sinatra 响应的情况下,“它不起作用”是什么意思?如果 Sinatra 从未响应,那么微调器应该无限期地存在并且可见,那么会发生什么? “我希望套件快速”很好,但如果它不能代表您在现实世界中的应用,那么它就不是一个有用的约束。
  • 是的,该元素出现了,这就是我所说的“在现实生活中使用效果很好”的意思 - 如果我在 sinatra 中将sleep 添加到我的伪造 Web 服务中,它还会显示测试中的微调器。使用“带头”浏览器。 “它不起作用”意味着它没有找到微调器,规范失败。如果我尝试延长睡眠时间,使其在影响中永远不会响应,即使我可以看到浏览器执行操作并看到微调器出现,规范失败说它找不到那个微调器。我愿意为了测试的准确性而牺牲套件的速度,我很好奇我是否遗漏了一些东西。

标签: ruby-on-rails ruby rspec capybara


【解决方案1】:

测试和应用程序异步运行,因此如果您确实需要验证微调器是否出现,那么您唯一的选择就是减慢该测试的响应速度,以使微调器实际出现并被看到。根据您使用的驱动程序以及浏览器驱动程序(chromedriver、geckodriver 等)作者选择实现按钮单击的方式,您必须等待的时间可能比您预期的要长。这是因为驱动程序作者可能会选择让按钮单击等待一段时间以查看它们是否会触发页面加载,而 Capybara 在click_button 返回之前无法开始寻找微调器。

我知道你说过放慢响应速度“没有用”,但如果没有任何关于你在那里做了什么的详细信息,就很难诊断出来。这还假设所有浏览器调用都转到您的应用程序,然后您的应用程序在返回之前调用外部服务(您通过 sinatra 应用程序伪造)(webmock 不能用于伪造外部 API 调用)直接从浏览器)

【讨论】:

  • 是的,是应用程序发出 API 调用,而不是浏览器。基本上我只是在伪造的 API 调用上添加了5sleep。我意识到这里有很多上下文,但如果这有帮助,我在github.com/psu-libraries/myaccount/blob/master/spec/support/… 的第 31 行添加了睡眠。并感谢您编写/维护capybara
  • @cdmo 假设它实际上被击中,我希望它允许显示微调器。要对其进行测试,请执行类似sleep 30 之类的极端操作,看看您是否可以在测试运行时在浏览器中看到微调器。
  • 所以我尝试了 30 并尝试了各种驱动程序。在每次运行时,我都会得到相同的回复 expected to find css "spinner-border" but there were no matches。当我在有头浏览器上观看测试运行时,我观察到点击操作发生,微调器出现,然后几秒钟后整个浏览器屏幕变为空白,几秒钟后浏览器窗口关闭。再次感谢您的任何帮助/建议。也许我错了?
  • @cdmo 你确定你的css是对的吗?如果微调器的 id 为 'spinner-border' 你想要have_css('#spinner-border')
  • @cdmo 实际上看看你的代码你可能想要have_css('.spinner-border'),因为'spinner-border'是一个在span或div元素上使用的类(做div.spinner-border要快一点/如果您愿意,可以提高效率等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2019-12-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多