Selenium WebDriver - определить, является ли элемент кликабельным (т.е. не скрыт модальным лайтбоксом dojo) - PullRequest
16 голосов
/ 26 марта 2012

Я пишу автоматизированные скрипты для тестирования веб-приложений, которые очень тяжело работают на ajax. Например, при сохранении настроек отображается модальное диалоговое окно с текстом «Saving...», в то время как лайтбокс скрывает остальную часть страницы.

Мои тестовые сценарии пытаются щелкнуть следующую ссылку в тесте, прежде чем сообщение исчезнет. Это почти всегда работает при вождении Firefox, но при вождении Chrome отображается следующая ошибка:

Exception in thread "main" org.openqa.selenium.WebDriverException: Element is not clickable at point (99.5, 118.5). Other element would receive the click: <div class="dijitDialogUnderlay _underlay" dojoattachpoint="node" id="lfn10Dijit_freedom_widget_common_environment_Dialog_8_underlay" style="width: 1034px; height: 1025px; "></div> (WARNING: The server did not provide any stacktrace information)

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

Проверка того, что лайтбокс больше не существует, является недопустимым обходным решением, потому что иногда существует несколько уровней модальных диалогов и лайтбоксов, и нет простого способа различить их.

Есть ли способ в Selenium определить, является ли элемент кликабельным (другие элементы не скрывают его)? Попробовать / поймать - это обходной путь, но я бы предпочел сделать правильную проверку, если это возможно.

Ответы [ 5 ]

19 голосов
/ 27 марта 2012

Использовать условия WebDriverWait.

    WebDriverWait wait = new WebDriverWait(yourWebDriver, 5);
    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//xpath_to_element")));

Webdriver будет ждать в течение 5 секунд, пока ваш элемент не будет нажат.

6 голосов
/ 14 января 2014

Вы можете использовать метод ExpectedConditions.invisibilityOfElementLocated(By by), который ожидает, пока элемент не станет невидимым или не появится в DOM.

WebDriverWait wait = new WebDriverWait(yourWebDriver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("yourSavingModalDialogDiv")));

Таким образом, в зависимости от того, сколько времени ваш модальный диалог занимает, чтобы стать невидимым или выйти из DOM, веб-драйвер будет ждать. Время ожидания не более 10 секунд.

2 голосов
/ 27 марта 2012

Вы можете создать clickUntil функцию / метод, который заставляет WebDriver ждать, пока элемент будет активирован по клику с таймаутом. Он будет пытаться щелкнуть по элементу и выбрасывать сообщения об ошибках «Элемент не активен» каждый раз, пока не произойдет щелчок или истечение времени ожидания.

Не знаю, как написать это в додзё, но это идея.

0 голосов
/ 11 августа 2017

У меня тоже есть такие же проблемы, но я проверял много входных данных на сайте. Один кликабельный, который я тестировал, а другой - не кликабельный, просто пропустил. Я сделал это с помощью try () catch () Просто код:

for(){ // for all my input
try {
    driver.findElement(By.xpath("...."
                                + "//input)["+(i+1)+"]")).click();

  ... tests...


} catch(Exception e) {
     if(e.getMessage().contains("is not clickable at point")) {

          System.out.println(driver.findElement(By.xpath(locator)).
          getAttribute("name")+" are not clicable");
     } else {
          System.err.println(e.getMessage());
     }
}

И более элегантно:

 @SuppressWarnings("finally")
       public boolean tryClick(WebDriver driver,String locator, locatorMethods m) {

           boolean result = false;
           switch (m) {

           case xpath:
            try {
                driver.findElement(By.xpath(locator)).click();
                result= true;
            } catch (Exception e) {
                   if(e.getMessage().contains("is not clickable at point")) {
                       System.out.println(driver.findElement(By.xpath(locator)).getAttribute("name")+" are not clicable");
                   } else {
                       System.err.println(e.getMessage());
                   }
            } finally {
                break;
            }
        case id:
            try {   
                driver.findElement(By.id(locator)).click();
                return true;
            } catch (Exception e) {
               if(e.getMessage().contains("is not clickable at point")) {
                   System.out.println(driver.findElement(By.id(locator)).getAttribute("name")+" are not clicable");   
               } else {
                   System.err.println(e.getMessage());
               }
            } finally {
                break;
            }

          default:
              System.err.println("Unknown locator!");

        }
           return result;
  }
0 голосов
/ 23 ноября 2016

В Scala:

  1. Стандартный код для ожидания (видимость / невидимость)

    (new WebDriverWait(remote, 45)).until(
        ExpectedConditions.visibilityOf(remote.findElement(locator))
    )
    Thread.sleep(3000)
    
  2. Больше видимости в журналах:

    while (remote.findElement(locator).isDisplayed) {
        println(s"isDisplayed: $ii $a : " + remote.findElement(locator).isDisplayed)
        Thread.sleep(100)
    }
    
  3. Если у вас есть асинхронные процессы JavaScript, используйте веб-элементы с отметкой времени:

    val oldtimestamp = remote.findElements(locator).get(0).getAttribute("data-time-stamp")
    
    while (oldtimestamp == remote.findElements(locator).get(0).getAttribute("data-time-stamp")) {
        println("Tstamp2:" + remote.findElements(locator).get(0).getAttribute("data-time-stamp"))
        Thread.sleep(200)
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...