点击Selenium和点击机器人之间的区别

时间:2016-06-28 14:42:19

标签: java selenium

测试透视图与不可用性之间是否存在差异,点击具有硒的元素如下:driver.findElement(By.id("foobar")).click(); 而不是使用坐标和机器人类。

示例:如果由于错误导致元素无法点击,则机器人将无法单击该元素。硒能够点击它吗?

4 个答案:

答案 0 :(得分:3)

Selenium尝试尽可能地模仿普通用户可以做和不能做的事情。当你使用:!cd $(git rev-parse --show-toplevel)时,如果无法执行操作,Selenium将引发异常。例如,如果DOM中存在元素但未显示,则会引发异常。请注意,Selenium的findElement(...).click()会尝试滚动元素。如果你要求它点击一个不可见的元素,但通过滚动它可以看到 ,Selenium将滚动显示它。

另请注意, Selenium通常会使用元素的坐标并在这些坐标处执行单击。因此,移动元素始终会被.click()命中的想法(用this answer表示)是不正确的。使用findElement(...).click()可以最小化获取坐标和发送findElement事件的窗口,但不会完全消除它。 Selenium使用坐标的原因再次是重现用户会做什么。用户将看到元素,将鼠标移动到元素的坐标,然后单击它。如果元素上有透明覆盖,则覆盖将获得单击而不是元素。这是有效的,因为Selenium会点击坐标,而不是直接向您使用click选择的元素发送点击。

如果您使用机器人执行点击,赌注与上述大致相同,但需要注意几点:

  1. 尝试点击移动元素更是一个问题,因为获取坐标和执行点击之间的时间窗口更大。

  2. 机器人不知道DOM的结构如何,所以不会为你滚动元素。

  3. Rogério Peixoto指出您可以使用JavaScript来执行点击。 这将导致为该元素调用findElement的事件处理程序,而不管用户是否实际上能够访问该元素。这可以允许单击非元素否则可点击但我不会这样做,除非有最重要的理由这样做。我已经查看了Selenium点击之间的区别以及JavaScript点击in this answer

答案 1 :(得分:1)

  

如果某个元素因bug而无法点击,则机器人将无法点击该元素。硒能够点击它吗?

这取决于阻止点击的错误。我建议你几乎在所有情况下使用element.click(),因为它更易于维护。对于坐标点击,如果元素移动怎么办?然后,您必须使用element.click()才能正常工作的新位置更新您的脚本。坐标点击的另一个问题是,如果你的元素移动而另一个元素移动了怎么办?这可能会导致您的脚本失败,但很难追查。一个示例可能是一个意外的弹出窗口,它覆盖了要单击的元素。现在,您的坐标单击将弹出弹出窗口并最终导致错误/失败。如果你element.click(),你至少会得到另一个元素会收到点击的错误。然后,您可以跟踪从调试中获得的内容。

答案 2 :(得分:1)

在我的经验中点击Selenium点击浏览器窗口中的一个元素,其中Robot点击似乎点击桌面上的任何内容。就个人而言,我建议你尝试尽可能使用Selenium点击,因为你可以指定你点击的窗口。

答案 3 :(得分:0)

使用此:

driver.findElement(By.id("foobar")).click();

表示您将点击具有foobar ID的元素,无论它在何处。

如果您使用坐标,则如果他们改变位置,您将无法点击该元素。

由于您更新的问题而更新答案:

我不太确定你在哪里尝试使用它。

在Selenium中,如果元素可见,它将收到点击事件,否则你将有例外。

您可以使用javascript强制点击它:

WebElement element = driver.findElement(By.id("foobar"));
((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);

但它不会触发注册到该按钮的最终javascript事件,您必须手动触发它。