测试透视图与不可用性之间是否存在差异,点击具有硒的元素如下:driver.findElement(By.id("foobar")).click();
而不是使用坐标和机器人类。
示例:如果由于错误导致元素无法点击,则机器人将无法单击该元素。硒能够点击它吗?
答案 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
选择的元素发送点击。
如果您使用机器人执行点击,赌注与上述大致相同,但需要注意几点:
尝试点击移动元素更是一个问题,因为获取坐标和执行点击之间的时间窗口更大。
机器人不知道DOM的结构如何,所以不会为你滚动元素。
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事件,您必须手动触发它。