Java 使用Selenium和Robot单击的区别

Java 使用Selenium和Robot单击的区别,java,selenium,Java,Selenium,使用selenium单击元素时,测试透视图和非可用性之间是否有区别:driver.findElement(By.id(“foobar”).click() 而不是使用坐标和机器人类 示例:如果某个元素由于错误而无法单击,robot将无法单击它。selenium是否可以单击它?使用以下命令: driver.findElement(By.id(“foobar”)。单击() 意味着您将单击具有foobarid的元素,而不管它位于何处 如果使用坐标,则在图元更改位置时将无法单击图元 根据更新的问题更新答案

使用selenium单击元素时,测试透视图和非可用性之间是否有区别:
driver.findElement(By.id(“foobar”).click()
而不是使用坐标和机器人类

示例:如果某个元素由于错误而无法单击,robot将无法单击它。selenium是否可以单击它?

使用以下命令:

driver.findElement(By.id(“foobar”)。单击()

意味着您将单击具有
foobar
id的元素,而不管它位于何处

如果使用坐标,则在图元更改位置时将无法单击图元

根据更新的问题更新答案:

我不太清楚你想从哪里得到这些

在Selenium中,如果元素可见,它将接收click事件,如果不可见,则会出现异常

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

WebElement element = driver.findElement(By.id("foobar"));
((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);
但它不会触发最终注册到该按钮的javascript事件,您必须手动触发它

如果某个元素由于错误而无法单击,robot将无法单击它。selenium可以点击它吗


这取决于阻止单击的错误是什么。我建议您在几乎所有情况下都使用
element.click()
,因为它更易于维护。对于坐标单击,如果元素移动怎么办?然后,您必须使用
元素所在的新位置更新脚本。单击()
即可。坐标单击的另一个问题是,如果您的元素移动,而另一个元素处于其位置,该怎么办?这可能会导致脚本失败,但很难跟踪。一个例子可能是一个意外的弹出窗口,它覆盖了要单击的元素。现在,您的坐标单击将命中弹出窗口,并最终导致错误/失败。如果执行
element.click()
操作,您至少会得到一个错误,即另一个元素将收到该单击。然后,您可以跟踪调试过程中遇到的障碍。

Selenium会尽可能模仿普通用户可以做和不能做的事情。当您使用
findElement(…)时。单击()
Selenium会在无法执行操作时引发异常。例如,如果DOM中存在元素但未显示,则会引发异常。请注意,Selenium的
。单击()
将尝试滚动元素。如果您要求它单击不可见但可以通过滚动查看的元素,Selenium将滚动查看该元素

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

如果您使用Robot执行单击,则赌注大致与上述相同,但有几点需要注意:

  • 尝试单击移动图元是一个更大的问题,因为获取坐标和执行单击之间的时间窗口更大

  • Robot不知道DOM是如何构造的,因此不会为您滚动元素


  • 指出可以使用JavaScript执行单击这将导致为元素调用
    click
    的事件处理程序,而不管用户是否能够访问该元素。
    这允许单击不可单击的元素,但除非有压倒一切的原因,否则我不会这样做。我已经讨论了Selenium的单击和JavaScript单击之间的区别。

    根据我的经验,Selenium单击在浏览器窗口中单击一个元素,其中机器人单击似乎是单击当时桌面上的任何东西。就我个人而言,我建议您尽可能使用Selenium clicks,因为您可以指定单击的窗口。

    您是正确的,我只是添加了一个示例,使其更具体。我不理解这个问题。你是在问,如果你不能使用Robot类(?)中的坐标来点击按钮,你能用Selenium来代替元素id来点击它吗?我试图理解什么更接近(以及为什么)一个简单的用户点击,Robot或Selenium(毕竟是Js)。