断言使用Selenium WebDriver和java不存在WebElement

问题描述 投票:39回答:14

在我编写的测试中,如果我想断言WebElement存在于页面上,我可以做一个简单的事情:

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)");
  }
}
java selenium-webdriver assertion
14个回答
9
投票

不确定你指的是哪种版本的硒,但是selenium *中的一些命令现在可以这样做:http://release.seleniumhq.org/selenium-core/0.8.0/reference.html

  • assertNotSomethingSelected
  • assertTextNotPresent

等等..


0
投票

对于node.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))
            }

0
投票

这不是对这个问题的答案,而是对潜在任务的一个想法:

当您的站点逻辑不应显示某个元素时,您可以插入一个您检查的不可见的“flag”元素。

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

0
投票

请使用Selenium“until.stalenessOf”和Jasmine断言查找以下示例。当元素不再附加到DOM时,它返回true。

const { Builder, By, Key, until } = require('selenium-webdriver');

it('should not find element', async () => {
   const waitTime = 10000;
   const el = await driver.wait( until.elementLocated(By.css('#my-id')), waitTime);
   const isRemoved = await driver.wait(until.stalenessOf(el), waitTime);

   expect(isRemoved).toBe(true);
});

对于参考:Selenium:Until Doc


-1
投票

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;
}

-1
投票

适用于app 1.6.0及以上版本

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

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

36
投票

这样做更容易:

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

12
投票

我认为如果没有这样的元素,你可以抓住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 */ 
    }
}

6
投票

有一个名为ExpectedConditions的类:

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

4
投票

使用Selenium Webdriver会是这样的:

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

2
投票

试试这个 -

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;
    }
}

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

1
投票

看起来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);
}

仍然在寻找一种完全避免超时的方法......


0
投票

你可以为此启用Arquillian Graphene框架。你的案例就是这样的例子

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

还为您提供了一堆很好的API,用于处理Ajax,流畅的等待,页面对象,片段等。它肯定简化了基于Selenium的测试开发。

© www.soinside.com 2019 - 2024. All rights reserved.