Действие двойного щелчка не работает, тогда как одиночный щелчок работает на элементе в селене - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь дважды щелкнуть элемент, но не могу выполнить действие.Один клик отлично работает на том же элементе.Я что-то пропустил?.Может кто-нибудь, пожалуйста, помогите мне с этим.

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();

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Кажется, ты был довольно близко.Чтобы вызвать классы doubleClick() - Actions, вы можете использовать одно из следующих решений:

  • Использование 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() следующим образом:

  • Script:

    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);
    
0 голосов
/ 27 ноября 2018

Я собираюсь догадаться, что вы используете Firefox?Я думаю, что есть проблема, написанная с двойным щелчком мыши и geckodriver.Я не думаю, что это все еще исправлено.Я вижу, вы пробовали один способ в JavaScript.Можете ли вы попробовать таким образом, хотя?У меня это работало в Firefox.

document.querySelector(".mlstBody>tbody>tr:nth-child(8)").dispatchEvent(new MouseEvent("dblclick"));
0 голосов
/ 26 ноября 2018

Для ссылка .

Вам необходимо выполнить действие над элементом следующим образом:

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();
...