【问题标题】:Reliable click function in capybara with selenium带有硒的水豚中可靠的点击功能
【发布时间】:2018-03-11 16:51:17
【问题描述】:

有时 .click capybara 函数不会触发,也不会失败,因为它假定它已触发。于是我环顾四周,发现 .trigger("click") 更可靠,但也有一些缺点。

But I read the github for the trigger() function and it says it doesn't work in selenium.

在 selenium 中使用 capybara/ruby 进行可靠点击是否有替代功能?

例如:

find(el).click

find(el).trigger("click")

【问题讨论】:

  • 你怎么知道click事件没有被触发?根据我的经验,这要么是因为尚未分配侦听器,要么是在被新元素替换之前在元素上发出了事件,通常是由于异步更新。所以可靠性主要取决于测试是否执行了预期状态的点击。

标签: javascript ruby selenium capybara


【解决方案1】:

不,在 Capybara 中没有使用 selenium 的替代点击功能(除了可能通过 execute_script 执行 JS 之外)。点击不太可能没有触发,更有可能是在“错误”位置触发,因为页面上的动画导致点击的计算位置在点击实际发生时已经过时。在这种情况下,在测试期间禁用动画通常会有所帮助。如果不是错误的位置问题,并且您可以创建一个展示该行为的示例,请将其报告给 geckodriver 或 chromedriver,他们通常会很快修复它(只要您提供一个复制它的示例)。

【讨论】:

  • @FlorentB。使用哪个驱动程序/浏览器组合?
  • @FlorentB。因为使用 selenium/geckodriver/FF marionette 会计算元素的位置,然后将鼠标单击事件添加到窗口上的事件队列中元素被计算的位置。然后它由浏览器正常处理来处理以确定哪个元素接收它 - dxr.mozilla.org/mozilla-central/source/testing/marionette/… - 在它等待队列中的所有其他事件被处理(动画等)之后 - 所以我不相信你的陈述是正确的那个组合
  • 你是对的,我检查了所有事件都在 chrome 和 firefox 的中心位置的顶部元素上触发。我不知道我在哪里弄错了这个假设,因为即使以前的原子脚本也是以同样的方式实现的。我在 firefox 和 chrome 上都进行了一些测试,即使所有事件都在一个刻度上触发,chrome 也会受到 CSS 转换的影响,并且要么通过抛出 element not clickable 或在错误的元素上触发事件而失败。
  • 另一方面,firefox 总是在中心位置的顶部元素上触发事件,这一次令人惊讶。不同之处可能是因为点击是由带有 firefox 的木偶完全执行的,而 chomedriver 需要通过 devtool api 进行 1 次远程调用来计算位置,然后再进行一次来触发事件。
【解决方案2】:

有时,您尝试单击的元素被隐藏或重叠,在这种情况下您必须使用 -

find(el).trigger("click", visible: false)

希望对您有所帮助。

【讨论】:

  • 正如 OP 提到的——使用 Selenium 作为驱动程序时没有 trigger 方法
  • 如果它可用,我会使用它。不过还是谢谢
  • 我的错。我想的是另一种方式。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多