انتظار السيلينيوم - الانتظار الضمني والصريح والطلاق


في السيلينيوم، يلعب "الانتظار" دورًا مهمًا في تنفيذ الاختبارات. في هذا البرنامج التعليمي، سوف تتعلم الجوانب المختلفة والفرق بين الانتظار الضمني والصريح في السيلينيوم.

لماذا نحتاج إلى الانتظار في السيلينيوم؟

يتم تطوير معظم تطبيقات الويب باستخدام اياكس و Javascript. عندما يتم تحميل الصفحة بواسطة المتصفح، قد يتم تحميل العناصر التي نريد التفاعل معها على فترات زمنية مختلفة.

ليس فقط أن هذا يجعل من الصعب تحديد العنصر ولكن أيضًا إذا لم يتم تحديد موقع العنصر فسوف يلقي "ElementNotVisibleException" استثناء. باستخدام السيلينيوم ويتس، يمكننا حل هذه المشكلة.

دعونا نفكر في سيناريو يتعين علينا فيه استخدام الانتظار الضمني والصريح في اختبارنا. افترض أنه تم تعيين وقت الانتظار الضمني على 20 ثانية، وتم تعيين وقت الانتظار الصريح على 10 ثوانٍ.

لنفترض أننا نحاول العثور على عنصر يحتوي على بعض "الظروف المتوقعة "(الانتظار الصريح)، إذا لم يكن العنصر موجودًا ضمن الإطار الزمني المحدد بواسطة الانتظار الصريح (10 ثوانٍ)، فسوف يستخدم الإطار الزمني المحدد بواسطة الانتظار الضمني (20 ثانية) قبل البدءwing "ElementNotVisibleException".

ينتظر برنامج تشغيل الويب السيلينيوم

  1. الانتظار الضمني
  2. الانتظار الصريح

في هذا البرنامج التعليمي، ستتعرف على أنواع مختلفة من فترات الانتظار في السيلينيوم:

الانتظار الضمني في السيلينيوم

الانتظار الضمني في السيلينيوم يتم استخدامه لإخبار برنامج تشغيل الويب بالانتظار لفترة معينة من الوقت قبل أن يقوم بطرح "لا يوجد استثناء لهذا العنصر". الإعداد الافتراضي هو 0. بمجرد ضبط الوقت، سينتظر برنامج تشغيل الويب العنصر لذلك الوقت قبل البدءwing استثناء.

لقد استعار برنامج Selenium Web Driver فكرة الانتظار الضمني من Watir.

في المثال أدناه أعلنا عن انتظار ضمني بإطار زمني قدره 10 ثوانٍ. ويعني ذلك أنه إذا لم يكن العنصر موجودًا على صفحة الويب خلال هذا الإطار الزمني، فسيتم طرح استثناء.

لإعلان الانتظار الضمني في 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) ;

سيقبل الانتظار الضمني معلمتين، ستقبل المعلمة الأولى الوقت كقيمة عددية وستقبل المعلمة الثانية قياس الوقت من حيث الثواني، والدقائق، والميلي ثانية، والميكروثانية، والنانو ثانية، والأيام، والساعات، وما إلى ذلك.

الانتظار الصريح في السيلينيوم

الانتظار الصريح في السيلينيوم يتم استخدامه لإخبار برنامج تشغيل الويب بالانتظار لشروط معينة (الشروط المتوقعة) أو الحد الأقصى للوقت الذي تم تجاوزه قبل ذلكwing استثناء "ElementNotVisibleException". إنه نوع ذكي من الانتظار، ولكن يمكن تطبيقه فقط على عناصر محددة. إنه يوفر خيارات أفضل من الانتظار الضمني حيث ينتظر عناصر Ajax المحملة ديناميكيًا.

بمجرد أن نعلن الانتظار الصريح علينا استخدام "الشروط المتوقعة"أو يمكننا تكوين عدد المرات التي نريد التحقق من الحالة باستخدامها الانتظار بطلاقة. في هذه الأيام أثناء التنفيذ نستخدم الموضوع.السكون () عموما لا ينصح باستخدامه

في المثال أدناه، نقوم بإنشاء مرجع انتظر "WebDriverWait"فئة وإنشاء مثيل باستخدام"ويب درايفر"المرجع، ونحن نعطي إطارًا زمنيًا أقصى قدره 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"الطبقة أو"الشروط المتوقعة"ليحدث أيهما يحدث أولاً.

ما سبق جافا ينص الكود على أننا ننتظر عنصرًا للإطار الزمني البالغ 20 ثانية كما هو محدد في "WebDriverWait" فئة على صفحة الويب حتى "الشروط المتوقعة"يتم استيفاء الشرط وهو"رؤية العنصر الموجود".

