2016-04-13 13 views
12

JavaとSelenium Webドライバを使用していくつかのテストケースを自動化しようとしています。私は次のシナリオを持っています:セレン - ページが完全にロードされるまで待つ方法

  • 「製品」という名前のページがあります。 'Product'ページの 'View Details'リンク をクリックすると、アイテムの詳細を含むポップアップ(モーダルダイアログ)が表示されます。
  • ポップアップで「閉じる」ボタンをクリックすると、ポップアップが閉じて、 ページが自動的に更新されます(ページが再ロードされ、 の内容は変更されません)。
  • ポップアップを閉じると、同じページの の[項目を追加]ボタンをクリックする必要があります。しかし、Webdriverが「Add Item」ボタンを見つけようとしたときに、インターネットの速度が速すぎる場合は 、webdriverは 要素を見つけてクリックできます。

  • しかし、インターネットが遅い場合、webdriverをとすぐボタンをwebdriverをクリック、 ページが更新され、StaleElementReferenceExceptionが発生したとして ページの更新前にボタンを見つけ、しかし。ページが再ロードされる 前でも(ページ内のコンテンツをリロード前後同じであるため)とStaleElementReferenceException

  • が異なる待機が使用される場合でも、すべての待機条件が真になる が生じます。

Thread.sleep(3000);が使用されている場合は、[Add Item]ボタンをクリックする前にテストケースが正常に機能します。この問題の他の回避策はありますか?あなたは組み合わせることができます

+1

私はセレン暗黙の待機を使用しますが、それは問題 – stackoverflow

答えて

19

3の答え、:driver.manage().timeouts().implicitlyWait()

1)すぐにウェブ・ドライバ・インスタンスを作成した後、暗黙の待ち時間を設定します。これは、すべてのページのナビゲーションまたはページのリロード時にページが完全にロードされるまで待機しようとします。

2.)ページ移動後、が返されるまでJavaScript return document.readyStateを呼び出します。 Webドライバインスタンスは、JavaScript実行プログラムとして機能することができます。サンプルコード:2後

C#の

new WebDriverWait(driver, MyDefaultTimeout).Until(
    d => ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState").Equals("complete")); 

のJava

new WebDriverWait(firefoxDriver, pageLoadTimeout).until(
      webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete")); 

3))URLは、あなたが期待するパターンに一致するかどうかを確認。

+1

を解決していませんが、一例をお願いできます:あなたはリロード要素をクリックする前に陳腐化する「アイテムを追加」要素のために待つことができる。この場合 Javaでポイント2を実装するコード – stackoverflow

+0

申し訳ありませんが、私はC#の男です。私はあなたにC#のサンプルコードを与えることができます。私はそれを私の答えに加えます。 –

+0

document.readyStateを確認するのは素晴らしいです。投票してください!〜 –

0

はい(あなたのシナリオをとって)最初に「アイテムを追加」をクリックしてポップアップを閉じると、ページが更新されて「アイテムの追加」のために定義された参照が表示されます。メモリに失われているので、あなたは再び

はセレン1の遅延を使用するには、2つの異なる方法があります

// clicking on view details 
driver.findElement(By.id("")).click(); 
// closing the pop up 
driver.findElement(By.id("")).click(); 


// and when you try to click on Add Item 
driver.findElement(By.id("")).click(); 
// you get stale element exception as reference to add item is lost 
// so to overcome this you have to re identify the locator strategy for add item 
// Please note : this is one of the way to overcome stale element exception 

// Step 1 please add a universal wait in your script like below 
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); // just after you have initiated browser 
-2

ダミーのコードでそれを理解して「項目の追加」のロケータ戦略を再定義する必要があり、これを克服するために最も一般的に使用されています。これを試してください:

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

あなたがそれを使用することができます二つ目は、単にあなたがサンプルコードをしたいresult.ifあなたはあなたの欲求を得ることができます そのメソッドを使用してキャッチする方法を試しているふてくされて私を私に連絡すること自由に感じますuは多くの方法でこれを行うことができます

1

追加項目をクリックする前に、関連するコードを提供します。

WebDriverWait wait = new WebDriverWait(driver, 40); 
wait.until(ExpectedConditions.elementToBeClickable(By.id("urelementid")));// instead of id u can use cssSelector or xpath of ur element. 


or 

wait.until(ExpectedConditions.visibilityOfElementLocated("urelement")); 

uは、前のページ要素の見えないまで待ちたい場合uはまた、このように待つことができます。

wait.until(ExpectedConditions.invisibilityOfElementLocated("urelement")); 

ここでは、waitとそのドキュメントに使用できるすべてのselenium webdriver apiが見つかります。

https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html

4

あなたの「追加」ボタンをクリックする前に再ロードするページを待つ必要があると思われます。

WebDriverWait wait = new WebDriverWait(driver, 20); 
By addItem = By.xpath("//input[.='Add Item']"); 

// get the "Add Item" element 
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(addItem)); 

//trigger the reaload of the page 
driver.findElement(By.id("...")).click(); 

// wait the element "Add Item" to become stale 
wait.until(ExpectedConditions.stalenessOf(element)); 

// click on "Add Item" once the page is reloaded 
wait.until(ExpectedConditions.presenceOfElementLocated(addItem)).click(); 
関連する問題