1

WebDriver の get() および isDisplayed() メソッドが期待どおりに機能しません。

ドキュメントに関しては:

これは HTTP GET 操作を使用して行われ、ロードが完了するまでメソッドはブロックされます。

このWait for page load in Selenium のような他の質問で述べたように、get メソッドはページが読み込まれるまで待機する必要があります。

しかし、get() を実行した後、RenderedWebElement の isDisplayed() メソッドは、一部の要素で常に true を返すとは限りません。

考えられる原因は何ですか?

webdrivers のコンテキストで読み込まれることと表示されることの違いについて詳しく説明してください。

4

2 に答える 2

1

最新のUIフレームワーク/APiでは、ページ上の要素を非表示にすることができます。

例:5つの要素を持つページを考えてみましょう。ページが読み込まれると、3つの要素のみがページに表示され、他の2つは非表示になり、何らかのアクションを実行すると、他の2つの要素が表示されます。

次のリンクのデモセクションで確認できる例:

要素のリンクを表示:http://api.jquery.com/show/

要素リンクを非表示にする:http://api.jquery.com/hide/

webDriver get()メソッドを使用すると、webdriverはページが読み込まれるのを待ちます。つまり、ページのすべてのhtmlコンテンツがブラウザに読み込まれるのを待ちます。これは、すべての要素が表示されることを意味するわけではありません。

isDisplayed()を使用すると、webdriverはその要素がページに表示されているかどうかをチェックします。テストケースの実行時に要素がページ上に非表示になる可能性があることがわかっている場合は、要素が表示されているかどうかを確認するための良い方法です。それ以外の場合、テストスクリプトは「アクションを実行するために表示されていない要素」というエラーで失敗します

お役に立てれば。

于 2012-09-25T08:59:05.083 に答える
0

isDisplayed() はあまり良いアプローチではないようです。待機からいくつかのアイデアを得る: 明示的および暗黙的な待機メカニズム:

Explicit wait
WebDriverWait.until(condition-that-finds-the-element)

Implicit wait
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);


Explicit Waits:

WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(new ExpectedCondition<WebElement>(){
    @Override
    public WebElement apply(WebDriver d) {
        return d.findElement(By.id("myDynamicElement"));
    }});

Implicit Waits:

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));

The example what you have given both do exact same thing.. 
In Explicit wait, WebDriver evaluates the condition every 500 
milliseconds by default ..if it is true, it comes out of loop 

Where as in ImplicitWait WebDriver polls the DOM every 500 
milliseconds to see if element is present.. 

Difference is 
1. Obvious - Implicit wait time is applied to all elements in your 
script but Explicit only for particular element 
2. In Explicit you can configure, how frequently (instead of 500 
millisecond) you want to check condition. 
3. In Explicit you can also configure to ignore other exceptions than 
"NoSuchElement" till timeout.. 

ここでさらに情報を得ることができます

また、要素がページにレンダリングされるのを待つために流暢な待機メカニズムを使用します。実際には、css セレクターまたは xpath を関数に渡し、単純に Web 要素を取得します。

public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                }
                }
);
                           return  foo;              }     ;

流暢な待機の説明

これが明らかになることを願っています)

于 2012-09-21T15:18:17.330 に答える