2016-06-28 120 views
-1

用这样的硒点击元素时,测试透视和不可用性之间是否存在差异:driver.findElement(By.id("foobar")).click(); 而不是使用坐标和机器人类。用Selenium点击并用机器人点击之间的区别

示例:如果某个元素由于错误而无法点击,机器人将无法点击它。硒能够点击它吗?

+0

我不明白这个问题。您是否问过如果您无法使用Robot类(?)中的坐标单击按钮,您可以使用Selenium通过元素ID来单击它吗? – Taegost

+0

我试图理解什么是更接近(以及为什么)简单的用户点击,机器人或硒(或Js毕竟)。 – fx86f

回答

3

硒尽可能地模仿普通用户可以做什么和不可以做什么。当您使用findElement(...).click()时,如果无法执行操作,硒将引发异常。例如,如果元素存在于DOM中但未显示,则会引发异常。并注意Selenium的.click()将尝试滚动元素。如果您要求它点击一个不可见的元素,但通过滚动可以看到可以看到,Selenium将滚动显示。

另请注意,Selenium通常会采用元素的坐标并在这些坐标点击一下。所以移动元素总是被findElement(...).click()(表示在this answer中)的想法是不正确的。使用findElement可最小化获取坐标和发送事件之间的窗口,但不会完全消除该事件。硒与坐标一起工作的原因同样是重现用户的行为。用户会看到该元素,将鼠标移动到元素的坐标上,然后单击它。如果元素上有一个透明覆盖层,则覆盖层将获得点击,而不是元素。这是有效的,因为Selenium点击坐标而不是直接发送点击到您使用findElement选择的元素。

如果使用机器人进行点击,赌注是大致相同以上,有几个注意事项:

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

  2. 机器人不知道DOM是如何构造的,因此不会为您滚动元素。

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

+0

总是善于学习的东西,感谢更正:) –

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事件,你必须手动启动它。

+0

你是对的,我只是增加了一个例子来使它更具体。 – fx86f

1

如果某个元素由于错误而无法点击,机器人将无法点击它。硒能够点击它吗?

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

1

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