Selenium प्रतीक्षा करें – वाक्यविन्यास के साथ निहित और स्पष्ट


In Selenium, "प्रतीक्षा" परीक्षणों को निष्पादित करने में एक महत्वपूर्ण भूमिका निभाती है। इस ट्यूटोरियल में, आप विभिन्न पहलुओं और निहित और स्पष्ट प्रतीक्षा के बीच अंतर सीखेंगे Selenium.

हमें प्रतीक्षा की आवश्यकता क्यों है? Selenium?

अधिकांश वेब अनुप्रयोग का विकास निम्न का उपयोग करके किया जाता है: अजाक्स और Javascriptजब ब्राउज़र द्वारा कोई पेज लोड किया जाता है तो जिन तत्वों के साथ हम इंटरैक्ट करना चाहते हैं वे अलग-अलग समय अंतराल पर लोड हो सकते हैं।

इससे न केवल तत्व की पहचान करना मुश्किल हो जाता है बल्कि यदि तत्व स्थित नहीं है तो यह एक “एलिमेंटनॉटविजिबलएक्सेप्शन” अपवाद का उपयोग करना। Selenium रुको, हम इस समस्या को हल कर सकते हैं।

आइए एक परिदृश्य पर विचार करें जहां हमें अपने परीक्षण में निहित और स्पष्ट दोनों प्रतीक्षाओं का उपयोग करना है। मान लें कि निहित प्रतीक्षा समय 20 सेकंड पर सेट है और स्पष्ट प्रतीक्षा समय 10 सेकंड पर सेट है।

मान लीजिए हम एक ऐसा तत्व खोजने की कोशिश कर रहे हैं जिसमें कुछ “अपेक्षित शर्तें “(स्पष्ट प्रतीक्षा), यदि तत्व स्पष्ट प्रतीक्षा (10 सेकंड) द्वारा परिभाषित समय सीमा के भीतर स्थित नहीं है, तो यह फेंकने से पहले निहित प्रतीक्षा (20 सेकंड) द्वारा परिभाषित समय सीमा का उपयोग करेगा”एलिमेंटनॉटविजिबलएक्सेप्शन".

Selenium वेब ड्राइवर प्रतीक्षा करता है

  1. निहित प्रतीक्षा
  2. स्पष्ट प्रतीक्षा

इस ट्यूटोरियल में, आप विभिन्न प्रकार के प्रतीक्षा के बारे में जानेंगे Selenium:

निहित प्रतीक्षा Selenium

RSI निहित प्रतीक्षा Selenium वेब ड्राइवर को यह बताने के लिए उपयोग किया जाता है कि वह “कोई ऐसा तत्व अपवाद नहीं” फेंकने से पहले एक निश्चित समय तक प्रतीक्षा करे। डिफ़ॉल्ट सेटिंग 0 है। एक बार जब हम समय सेट कर देते हैं, तो वेब ड्राइवर अपवाद फेंकने से पहले उस समय तक तत्व की प्रतीक्षा करेगा।

Selenium वेब ड्राइवर ने निहित प्रतीक्षा का विचार उधार लिया है Watir.

नीचे दिए गए उदाहरण में हमने 10 सेकंड की समय सीमा के साथ एक अंतर्निहित प्रतीक्षा घोषित की है। इसका मतलब है कि यदि तत्व उस समय सीमा के भीतर वेब पेज पर स्थित नहीं है, तो यह एक अपवाद फेंक देगा।

