0

要素が表示されているかどうかを Firefox Webdriver が正しく判断できないという問題に直面しています。

wait.ignoring(UnhandledAlertException.class).until(ExpectedConditions.visibilityOfElementLocated(By.id("ad")));

ここで、要素がサイトのソースにあるのに表示されていない Web サイトをテストしている場合 (たとえば、その前に別の要素があるため) はどうなるでしょうか。私が集めたものから、visibilityOfElementLocatedメソッドは要素の幅と高さが >0 かどうかのみをチェックしますね。悪いレイアウトや間違った z-index などを考慮して、要素がサイトを閲覧しているユーザーに本当に表示されているかどうかを確認する方法はありますか? これは本当に素晴らしいでしょう...

ありがとうございました!

4

2 に答える 2

3

visibilityOfElementLocated の代わりに presentOfElementLocated を実際にテストしようとしているのではありませんか? visibilityOfElementLocated は、検索するロケーターに display CSS 属性が設定されている場合にのみ機能します。「.findElements(By).size() > 0」を使用して「elementExists」をテストする人もいますが、例外の処理が必要な別の方法を次に示します。

これはやり過ぎかもしれませんが、独自の可視性関数を作成できます。この例では、「elementExists()」と呼んでいます。「presenceOf」をテストしますが、「visiblity」例外がある場合はそれを処理します。

public boolean elementExists( By locator ) {   
    WebElement foo = null;
    try {
        foo = this.getElementByLocator( locator, 10 );
     } catch ( TimeoutException te) {
        System.out.println("There was a timeout looking for element: " + 
            locator.toString() );
        //Swallow exception: ExceptionUtils.getMessage(te);
        return false;
    } catch ( ElementNotVisibleException env ) {
        System.out.println("The element was found but is invisible: " +
            locator.toString() );
        //Swallow exception: ExceptionUtils.getMessage(env);
        return false;
    }
    if ( foo == null ) {
        return false;
    } else {
        return true;
    }
}

public WebElement getElementByLocator( By locator, int timeout ) {
    System.out.println("Calling method getElementByLocator: " + 
        locator.toString() );
    int interval = 5;
    if ( timeout <= 20 ) interval = 3;
    if ( timeout <= 10 ) interval = 2;
    if ( timeout <= 4 ) interval = 1;
    Wait<WebDriver> wait = new FluentWait<WebDriver>( se.myDriver )
        .withTimeout(timeout, TimeUnit.SECONDS)
        .pollingEvery(interval, TimeUnit.SECONDS)
        .ignoring( NoSuchElementException.class, 
                       StaleElementReferenceException.class );
    WebElement we = wait.until( ExpectedConditions
           .presenceOfElementLocated( locator ) );
    return we;
}
于 2013-11-15T22:20:27.577 に答える
0
protected void asChk(By what, int presence) {
        asChk(what, presence, false);
}

protected void asChk(By what, int presence, boolean isGreater) {
    List<WebElement> boxesHeader  = driver.findElements(what);
    if(isGreater) 
    assertTrue(boxesHeader.size() >= presence);
    else 
    assertTrue(boxesHeader.size() == presence);
    }   

このコードを試してください。

それの使い方:

asChk(By. localizator (*localizatorDomValue*), 1);

また:

asChk(By. localizator (*localizatorDomValue*), 1, true); - 複数あることはわかっているが、正確な数がわからない場合。

敬具、 ミハウ・フェリジャンチュク

于 2013-11-15T11:17:34.807 に答える