2011-08-31 18 views
1

SeleniumServerバージョン:2.5.0、Firefoxバージョン:4.0.1セレン:webdriverを持つFirefoxの:ページのロード問題

私は「新しい質問」のハイパーリンクは、Ajaxの呼び出しによってレンダリングされる状況があります。ページの読み込みが完了したら、このハイパーリンクをクリックして続行する必要があります。私はリンクが存在するまで待ってからそれをクリックするために、以下のようなものを使用しています。

while (!(driver.findElement(By.xpath("//a[text()='New Question']")).isEnabled())) { 
      Thread.sleep(1000); 
} 
driver.findElement(By.xpath("//a[text()='New Question']")).click(); 

これはIEの魅力のように機能します。しかし、Firefoxでは、リンクはクリックされません。

Firefoxは、IEが正しいことをしているように、ページが完全に読み込まれていないときに読み込まれていることをSeleniumに伝えているということです。

クリックが実際に起こっているかどうかを確認するには、ハイパーリンクのonclickにjavascript:alert("Hello From Chandra");を入れます。 IEではポップアップが表示されましたが、Firefoxでは表示されませんでした。

質問:私は間違っているか不十分ですか?回避策はありますか?

ありがとうございました。 PS:詳しい情報が必要な場合はお知らせください。

+0

WebDriverWaitを使ってみましたか? – prestomanifesto

+0

isEnabled()の代わりにisDisplayed()を試しましたか?また、次のように試してみることもできます:while(!(driver.findElement(By.xpath( "// a [text()= '新しい質問']"))isDisplayed())){ Thread.sleep ; } –

答えて

3

whileループは必要ありません。ドライバを初期化するときにimplicitlyWaitを使用できます。これにより、ドライバは90秒間要素の有無をポーリングしてから、要素が見つからない例外をスローします。

driver.manage().timeouts().implicitlyWait(90, TimeUnit.SECONDS); 
driver.findElement(By.xpath("//a[text()='New Question']")).click(); 
+0

はい、うまくいくはずです –

0

おかげNileshとprestomanifestoが、私は試してみました(同様に動作しなかった)whileループに入れる前と「implicitlyWait」「をWebDriverWait」とそれが動作しませんでした。私はもう少し掘り下げて、次のような解決策を見つけたと思う。ページのロードが完了すると、フォーカスを取得する「検索」テキストフィールドがあります。私はフォーカスが '本当に'設定されているかどうかを確認するために 'activeElement'を使いました。

while (!driver.findElement(By.id("searchValue")).isEnabled()) { 
      WebElement currActiveElement = driver.switchTo().activeElement(); 
      if (currActiveElement.getAttribute("id").equals("searchValue")) { 
       break; 
      } 
      Thread.sleep(1000); 
     } 
0

あなたはまだ()JSスクリプト(さらにロードを停止するように言うために期待される要素の5-8秒(可視性のために、ISENABLEDを待っていない)の存在を待って、その後window.stop送信することで、スクリプトの実行を高速化することができます(ページの読み込みのタイムアウト例外を5〜8秒後に待つことなく)window.stop()を呼び出すwindow.stop()

ページがレイジーローディング手法を採用していない場合要素のどれかがレンダリングに時間がかかる場合は遅くなります)。

関連する問題