Selenium 待機 – 暗黙的、明示的、および流動的な待機


In Selenium, テスト実行において「待機」は重要な役割を果たします。このチュートリアルでは、さまざまな側面と、暗黙的待機と明示的待機の違いを学びます。 Selenium.

なぜ待機が必要なのか Selenium?

ほとんどの Web アプリケーションは次を使用して開発されています。 アヤックスJavascript。 ページがブラウザによって読み込まれるとき、操作したい要素はさまざまな時間間隔で読み込まれる可能性があります。

要素の特定が困難になるだけでなく、要素が見つからない場合は「」がスローされます。ElementNotVisibleException" 例外。使用する Selenium 待ってください、この問題は解決できます。

テストで暗黙的待機と明示的待機の両方を使用する必要があるシナリオを考えてみましょう。 暗黙的な待機時間が 20 秒に設定され、明示的な待機時間が 10 秒に設定されているとします。

ある要素を見つけようとしているとします。 「予想される条件」 「(明示的な待機)、要素が明示的な待機(10秒)で定義された時間枠内に見つからない場合、暗黙的な待機(20秒)で定義された時間枠を使用して「ElementNotVisibleException"

Selenium Web ドライバーの待機

  1. 暗黙的な待機
  2. 明示的な待機

このチュートリアルでは、さまざまな種類の待機について学びます。 Selenium:

暗黙的な待機 Selenium

この 暗黙的な待機 Selenium は、Web ドライバーに「No Such Element Exception」をスローする前に一定時間待機するように指示するために使用されます。デフォルト設定は 0 です。時間を設定すると、Web ドライバーは例外をスローする前にその時間だけ要素を待機します。

Selenium Web Driver は、暗黙的な待機のアイデアを次から借用しています。 Watir.

以下の例では、10 秒の時間枠で暗黙的な待機を宣言しています。 これは、要素がその時間枠内に Web ページ上に存在しない場合、例外がスローされることを意味します。

暗黙的な待機を宣言するには Selenium ウェブドライバー:

暗黙的な待機構文:

driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);
package guru.test99;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class AppTest {
	
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("http://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.equals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	//close browser
	driver.close();
}
}

コードの説明

上記の例では、

次のコードを検討してください:

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

暗黙的な待機は 2 つのパラメータを受け入れます。最初のパラメータは時間を整数値として受け入れ、XNUMX 番目のパラメータは秒、分、ミリ秒、マイクロ秒、ナノ秒、日、時間などの単位での時間測定を受け入れます。

明示的な待機 Selenium

この 明示的な待機 Selenium は、Web ドライバーに、特定の条件 (予期される条件) または最大時間超過を待機してから “ElementNotVisibleException” 例外をスローするように指示するために使用されます。これはインテリジェントな待機方法ですが、指定された要素にのみ適用できます。動的に読み込まれた Ajax 要素を待機するため、暗黙的な待機よりも優れたオプションが提供されます。

明示的に待機を宣言したら、「」を使用する必要があります。予想される条件” または、次を使用して状態をチェックする頻度を設定できます。 流暢な待機。 最近、実装中に使用しています Thread.Sleep() 一般的には使用はお勧めしません

以下の例では、「」の参照待機を作成しています。WebDriverWait” クラスと” を使用したインスタンス化webdriver」を参照し、最大 20 秒の時間枠を与えています。

明示的な待機構文:

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,TimeOut);
package guru.test99;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

public class AppTest2 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	WebDriverWait wait=new WebDriverWait(driver, 20);
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("http://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	WebElement guru99seleniumlink;
	guru99seleniumlink= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath( "/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
	guru99seleniumlink.click();
	}
	
}

コードの説明

次のコードを検討してください:

WebElement guru99seleniumlink;
guru99seleniumlink = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
guru99seleniumlink.click();

この WebDriver 待機の例では、「」で定義された時間待機します。WebDriverWait” クラスまたは”予想される条件」のいずれかが先に発生します。

上記 Java コードは、「」で定義されているように、20 秒の時間枠で要素を待機していることを示しています。WebDriverWait」クラスは、「予想される条件」を満たしており、条件は「位置する要素の可視性"

