Selenium webdriver中的click和action.click有什么区别?

12

我正在自动化一家网站时,遇到了一个弹出对话框的问题。由于某种原因,它无法点击对话框中的按钮,但与其他所有东西都能很好地交互。它还能毫无问题地识别该按钮,并在运行时我可以看到它确实点击了该按钮,因为颜色发生了改变,所以我有点困惑。

我的代码最初看起来很明显:-

WebElement targetElement = waitforElement(threadSesh);
targetElement.click();

但是当我将它更改为以下内容时,一切似乎都运行得非常正常!

WebElement targetElement = waitforElement(threadSesh);
Actions action = new Actions(threadSesh.driver);
action.click(targetElement);
action.perform();

有人能告诉我为什么一个方法不起作用,而另一个方法却很好用吗?此外,无论是否有帮助,该网站都是使用 Twitter Bootstrap 构建的,如果这有任何区别,但按钮本身非常基本,就像这样。

<div class="modal hide fade in" style="width: 481px; margin-left: -241px; padding: 15px; display: block;" role="dialog" data-backdrop="static" data-keyboard="false" aria-hidden="false">
...
<div class="modal-footer">
<a id="save-EditDetails" class="btn btn-small btn-info" type="button" style="margin-right: 7px; padding-left: 15px; padding-right: 15px;" data-bind="click: ok" href="#">Save</a>
</div>
</div>
2个回答

7
我不确定你的具体情况,但WebElement click方法和Actions click方法之间有几个区别。 Actions的click方法比较简单,它只是将点击事件发送到您传递的元素(位置)。 它不关心元素,只是执行点击操作并继续向前移动,而WebElement click是一个阻塞调用(不总是,请检查参考文献),它还有先决条件,如要单击的WebElement必须可见。 另外,webElements的click是一个void方法,而actions click返回正在使用的Actions的引用。 有关更多信息,请在此处此处查看。
编辑。 查看您发布的标记,虽然我不是bootstrap CSS方面的专家,但其中的modal hide fade in,特别是那个fade in部分看起来很可疑。 您确定在发送webelement.click()时,您的元素处于可点击状态吗? 发生了什么? 没什么反应? 那么,如果actions click可靠地工作,为什么不直接使用它呢? 我的意思是,如果有东西可以工作,为什么要修复它呢?

谢谢,我会查看那些链接。点击似乎有效,按钮闪烁着颜色,就像发生了点击动作,但没有任何反应(即使Selenium认为它已经点击了并且继续执行下一步,但随后失败),所以我想我可以坚持使用action.click。谢谢 :) - MorkPork
我发现我可以在嵌入的SVG上使用WebElement.click(),但无法使用Actions.click()。是否有一个WebElement类似于Actions.dragAndDrop() 或 Actions.release()的方法? - InfernalRapture

2

只是测试相似的场景。

首先使用Actions点击:

actions.moveToElement(driver.findElement(By.xpath("//*[@id='relevantJobsAndCareerUpdates_1']"))).click().perform()

第二个是使用 WebElement 点击的方法:

driver.findElement(By.xpath("//*[@id='relevantJobsAndCareerUpdates_1']"))).click()

第二个不起作用。它会显示错误消息:
Root cause: org.openqa.selenium.WebDriverException: unknown error: Element <input data-val-required="Information required.
" id="relevantJobsAndCareerUpdates_1" name="OptiInEmailJobsAndCarrerRelated" type="radio" value="1"> is not clickable at point (307, 24). Other element would receive the click: <label for="relevantJobsAndCareerUpdates_1" class="control-label">...</label>

这是与之前相似的问题。使用操作(Actions)可解决此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接