it-swarm.com.ru

Selenium/Firefox: Команда ".click ()" не работает с найденным элементом

Я пытался найти решение этой проблемы и потратил много времени, но для меня это практически невозможно.

Дело в том, что я использую Selenium с Java в Firefox. Мне нужно найти элемент (список) и нажать на него. Итак, код находит элемент, но действие щелчка не работает. Он отлично работает в Google Chrome каждый раз, и просто иногда в Firefox (с тем же Java-кодом иногда работает, а иногда нет).

Есть часть кода с элементом, когда программа входит на страницу:

    <div id="size-btn" class="size-btn">
      <span class="selected-size">SELECCIONA TALLA </span>
      <div class="size-select" style="display: none;">
        <table>
          <tbody>
            <tr id="selecsize_2" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051607">
            <tr id="selecsize_3" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051608">
            <tr id="selecsize_4" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051609">
            <tr id="selecsize_5" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051610">
          </tbody>
        </table>
      <button class="size-guide gaViewEvent gaTrack" data-ga-props="{action:'Seleccionar_Talla', opt_label:'Guia_de_tallas'}" data-href="http://www.anyweb.com/webapp/wcs/stores/servlet/ProductGuideSizeAjaxView?catalogId=24052&categoryId=358056&langId=-5&productId=1047599&storeId=10701">Guía de tallas</button>
      </div>
    </div>

И есть часть кода, которая изменяется при щелчке элемента:

    <div id="size-btn" class="size-btn opened">

Я перепробовал много решений, и иногда это работает, но в следующий раз, когда я запускаю программу, она снова не работает.

Некоторые решения:

  1. Он находит элемент, но не запускает действие щелчка. Я проверил с помощью xpath и cssSelector, и с этими выражениями были найдены уникальные элементы.

    driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")).click(); // Also checked with By.cssSelector("span.selected-size")
    
  2. Я думал, что это из-за времени, поэтому я попытался решить это таким образом.

    WebElement we = driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")); // By.cssSelector("span.selected-size")
    Thread.sleep(3000);
    we.click();
    
  3. Наконец, я был немного в отчаянии, и я создал новую функцию, чтобы попытаться сделать это почти 60 раз, ища изменения в коде элемента и, если были какие-либо изменения, просто попытался снова выполнить действие щелчка.

    clickAndWaitWhileElementIsNotPresent(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span"),By.xpath("//div[@class='size-btn opened']/span")); // By.cssSelector("span.selected-size")
    
    private void clickAndWaitWhileElementIsNotPresent(By by1, By by2) throws Exception {
        for (int second = 0;; second++) {
            if (second >= 60)
                fail("timeout");
            try {
                if (isElementPresent(by2))
                {
                    break;
                }
                else
                {
                    driver.findElement(by1).click();
                }
            } catch (Exception e) {
            }
            Thread.sleep(1000);
        }
    }
    

Есть изображения элемента:

Element 1Element 2

Кто-нибудь знает, как это сделать?

20
ovejaexiste

Наконец я нашел ответ, который работает как с Firefox, так и с Google Chrome.

WebElement we = this.driver.findElement(By.id("size-btn"));

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", we);

waitForElementPresent(By.xpath("//div[@id='size-btn' and contains(@class,'opened')]/span"));

Спасибо, что читаете меня.

24
ovejaexiste

Я не уверен, почему вы используете этот Xpath, если у вас есть свобода изменять Xpath, тогда запишите элемент с помощью Selenium IDE и используйте Xpath::position из выпадающего списка target (он выбирает уникальный путь относительно заголовка html), он решит проблему динамического локатора. И попробуйте ниже упомянутые события.

1- Используйте clickAt.

2- Используйте fireevent(focus) и затем нажмите. Иногда случается, что какой-то элемент в фоновом режиме загружается, когда он загружается, фокус перемещается туда, следовательно, ошибка elementNotVisible.

3- Используйте mouseDownRight.

2
Amit Shakya

У меня есть какое-то решение: создать класс с роботом, поместить туда ключи событий TAB, а затем вызвать этот класс. То, что он делает, это как спина, чтобы сосредоточиться на странице. Для какого-то разона страница потеряла фокус и так и не нашла этот боттон.

   Robot robot;
    try {
        robot = new Robot();
        robot.keyPress(KeyEvent.VK_TAB);
        robot.keyRelease(KeyEvent.VK_TAB);

    } catch (AWTException e) {e.printStackTrace();}
1
Ing. Antonio Gervasio Luelmo

У меня такая же проблема в Firefox. Хитрость заключается в том, чтобы щелкнуть текст внутри самой кнопки, а не самой кнопки.

1
jason zhang

Вы можете попробовать использовать класс Actions из org.openqa.Selenium.interactions:

WebElement element = driver.findElement(By.id("size-btn"));
Actions builder = new Actions(driver);

builder.moveToElement(element).click(element);
builder.perform();
0
Aconic