2013-03-08 4 views
20

Я попытался найти решение этой проблемы, и я потратил много времени, но мне почти невозможно это сделать.Selenium/Firefox: команда «.click()» не работает с найденным элементом

Вопрос: Я использую Selenium с Java в Firefox. Мне нужно найти элемент (список) и нажать на него. Таким образом, код находит элемент, но действие click не работает. Он отлично работает в 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 1 Element 2

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

+0

Необходимо уточнить, что означает «оно не работает». Есть ли исключение или какое неожиданное поведение? –

+0

Поскольку «это не работает», я имею в виду, что ожидаемое поведение кнопки неверно, когда она нажимает на botton, выпадающий список должен быть открытым. Спасибо. – ovejaexiste

+0

имел аналогичную проблему с выпадающими списками select2; «click» не работал бы в firefox при попытке щелкнуть div - разрешен, щелкнув тег привязки, который вводится select2 –

ответ

24

Наконец-то я нашел ответ, который работает как с 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")); 

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

+0

Bravo! Работает отлично! Я использую его с локатором xpath, используя текст из списка _ "// * [содержит (текст(), '23')]" _ –

+1

Это почти 2018 год, и мне все еще нужно это делать. – neXus

2

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

1- Использовать clickAt.

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

3- Использовать mouseDownRight.

+0

Спасибо, я пробовал этот путь, но это было не очень хорошее решение, потому что это динамический веб-сайт. – ovejaexiste

1

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

0

Вы можете попробовать использовать класс действия из org.openqa.selenium.interactions:

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

builder.moveToElement(element).click(element); 
builder.perform(); 
1

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

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

    } catch (AWTException e) {e.printStackTrace();} 
Смежные вопросы