以下は、以下の場合に使用できる予想される条件です。 Selenium 明示的な待機

  1. アラートは存在します()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. FrameToBeAvaliableAndSwitchToIt()
  6. invisibilityOfTheElementLocated()
  7. invisibilityOfElementWithText()
  8. presentOfAllElementsLocatedBy()
  9. presentOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. タイトルは()
  14. titleContains()
  15. 可視性Of()
  16. すべての要素の可視性()
  17. 可視性OfAllElementsLocatedBy()
  18. 可視性OfElementLocated()

流暢な待機 Selenium

この 流暢な待機 Selenium ウェブ ドライバーが条件を待機する最大時間と、「ElementNotVisibleException」例外をスローする前に条件をチェックする頻度を定義するために使用されます。オブジェクトが見つかるかタイムアウトが発生するまで、一定の間隔でウェブ要素をチェックします。

対応周波数: 一定の時間間隔で状態を検証/チェックするための時間枠で繰り返しサイクルを設定します。

要素が異なる時間間隔でロードされるシナリオを考えてみましょう。要素は 10 秒、20 秒、または明示的に 20 秒の待機を宣言した場合はそれ以上の期間でロードされる可能性があります。例外をスローする前に、指定された時間まで待機します。このようなシナリオでは、Fluent 待機が理想的な待機です。これは、要素が見つかるか最終タイマーが切れるまで、さまざまな頻度で要素の検索を試行するためです。

流暢な待機構文:

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(timeout, SECONDS)
.pollingEvery(timeout, SECONDS)
.ignoring(Exception.class);

上記のコードは で非推奨になりました Selenium v3.11以降。使用する必要があります

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(Duration.ofSeconds(SECONDS))
.pollingEvery(Duration.ofSeconds(SECONDS))
.ignoring(Exception.class);

package guru.test99;

import org.testng.annotations.Test;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

public class AppTest3 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	driver = new ChromeDriver();
	// launch Chrome and redirect it to the Base URL
	driver.get("http://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
		}
	
	Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
			.withTimeout(30, TimeUnit.SECONDS) 			
			.pollingEvery(5, TimeUnit.SECONDS) 			
			.ignoring(NoSuchElementException.class);
	WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>(){
	
		public WebElement apply(WebDriver driver ) {
			return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));
		}
	});
	//click on the selenium link
	clickseleniumlink.click();
	//close~ browser
	driver.close() ;
	}
}

コードの説明

次のコードを検討してください:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
	.withTimeout(30, TimeUnit.SECONDS) 			
	.pollingEvery(5, TimeUnit.SECONDS) 			
	.ignoring(NoSuchElementException.class);				

上記の例では、30 秒のタイムアウトで流暢な待機を宣言しており、「」を無視することで頻度が 5 秒に設定されています。NoSuchElementException

次のコードを検討してください:

public WebElement apply(WebDriver driver) {
        return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));

ページ上の Web 要素を識別する新しい関数を作成しました。 (例: ここでの Web 要素は、 Selenium ウェブページ上のリンク)。

頻度は5秒に設定され、最大時間は30秒に設定されています。つまり、これは、最大5秒間、30秒ごとにWebページ上の要素をチェックすることを意味します。要素がこの時間枠内にある場合は操作を実行し、そうでない場合は「ElementNotVisibleException

また、チェックしてください:- Selenium 初心者向け IDE チュートリアル

暗黙的な待機と明示的な待機の違い

以下は、暗黙的な待機と明示的な待機の主な違いです。 Selenium:

暗黙的な待機 明示的な待機
暗黙的な待機時間はスクリプト内のすべての要素に適用されます 明示的な待機時間は、当社が意図した要素にのみ適用されます。
暗黙的な待機では、次のことが必要です。 検索する要素に「ExpectedConditions」を指定します Explicit Wait では、配置する要素に「ExpectedConditions」を指定する必要があります。
で指定された時間枠で要素が配置されている場合に使用することをお勧めします。 Selenium 暗黙的な待機 要素の読み込みに時間がかかる場合や、(visibilityOfElementLocated、elementToBeClickable、elementToBeSelected) などの要素のプロパティを確認する場合にも使用することをお勧めします。

まとめ

暗黙的、明示的、およびフルエントな待機は、以下で使用されるさまざまな待機です。 Selenium。これらの待機の使用法は、さまざまな時間間隔でロードされる要素に完全に基づいています。 Thread.Sleep() を使用することは常に推奨されません。 テスト アプリケーションやフレームワークの構築。

また、チェックしてください:- Selenium 初心者向けチュートリアル: 7 日間で WebDriver を学ぶ