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


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

Selenium で待機が必要なのはなぜですか?

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

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

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

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

Selenium Web ドライバーの待機

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

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

Selenium での暗黙的な待機

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

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

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

Selenium WebDriver で暗黙的な待機を宣言するには:

暗黙的な待機構文:

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

コードの説明

上記の例では、

フォロを検討してくださいwing コード:

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

暗黙的な待機は 2 つのパラメーターを受け入れます。最初のパラメーターは時間を整数値として受け入れ、XNUMX 番目のパラメーターは SECONDS、MINUTES、MILISECOND、MICROSECONDS、NANOSECONDS、DAYS、HOURS などの時間測定値を受け入れます。

Selenium での明示的な待機

また, Selenium での明示的な待機 Web ドライバーに特定の条件 (予期される条件) を待機するか、最大時間を超えるまで待機するように指示するために使用されます。wing 「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();
	}
	
}

コードの説明

フォロを検討してくださいwing コード:

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」クラスは、「予想される条件」を満たしており、条件は「位置する要素の可視性"

次のことwing Selenium Explicit Wait で使用できる予期される条件です。

  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 での流暢な待機 Web ドライバーが条件を待機する最大時間と、条件が完了する前に条件をチェックする頻度を定義するために使用されます。wing 「ElementNotVisibleException」例外。 オブジェクトが見つかるかタイムアウトが発生するまで、Web 要素を定期的にチェックします。

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

要素が異なる時間間隔で読み込まれるシナリオを考えてみましょう。 要素は 10 秒以内、20 秒以内、または明示的に 20 秒の待機を宣言した場合はそれ以上かかる可能性があります。 指定された時間まで待機します。wing 例外。 このようなシナリオでは、fluent wait が使用するのに理想的な待機です。これは、要素が見つかるか、最後のタイマーが切れるまで、さまざまな頻度で要素を見つけようとします。

流暢な待機構文:

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

上記のコードは Selenium v​​3.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() ;
	}
}

コードの説明

フォロを検討してくださいwing コード:

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

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

フォロを検討してくださいwing コード:

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 要素は、Web ページ上の Selenium リンクに他なりません)。

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

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

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

Following Selenium における暗黙的な待機と明示的な待機の主な違いは次のとおりです。

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

要約

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

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