التاليwing هي الشروط المتوقعة التي يمكن استخدامها في انتظار السيلينيوم الصريح

  1. تنبيهIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. ElementToBeSelected()
  5. FrameToBeAvaliableAndSwitchToIt()
  6. invisibilityOfTheElementLocation()
  7. invisibilityOfElementWithText()
  8. وجودOfAllElementsLocatedBy()
  9. وجودOfElementLocation()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. العنوان()
  14. يحتوي العنوان على()
  15. رؤية ()
  16. رؤيةOfAllElements()
  17. إمكانية الرؤيةOfAllElementsLocatedBy()
  18. إمكانية الرؤيةOfElementLocation()

الانتظار بطلاقة في السيلينيوم

الانتظار بطلاقة في السيلينيوم يتم استخدامه لتحديد الحد الأقصى للوقت الذي ينتظره برنامج تشغيل الويب لحالة ما، بالإضافة إلى التردد الذي نريد التحقق من الحالة به قبل ذلكwing استثناء "ElementNotVisibleException". يقوم بالتحقق من عنصر الويب على فترات زمنية منتظمة حتى يتم العثور على الكائن أو انتهاء المهلة.

مميزات الكاميرا :Geo-tagging, touch focus, face detection, HDR, panorama ,EIS إعداد دورة متكررة مع الإطار الزمني للتحقق/التحقق من الحالة على فترات زمنية منتظمة

لنفكر في سيناريو يتم فيه تحميل العنصر على فترات زمنية مختلفة. قد يتم تحميل العنصر خلال 10 ثوانٍ أو 20 ثانية أو حتى أكثر من ذلك إذا أعلنا انتظارًا صريحًا لمدة 20 ثانية. سوف ينتظر حتى الوقت المحدد قبل ذلكwing استثناء. في مثل هذه السيناريوهات، يعد الانتظار السلس هو الانتظار المثالي للاستخدام حيث سيحاول هذا العثور على العنصر بتردد مختلف حتى يتم العثور عليه أو ينفد المؤقت النهائي.

بناء جملة الانتظار بطلاقة:

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

تم إهمال الكود أعلاه في الإصدار 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"));

لقد أنشأنا وظيفة جديدة لتحديد عنصر الويب الموجود على الصفحة. (على سبيل المثال: عنصر الويب هنا ليس سوى رابط السيلينيوم الموجود على صفحة الويب).

تم ضبط التردد على 5 ثوانٍ وتم ضبط الحد الأقصى للوقت على 30 ثانية. وهذا يعني أنه سيتم التحقق من العنصر الموجود على صفحة الويب كل 5 ثوانٍ لمدة أقصاها 30 ثانية. إذا كان العنصر موجودًا خلال هذا الإطار الزمني، فسوف يقوم بتنفيذ العمليات وإلا فسوف يرمي "ElementNotVisibleException"

تحقق أيضا: - السيلينيوم IDE تعليمي للمبتدئين

الفرق بين الانتظار الضمني والانتظار الصريح

فولوwing هو الفرق الرئيسي بين الانتظار الضمني والانتظار الصريح في السيلينيوم:

الانتظار الضمني الانتظار الصريح
يتم تطبيق وقت الانتظار الضمني على كافة العناصر الموجودة في البرنامج النصي يتم تطبيق وقت الانتظار الصريح فقط على تلك العناصر التي نهدف إليها
في الانتظار الضمني، نحتاج ليس حدد "الشروط المتوقعة" على العنصر المراد تحديد موقعه في الانتظار الصريح، نحتاج إلى تحديد "الشروط المتوقعة" على العنصر الذي سيتم تحديد موقعه
يوصى باستخدامه عندما تكون العناصر موجودة في الإطار الزمني المحدد في الانتظار الضمني للسيلينيوم يوصى باستخدامه عندما يستغرق تحميل العناصر وقتًا طويلاً وأيضًا للتحقق من خاصية العنصر مثل (visibilityOfElementLocated, elementToBeClickable,elementToBeSelected)

وفي الختام

الانتظار الضمني والصريح والطلاق هي فترات الانتظار المختلفة المستخدمة في السيلينيوم. يعتمد استخدام فترات الانتظار هذه بشكل كامل على العناصر التي يتم تحميلها على فترات زمنية مختلفة. لا يُنصح دائمًا باستخدام Thread.Sleep() أثناء الاختبار طلبنا أو بناء الإطار لدينا.

تحقق أيضا: - دروس السيلينيوم للمبتدئين: تعلم WebDriver في 7 أيام