双击操作不起作用,而单击对 selenium 中的元素起作用
Posted
技术标签:
【中文标题】双击操作不起作用,而单击对 selenium 中的元素起作用【英文标题】:Double click action not working whereas single click works on an element in selenium 【发布时间】:2019-04-28 08:59:33 【问题描述】:我试图双击一个元素但无法执行该操作。单击即可在同一元素上正常工作。我错过了什么吗?有人可以帮我解决这个问题吗?
元素的html:
<tbody><tr class="mclS" tabindex="0"> <td><div class="mclC" style="height:14px;"> * Quarter to Date</div></td> </tr> </tbody>
我尝试过各种双击元素的方法:
WebElement date = driver.findElement(By.cssSelector(".mlstBody>tbody>tr:nth-child(8)"));
=> actions.doubleClick(date).build().perform();
=> actions.doubleClick(date);
=> ((javascriptExecutor)driver).executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('dblclick',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);",date);
=> actions.moveToElement(date).doubleClick().build();
actions.perform();
【问题讨论】:
@Brian 我也试过这种方法,但还是不行。 你想双击什么? 我正在尝试双击列表中的一个元素,当我执行双击操作时,它只会滚动浏览该元素所在的列表,但不会双击该元素。如果我使用 date.click(),单击效果很好。如果我使用 actions.click(date).perform(),它不会单击该元素。 @Ayisha 用相关的 HTML 和关于您正在使用的 Selenium Language Binding Art 的信息更新问题? Java / Python / C# / NodeJS ? @DebanjanB 我正在使用 Java,我已经更新了 HTML 【参考方案1】:对于reference。
您需要对元素执行如下操作:
Actions action = new Actions(driver);
WebElement date = driver.findElement(By.cssSelector(".mlstBody>tbody>tr:nth-child(8)"));
action.doubleClick(date).perform();
注意:此示例使用 Java。
附加说明:对于 Selenium 3.5 及更高版本,您需要执行以下操作:
action.moveToElement(driver.findElement(By.cssSelector(".msltBody>tbody>tr:nth-child(8)")).doubleClick().build().perform();
【讨论】:
试过了,但似乎没有任何效果。还有其他方法可以双击吗?【参考方案2】:看来你已经很接近了。要通过Actions
类调用doubleClick()
,您可以使用以下任一解决方案:
使用cssSelector:
WebElement date = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("tr.mclS>td>div.mclC")));
new Actions(driver).moveToElement(date).doubleClick().build().perform();
使用xpath:
WebElement date = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//tr[@class='mclS']/td/div[@class='mclC' and contains(.,'Date')]")));
new Actions(driver).moveToElement(date).doubleClick().build().perform();
更新
由于您仍然无法在所需元素上调用doubleClick()
作为鼠标双击 的替代方法,您可以编写一个脚本并将其传递给executeScript()
方法,如下所示:
脚本:
String jsDoubleClick =
"var target = arguments[0]; " +
"var offsetX = arguments[1]; " +
"var offsetY = arguments[2]; " +
"var rect = target.getBoundingClientRect(); " +
"var cx = rect.left + (offsetX || (rect.width / 2)); " +
"var cy = rect.top + (offsetY || (rect.height / 2)); " +
" " +
"emit('mousedown', clientX: cx, clientY: cy, buttons: 1); " +
"emit('mouseup', clientX: cx, clientY: cy); " +
"emit('mousedown', clientX: cx, clientY: cy, buttons: 1); " +
"emit('mouseup', clientX: cx, clientY: cy); " +
"emit('click', clientX: cx, clientY: cy, detail: 2); " +
" " +
"function emit(name, init) " +
"target.dispatchEvent(new MouseEvent(name, init)); " +
" " ;
通过executeScript()
从您的@Test
调用脚本:
new Actions(driver).moveToElement(myElem, posX, posY).perform();
((JavascriptExecutor)driver).executeScript(jsDoubleClick, myElem, posX, posY);
【讨论】:
尝试了您建议的两种方式,但仍然无效。如果有办法请告诉我。 @Ayisha 你的评论对我也没有帮助。抱歉,答案并没有帮助您解决问题,但是我将如何根据这些反馈改进我的帖子? 抱歉,我之前的评论中有错字。我想知道是否有其他方法可以实现双击元素。 @Ayisha 你能用更多信息更新问题吗,为什么你需要doubleClick()
而不是click()
当我双击元素时,值会填充到文本框中。【参考方案3】:
我猜你正在使用 Firefox?我认为双击和壁虎驱动程序写了一个问题。我认为它还没有修复。我看到您在 JavaScript 中尝试了一种方法。你可以试试这个方法吗?它在 Firefox 中对我有用。
document.querySelector(".mlstBody>tbody>tr:nth-child(8)").dispatchEvent(new MouseEvent("dblclick"));
【讨论】:
我正在使用 chrome 进行自动化,我尝试了您的建议,但仍然没有双击。 你说当你双击元素时,值会填充一个文本框。那么为什么我们没有得到完整的 HTML 呢?您给我们的 html 没有显示文本框。如果我们要适当地帮助您,那么您需要为我们提供我们所能做的一切。现在我们只是在黑暗中拍摄和猜测。以上是关于双击操作不起作用,而单击对 selenium 中的元素起作用的主要内容,如果未能解决你的问题,请参考以下文章