【问题标题】:Triple click using selenium使用硒的三次点击
【发布时间】:2017-06-02 13:30:47
【问题描述】:

这个问题类似于here 提出的问题。然而在这种情况下,张贴者的最终目的似乎实际上是选择一段文字,他们能够找到一种不涉及点击的变通方法。

和上一个问题的用户一样,我一开始以为可以通过三次调用click方法来模拟三次点击。

new Actions(driver)
  .moveToElement(svgElement, posX, posY)                     
  .click()
  .click()
  .click()
  .perform()

但是,这不起作用,因为我的 javascript 代码会检查 UIEvent 实例的 detail 属性,并且每次调用 click 时始终为 1。因此下面的sn-p:

function clickHandler (event) {
    if (event.detail == 1) {
        singleClickHandler() 
    }
    if (event.detail == 2) {
        doubleClickHandler() 
    }
    if (event.detail == 3) {
        tripleClickHandler() 
    }

导致 singleClickHandler 在通过 Selenium 调用时被调用 3 次,而 singleClickHandlerdoubleClickHandlertripleClickHandler 中的每一个在通过浏览器 (Firefox) 手动执行时被调用一次。

如何通过 selenium 触发 detail 等于 3 的点击事件?

【问题讨论】:

  • 我可以看到 Actions 类中没有像双击一样的选项。你检查过尝试机器人课程吗?
  • 你能用.moveToElement(svgElement, posX, posY).click().click().click().build().perform()试试吗?
  • @santhoshkumar : 实际上有一个带有 Actions 类的 doubleclick() 方法
  • 是的..我说有双击但没有三击...你能试试机器人类吗?..... Robot bot = new Robot(); bot.mouseMove(element.getLocation().x,element.getLocation().x); bot.mousePress(InputEvent.BUTTON1_MASK); bot.mouseRelease(InputEvent.BUTTON1_MASK); bot.mousePress(InputEvent.BUTTON1_MASK); bot.mouseRelease(InputEvent.BUTTON1_MASK); bot.mousePress(InputEvent.BUTTON1_MASK); bot.mouseRelease(InputEvent.BUTTON1_MASK);
  • @santhoshkumar - 我可以考虑 Robot 类,但对于这种单一的边缘情况来说似乎有点过分了。

标签: java selenium automated-tests dom-events


【解决方案1】:

当前的 api 没有提供模拟三次点击的方法,该方法会发出带有点击次数的单击事件。 所以你最好的机会可能是用 executeScript 模拟事件:

String JS_CLICK_TRIPLE = 
  "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('mousedown', {clientX: cx, clientY: cy, buttons: 1}); " +
  "emit('mouseup',   {clientX: cx, clientY: cy});             " +
  "emit('click',     {clientX: cx, clientY: cy, detail: 3});  " +
  "                                                           " +
  "function emit(name, init) {                                " +
    "target.dispatchEvent(new MouseEvent(name, init));        " +
  "}                                                          " ;


Actions action1 = new Actions(driver);
action1.moveToElement(yourElement, posX, posY).perform();

((JavascriptExecutor)driver).executeScript(
    JS_CLICK_TRIPLE, yourElement, posX, posY);

【讨论】:

  • 嘿,你发布这个已经有一段时间了,但是你能把这个翻译成 python 吗?
  • 请帮忙...?
【解决方案2】:

也许您可以尝试以下方法:

WebElement yourElement = driver.findElement(By.xpath("xpath locator here"));

Actions action = new Actions(driver);
Actions action1= new Actions(driver);
action1= action.moveToElement(yourElement).doubleClick();

action1.click().build().perform();

【讨论】:

  • 我的理解是Actions是使用builder模式实现的。因此,对实例的每个方法调用(buildperform 除外)都返回一个新实例。因此,以上等价于new Actions(driver).moveToElement(yourElement).doubleClick().click().perform()。参考我的问题中的代码,这将导致调用singleClickHandlerdoubleClickHandler,但不会调用tripleClickHandler
  • @agdd :你可能是对的;这只是一个疯狂的猜测,以这种方式链接操作可能会起作用
猜你喜欢
  • 2020-03-16
  • 2017-07-03
  • 2015-09-14
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2016-09-29
  • 2019-01-30
  • 1970-01-01
相关资源
最近更新 更多