42

私が書いたテストでは、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)");
  }
}
4

16 に答える 16

43

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

driver.findElements(By.linkText("myLinkText")).size() < 1
于 2012-11-30T14:34:22.310 に答える
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 */ 
    }
}
于 2010-07-20T09:01:36.463 に答える
11

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

  • assertNotSomethingSelected
  • assertTextNotPresent

等..

于 2012-02-17T01:29:24.183 に答える
8

と呼ばれるクラスがありますExpectedConditions

  By loc = ...
  Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver());
  Assert.assertTrue(notPresent);
于 2013-06-10T14:35:48.757 に答える
4

これを試して -

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;
    }
}
于 2012-10-01T07:01:27.437 に答える
4

Selenium Webdriverを使用すると、次のようになります。

assertTrue(!isElementPresent(By.linkText("Empresas en Misión")));
于 2013-10-03T22:52:16.183 に答える
2

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

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

于 2017-10-04T21:18:34.933 に答える
1
boolean titleTextfield = driver.findElement(By.id("widget_polarisCommunityInput_113_title")).isDisplayed();
assertFalse(titleTextfield, "Title text field present which is not expected");
于 2012-07-31T06:28:52.863 に答える
1

このためにArquillianGrapheneフレームワークを利用できます。したがって、あなたの場合の例は次のようになります

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

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

于 2013-06-28T09:32:08.060 に答える
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))
            }
于 2016-05-25T07:07:35.393 に答える
0

まさにその質問に対する答えではありませんが、おそらく根本的なタスクのアイデアです。

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

if condition
    renderElement()
else
    renderElementNotShownFlag() // used by Selenium test
于 2018-09-20T13:47:12.280 に答える
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

于 2019-05-01T07:59:59.720 に答える
0

私が最もよく見つけた方法(およびAllureレポートに失敗として表示する方法)は、findelementをtry-catchし、catchブロックで、次のようにassertTrueをfalseに設定することです。

    try {
        element = driver.findElement(By.linkText("Test Search"));
    }catch(Exception e) {
        assertTrue(false, "Test Search link was not displayed");
    }
于 2020-05-07T04:42:50.357 に答える
0

これは私にとって最良のアプローチです

public boolean isElementVisible(WebElement element) {
    try { return element.isDisplayed(); } catch (Exception ignored) { return false; }
}
于 2022-01-31T17:29:22.297 に答える
-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;
}
于 2012-10-01T09:23:30.000 に答える
-1

appium1.6.0以降の場合

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

    Assert.assertTrue(!button.isDisplayed());
于 2016-11-29T09:43:33.793 に答える