अंतर्निहित प्रतीक्षा की घोषणा करना 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("https://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 पैरामीटर स्वीकार करेगी, पहला पैरामीटर समय को पूर्णांक मान के रूप में स्वीकार करेगा और दूसरा पैरामीटर सेकंड, मिनट, मिलीसेकंड, माइक्रोसेकंड, नैनोसेकंड, दिन, घंटे आदि के संदर्भ में समय माप को स्वीकार करेगा।

स्पष्ट प्रतीक्षा करें Selenium

RSI स्पष्ट प्रतीक्षा करें Selenium वेब ड्राइवर को यह बताने के लिए उपयोग किया जाता है कि वह कुछ शर्तों (अपेक्षित शर्तों) या “ElementNotVisibleException” अपवाद को फेंकने से पहले अधिकतम समय तक प्रतीक्षा करे। यह प्रतीक्षा का एक बुद्धिमान प्रकार है, लेकिन इसे केवल निर्दिष्ट तत्वों के लिए ही लागू किया जा सकता है। यह अंतर्निहित प्रतीक्षा की तुलना में बेहतर विकल्प देता है क्योंकि यह गतिशील रूप से लोड किए गए Ajax तत्वों की प्रतीक्षा करता है।

एक बार जब हम स्पष्ट प्रतीक्षा की घोषणा कर देते हैं तो हमें “अपेक्षित शर्तें” या हम कॉन्फ़िगर कर सकते हैं कि हम कितनी बार स्थिति की जांच करना चाहते हैं धाराप्रवाह प्रतीक्षाइन दिनों कार्यान्वयन करते समय हम उपयोग कर रहे हैं थ्रेड.स्लीप() आम तौर पर इसका उपयोग करने की अनुशंसा नहीं की जाती है

नीचे दिए गए उदाहरण में, हम “ के लिए संदर्भ प्रतीक्षा बना रहे हैंवेबड्राइवरप्रतीक्षा करें” क्लास का उपयोग करना और “ का उपयोग करके इंस्टेंटिएट करनावेबड्राइवर” संदर्भ, और हम अधिकतम 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("https://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();

इस वेबड्राइवर प्रतीक्षा उदाहरण में, “ में परिभाषित समय की मात्रा तक प्रतीक्षा करेंवेबड्राइवरप्रतीक्षा करें” वर्ग या “अपेक्षित शर्तें” जो भी पहले घटित हो, वही घटित होगा।

ऊपर Java कोड बताता है कि हम 20 सेकंड की समय सीमा के लिए एक तत्व की प्रतीक्षा कर रहे हैं जैसा कि “वेबड्राइवरप्रतीक्षा करें” वेबपेज पर क्लास “ तकअपेक्षित शर्तें” पूरी हो गई है और शर्त यह है “तत्वस्थितकीदृश्यता".

निम्नलिखित अपेक्षित स्थितियाँ हैं जिनका उपयोग किया जा सकता है Selenium स्पष्ट प्रतीक्षा

  1. अलर्टइज़प्रेजेंट()
  2. तत्वचयनस्थितिToBe()
  3. elementToBeClickable()
  4. तत्व चयनित होना चाहिए()
  5. फ़्रेमटूबीअवेलेबलएंडस्विचटूइट()
  6. तत्वस्थानकीअदृश्यता()
  7. टेक्स्ट के साथतत्व की अदृश्यता()
  8. उपस्थितिसभीतत्वोंकीस्थितद्वारा()
  9. तत्वस्थानकीउपस्थिति()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. शीर्षकहै()
  14. शीर्षकशामिल()
  15. दृश्यताकी(विजिबिलिटीऑफ()
  16. सभीतत्वों की दृश्यता()
  17. सभीतत्वोंकीस्थितद्वारादृश्यता()
  18. तत्वस्थानकीदृश्यता()

धाराप्रवाह प्रतीक्षा करें Selenium

RSI धाराप्रवाह प्रतीक्षा करें Selenium वेब ड्राइवर द्वारा किसी शर्त के लिए प्रतीक्षा करने के लिए अधिकतम समय निर्धारित करने के लिए उपयोग किया जाता है, साथ ही वह आवृत्ति जिसके साथ हम “ElementNotVisibleException” अपवाद फेंकने से पहले शर्त की जाँच करना चाहते हैं। यह नियमित अंतराल पर वेब तत्व की जाँच करता है जब तक कि ऑब्जेक्ट नहीं मिल जाता या टाइमआउट नहीं हो जाता।

आवृत्ति: नियमित अंतराल पर स्थिति की पुष्टि/जांच करने के लिए समय सीमा के साथ दोहराव चक्र की स्थापना करना

आइए एक परिदृश्य पर विचार करें जहां एक तत्व समय के विभिन्न अंतराल पर लोड किया जाता है। यदि हम 10 सेकंड की स्पष्ट प्रतीक्षा घोषित करते हैं तो तत्व 20 सेकंड, 20 सेकंड या उससे भी अधिक समय में लोड हो सकता है। अपवाद फेंकने से पहले यह निर्दिष्ट समय तक प्रतीक्षा करेगा। ऐसे परिदृश्यों में, फ़्लूएंट प्रतीक्षा का उपयोग करना आदर्श प्रतीक्षा है क्योंकि यह तत्व को अलग-अलग आवृत्ति पर खोजने की कोशिश करेगा जब तक कि वह उसे न पा ले या अंतिम टाइमर समाप्त न हो जाए।

धाराप्रवाह प्रतीक्षा वाक्यविन्यास:

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("https://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 सेकंड पर सेट किया गया है “कोई ऐसाएलिमेंटएक्सेप्शन नहीं"

निम्नलिखित कोड पर विचार करें:

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"));

हमने पेज पर वेब एलिमेंट को पहचानने के लिए एक नया फंक्शन बनाया है। (उदाहरण: यहाँ वेब एलिमेंट कुछ और नहीं बल्कि एक वेब एलिमेंट है।) Selenium वेबपेज पर लिंक देखें)।

आवृत्ति 5 सेकंड पर सेट की गई है और अधिकतम समय 30 सेकंड पर सेट किया गया है। इस प्रकार इसका मतलब है कि यह वेब पेज पर हर 5 सेकंड पर 30 सेकंड के अधिकतम समय के लिए तत्व की जांच करेगा। यदि तत्व इस समय सीमा के भीतर स्थित है तो यह ऑपरेशन करेगा अन्यथा यह "एलिमेंटनॉटविजिबलएक्सेप्शन"

यह भी जांचें: - Selenium शुरुआती लोगों के लिए IDE ट्यूटोरियल

निहित प्रतीक्षा बनाम स्पष्ट प्रतीक्षा के बीच अंतर

अंतर्निहित प्रतीक्षा और स्पष्ट प्रतीक्षा के बीच मुख्य अंतर निम्नलिखित है Selenium:

निहित प्रतीक्षा स्पष्ट प्रतीक्षा
स्क्रिप्ट में सभी तत्वों पर निहित प्रतीक्षा समय लागू होता है स्पष्ट प्रतीक्षा समय केवल उन तत्वों पर लागू होता है जो हमारे द्वारा इच्छित हैं
इंप्लिसिट वेट में, हमें जरूरत है नहीं तत्व पर “अपेक्षित शर्तें” निर्दिष्ट करें स्पष्ट प्रतीक्षा में, हमें स्थित होने वाले तत्व पर “अपेक्षित शर्तें” निर्दिष्ट करने की आवश्यकता है
इसका उपयोग तब करने की अनुशंसा की जाती है जब तत्व निर्दिष्ट समय सीमा के साथ स्थित हों Selenium अंतर्निहित प्रतीक्षा इसका उपयोग तब करने की अनुशंसा की जाती है जब तत्वों को लोड होने में लंबा समय लग रहा हो और तत्व की संपत्ति की पुष्टि करने के लिए भी जैसे (विज़िबिलिटीऑफ़एलिमेंटलोकेटेड, एलिमेंटटूबीक्लिकेबल,एलिमेंटटूबीसेलेक्टेड)

निष्कर्ष

निहित, स्पष्ट और धाराप्रवाह प्रतीक्षा वे विभिन्न प्रतीक्षाएँ हैं जिनका उपयोग किया जाता है Seleniumइन प्रतीक्षाओं का उपयोग पूरी तरह से उन तत्वों पर आधारित है जो समय के विभिन्न अंतरालों पर लोड किए जाते हैं। हमेशा थ्रेड.स्लीप() का उपयोग करने की अनुशंसा नहीं की जाती है परीक्षण हमारे आवेदन या हमारे ढांचे का निर्माण.

यह भी जांचें: - Selenium शुरुआती लोगों के लिए ट्यूटोरियल: 7 दिनों में वेबड्राइवर सीखें