2012-10-02 25 views
6

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

JavascriptでSelenium Webdriver(Chromeを使用しています)をスクロールしても問題ありません。しかし、動的に追加されるコンテンツには問題があります。 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)関数。

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

よろしく、ベンジャミン

+0

私はアヤックス経由で(要素をロードするために、下にスクロールする必要があります)。私が言ったように、私はChromedriverを使います。 –

答えて

0

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

+0

良いアイデア、それを試してみました... findElementsはまだ最初からロードされた要素をdeliveres –

+0

@ベンジャミン:5秒のような長い時間を試しましたか?要素が存在するときにCSSセレクターが動作することをSeleniumIDEで確認できますか?私はIDEでテストを行いますが、スクロールをシミュレートするのは難しいです - あなたはkeyPressを試すことができます| xpath =/html/body/| 34(キーコード34がpagedownされています)、waitForElementPresent ... – pellucid

+0

とにかくセレン化物を使っていません... –

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() 

セレン公式ページが提供する指針を見てみましょう: http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

+1。悪いアプローチではありませんが、私はこのケースの流暢な待機をよく選択するようです。 –

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)あなたは流暢な待ち時間についての詳細情報を取得することができます

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

JS 3)でスクロールダウンhere

+1

私には1つの質問しかありません - 機能テンプレートがないと考えると、どのように新しい機能をJavaで実行しますか?上記の例は、セレンのjavadocsでも言及されていますが、javacはシンボルを見つけることができません:class Function - 上記のアプローチをバットからまっすぐに使用できるように私が掴んでいなかった部分を理解したいと思います。 – Vatsala

+0

あなたは私にリルビットを明確にすることができますか?Javaで関数テンプレートを書くと何が言いますか? –

+1

「関数テンプレート」とはどういう意味か分かりませんが、新しい関数(){ wait.untilに渡される匿名クラスのインスタンスが作成されます 関数はselnium APIで定義されています。 until(com.google.common.base.Function がTrue) 次のいずれかが発生するまで、このインスタンスの入力値が繰り返し適用されます。関数はnullもfalseも返さず、関数は無視されない例外をスローします。現在のスレッドが中断されました 問題が発生しました - IDEセットアップを正しくセットアップしていないようです(IMHO) –

関連する問題