8

私は、Selenium でテストしている Web ベースのフロントエンドを持つシステムに取り組んでいます。1 つのページでは、下にスクロールするとコンテンツが動的に読み込まれます (Facebook のフレンド リストからわかるかもしれません)。これは要件の 1 つであるためです。

Selenium Webdriver (私は Chrome を使用しています) で下にスクロールしても、Javascript を使用しても問題ありません。しかし、動的に追加されたコンテンツには問題があります。Webdriver にこれらの要素を見つけさせるにはどうすればよいですか?

コンテンツが読み込まれなくなるまで下にスクロールするために、次のことを試しました。

int oldSize = 0;
int newSize = 0;
do {
  driver.executeScript("window.scrollTo(0,document.body.scrollHeight)");
  newSize = driver.findElementsBy(By.cssSelector("selector").size();
} while(newSize > oldSize);

しかし、最初にページが下にスクロールされ、一部のコンテンツが正しくロードされても、ドライバーの findElementsBy(By) 関数によって検出されません。

誰かがこの問題に直面したことがありますか?? 誰かがその解決策を考え出すのを手伝ってくれたらとてもうれしいです!

よろしく、ベンジャミン

4

3 に答える 3

4

ExpectedConditons で WebDriverWait を使用することをお勧めします。

//scroll down with Javascript first
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("selector")));
//interact with your element
element.click()

Selenium の公式ページ ( http://seleniumhq.org/docs/04_webdriver_advanced.html ) で提供されるガイダンスを ご覧ください。

于 2012-10-02T19:10:58.457 に答える
1

特に流暢な待機を使用してみてください。主な機能は次のとおりです。

タイムアウトとポーリング間隔をその場で構成できる Wait インターフェイスの実装。各 FluentWait インスタンスは、条件を待機する最大時間と、条件をチェックする頻度を定義します。さらに、ユーザーは、ページ上の要素を検索するときの NoSuchElementExceptions など、待機中に特定の種類の例外を無視するように待機を構成できます。

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

説明されているメソッドは、操作できる Web 要素を返します。したがって、アプローチは次のとおりです。1)スクロール後にレンダリングされると予想される要素のセレクターを見つける必要があります。

String cssSelector = "blablabla"

2) js で下にスクロール 3)

WebElement neededElement  = fluentWait(cssSelector);
neededElement.click();
//neededElement.getText().trim();

流暢な待機の詳細については、こちらをご覧ください

于 2012-10-04T14:06:52.873 に答える
0

問題は、動的コンテンツの読み込みが完了するのを待っていることだと思います。findElementsBy の直前に 3 秒間待機してみてください。C# では、コードは Thread.Sleep(3000); になります。

于 2012-10-02T17:14:14.953 に答える