双击操作不起作用,而单击对 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;">&nbsp;&nbsp;*&nbsp;Quarter&nbsp;to&nbsp;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 中的元素起作用的主要内容,如果未能解决你的问题,请参考以下文章

找到java selenium元素,但单击一次不起作用

selenium中鼠标的常用操作

Selenium之动作链(ActionChains)

python selenium鼠标键盘操作(ActionChains)

使用Selenium单击自动化

selenium ActionChains(动作链常用API)