Утверждают, что WebElement отсутствует с помощью Selenium WebDriver с java

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

driver.findElement(By.linkText("Test Search"));

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

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

public static void assertLinkNotPresent (WebDriver driver, String text) throws Exception {
List<WebElement> bob = driver.findElements(By.linkText(text));
  if (bob.isEmpty() == false) {
    throw new Exception (text + " (Link is present)");
  }
}

13 ответов


Не уверен, какую версию selenium вы имеете в виду, однако некоторые команды в selenium * теперь могут это сделать: http://release.seleniumhq.org/selenium-core/0.8.0/reference.html

  • assertNotSomethingSelected
  • assertTextNotPresent

Etc..


Это проще сделать так:

driver.findElements(By.linkText("myLinkText")).size() < 1

Я думаю, что вы можете просто поймать org.openqa.selenium.NoSuchElementException это будет брошено driver.findElement если такого элемента нет:

import org.openqa.selenium.NoSuchElementException;

....

public static void assertLinkNotPresent(WebDriver driver, String text) {
    try {
        driver.findElement(By.linkText(text));
        fail("Link with text <" + text + "> is present");
    } catch (NoSuchElementException ex) { 
        /* do nothing, link is not present, assert is passed */ 
    }
}

существует класс под названием ExpectedConditions:

  By loc = ...
  Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver());
  Assert.assertTrue(notPresent);

с Selenium Webdriver будет что-то вроде этого:

assertTrue(!isElementPresent(By.linkText("Empresas en Misión")));

попробуйте это -

private boolean verifyElementAbsent(String locator) throws Exception {
    try {
        driver.findElement(By.xpath(locator));
        System.out.println("Element Present");
        return false;

    } catch (NoSuchElementException e) {
        System.out.println("Element absent");
        return true;
    }
}

boolean titleTextfield = driver.findElement(By.id("widget_polarisCommunityInput_113_title")).isDisplayed();
assertFalse(titleTextfield, "Title text field present which is not expected");

похоже findElements() только быстро возвращается, если он находит хотя бы один элемент. В противном случае он ждет неявного таймаута ожидания, прежде чем возвращать нулевые элементы - так же, как findElement().

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

static final int TIMEOUT = 10;

public void checkGone(String id) {
    FluentWait<WebDriver> wait = new WebDriverWait(driver, TIMEOUT)
            .ignoring(StaleElementReferenceException.class);

    driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
    try {
        wait.until(ExpectedConditions.numberOfElementsToBe(By.id(id), 0));
    } finally {
        resetTimeout();
    }
}

void resetTimeout() {
    driver.manage().timeouts().implicitlyWait(TIMEOUT, TimeUnit.SECONDS);
}

все еще ищет способ полностью избежать тайм-аута...


Вы использует Arquillian Графен база для этого. Таким примером для вашего случая может быть

Graphene.element(By.linkText(text)).isPresent().apply(driver));

также предоставляет вам кучу хороших API для работы с Ajax, fluent waits, объектами страниц, фрагментами и так далее. Это определенно облегчает разработку тестов на основе селена.


для узла.js я нашел следующий эффективный способ дождаться, пока элемент больше не будет присутствовать:

// variable to hold loop limit
    var limit = 5;
// variable to hold the loop count
    var tries = 0;
        var retry = driver.findElements(By.xpath(selector));
            while(retry.size > 0 && tries < limit){
                driver.sleep(timeout / 10)
                tries++;
                retry = driver.findElements(By.xpath(selector))
            }

Не ответ на сам вопрос, но, возможно, идея для базовых задач:

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

if condition
    renderElement()
else
    renderElementNotShownFlag() // used by Selenium test

findElement проверит источник html и вернет true, даже если элемент не отображается. Чтобы проверить, отображается ли элемент или нет, используйте -

private boolean verifyElementAbsent(String locator) throws Exception {

        boolean visible = driver.findElement(By.xpath(locator)).isDisplayed();
        boolean result = !visible;
        System.out.println(result);
        return result;
}

для appium 1.6.0 и выше

    WebElement button = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//XCUIElementTypeButton[@name='your button']"))));
    button.click();

    Assert.assertTrue(!button.isDisplayed());