web-dev-qa-db-ja.com

javaでSelenium WebDriverを使用してWebElementが存在しないことをアサートします

私が書いたテストで、WebElementがページに存在することを表明したい場合、簡単にできます。

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

これは、存在する場合は通過し、存在しない場合は爆撃します。しかし、リンクがnot存在することを断言したいと思います。上記のコードはブール値を返さないため、これを行う方法はわかりません。

[〜#〜] edit [〜#〜]これが私自身の修正方法を思いついた方法です。まだもっと良い方法があるのではないかと思っています。

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)");
  }
}
39
True_Blue

参照しているSeleniumのバージョンはわかりませんが、Selenium *の一部のコマンドでこれを実行できるようになりました。 http://release.seleniumhq.org/Selenium-core/0.8.0/reference.html

  • assertNotSomethingSelected
  • assertTextNotPresent

等..

9
Andre

これを行うのは簡単です:

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

そのような要素がない場合、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 */ 
    }
}
12
Sergii Pozharov

ExpectedConditionsというクラスがあります:

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

Selenium Webdriverでは、次のようになります。

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

これを試して -

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

findElements()は、少なくとも1つの要素が見つかった場合にのみ迅速に戻るように見えます。それ以外の場合は、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);
}

それでもタイムアウトを完全に回避する方法を探しています...

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

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

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
QualiT

Arquillian Graphene このフレームワークを利用できます。あなたの場合の例は

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

また、Ajax、流fluentな待機、ページオブジェクト、フラグメントなどを操作するための一連のNice APIも提供します。これにより、Seleniumベースのテスト開発が大幅に容易になります。

0
Petr Mensik

質問に対する答えではなく、基本的なタスクのアイデアかもしれません:

サイトロジックに特定の要素を表示しない場合は、チェックする非表示の「フラグ」要素を挿入できます。

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