Лучший способ проверить, что элемент отсутствует с помощью Selenium WebDriver с java

Im пытается код ниже, но, похоже, он не работает... Кто-нибудь может показать мне лучший способ сделать это?

public void verifyThatCommentDeleted(final String text) throws Exception {
    new WebDriverWait(driver, 5).until(new ExpectedCondition<Boolean>() {
            @Override
            public Boolean apply(WebDriver input) {
                try {
                    input.findElement(By.xpath(String.format(
                            Locators.CHECK_TEXT_IN_FIRST_STATUS_BOX, text)));
                    return false;
                } catch (NoSuchElementException e) {
                    return true;
                }
            }
        });
    }

6 ответов


Я обычно пару методов (в паре) для проверки наличия или отсутствия элемента:

public boolean isElementPresent(By locatorKey) {
    try {
        driver.findElement(locatorKey);
        return true;
    } catch (org.openqa.selenium.NoSuchElementException e) {
        return false;
    }
}

public boolean isElementVisible(String cssLocator){
    return driver.findElement(By.cssSelector(cssLocator)).isDisplayed();
}

обратите внимание, что иногда селен может найти элементы в DOM, но они могут быть невидимыми, следовательно, селен не сможет взаимодействовать с ними. Поэтому в этом случае помогает метод проверки видимости.

Если вы хотите дождаться элемента, пока он не появится, лучшим решением, которое я нашел, является использование fluent wait:

public WebElement fluentWait(final By locator){
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(30, TimeUnit.SECONDS)
            .pollingEvery(5, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class);

    WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
        public WebElement apply(WebDriver driver) {
            return driver.findElement(locator);
        }
    });

    return foo;
};

надеюсь, что это помогает)


вместо выполнения findElement выполните findElements и проверьте, что длина возвращаемых элементов равна 0. Вот как я использую WebdriverJS, и я ожидаю, что то же самое будет работать в Java


невозможно прокомментировать руководство по метеоритным испытаниям, так как у меня нет репутации, но я хотел привести пример, который занял у меня довольно много времени, чтобы понять:

Assert.assertEquals(0, wd.findElements(By.locator("locator")).size());

это утверждение проверяет, что в DOM нет совпадающих элементов, и возвращает значение нуля, поэтому утверждение проходит, когда элемент отсутствует. Кроме того, он потерпел бы неудачу, если бы присутствовал.


использовать findElements вместо findElement.

findElements вернет пустой список, если вместо исключения не найдено совпадающих элементов. Кроме того, мы можем убедиться, что элемент присутствует или нет.

Ex: элементы списка = драйвер.findElements (By.yourlocatorstrategy);

if(elements.size()>0){
    do this..
 } else {
    do that..
 }

int i=1;

while (true) {
  WebElementdisplay=driver.findElement(By.id("__bar"+i+"-btnGo"));
  System.out.println(display);

  if (display.isDisplayed()==true)
  { 
    System.out.println("inside if statement"+i);
    driver.findElement(By.id("__bar"+i+"-btnGo")).click();
    break;
  }
  else
  {
    System.out.println("inside else statement"+ i);
    i=i+1;
  }
}

WebElement element = driver.findElement(locator);
Assert.assertNull(element);

приведенное выше утверждение пройдет, если элемент отсутствует.