खोज…


सेलेनियम वेबड्राइवर में प्रतीक्षा के प्रकार

किसी भी वेब एप्लिकेशन को चलाते समय लोडिंग समय को ध्यान में रखना आवश्यक है। यदि आपका कोड किसी भी तत्व को एक्सेस करने की कोशिश करता है जो अभी तक लोड नहीं हुआ है, तो WebDriver एक अपवाद फेंक देगा और आपकी स्क्रिप्ट बंद हो जाएगी।

कमर के तीन प्रकार हैं -

  • अधूरा इंतजार
  • स्पष्ट इंतजार
  • धाराप्रवाह इंतजार करता है

पूरे कार्यक्रम में प्रतीक्षा समय निर्धारित करने के लिए इम्प्लिक्ट वेट का उपयोग किया जाता है, जबकि स्पष्ट वेट का उपयोग केवल विशिष्ट भागों पर किया जाता है।


निहित प्रतीक्षा करें

एक निहित प्रतीक्षा के लिए WebDriver को यह बताना है कि जब वे तत्काल उपलब्ध नहीं हैं, तो किसी तत्व या तत्वों को खोजने की कोशिश करने पर DOM को एक निश्चित समय के लिए प्रदूषित कर सकते हैं। निहित प्रतीक्षा मूल रूप से WebDriver को उस विलंबता को बताने का आपका तरीका है, जिसे आप यह देखना चाहते हैं कि क्या निर्दिष्ट वेब तत्व मौजूद नहीं है, जिसे WebDriver खोज रहा है। डिफ़ॉल्ट सेटिंग 0. है। एक बार सेट करने के बाद, अंतर्निहित प्रतीक्षा वेबड्राइवर ऑब्जेक्ट इंस्टेंस के जीवन के लिए सेट है। निम्नलिखित स्निपेट का उपयोग करके कोड के तात्कालिक भाग में निहित प्रतीक्षा घोषित की गई है।

जावा में उदाहरण:

driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// You need to import the following class - import java.util.concurrent.TimeUnit;

C # में उदाहरण:

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(15));

तो इस मामले में, आप वेबड्राइवर को बता रहे हैं कि यूआई (डीओएम) पर निर्दिष्ट तत्व के मामलों में इसे 15 सेकंड तक इंतजार करना चाहिए।


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

जब कुछ तत्व लोड होने में अधिक समय लेते हैं तो आपको उदाहरण मिल सकते हैं। ऐसे मामलों के लिए अंतर्निहित प्रतीक्षा सेट करने का कोई मतलब नहीं है क्योंकि ब्राउज़र हर तत्व के लिए एक ही समय के लिए अनावश्यक रूप से प्रतीक्षा करेगा, स्वचालन समय बढ़ाएगा। स्पष्ट प्रतीक्षा कुछ विशिष्ट तत्वों के लिए निहित प्रतीक्षा को दरकिनार करके यहां मदद करती है।

स्पष्ट प्रतीक्षा बुद्धिमान वारिस हैं जो एक विशेष वेब तत्व तक सीमित हैं। स्पष्ट रूप से प्रतीक्षा करने के लिए आप मूल रूप से WebDriver को अधिकतम रूप से बता रहे हैं, इसे छोड़ने से पहले समय की X इकाइयों के लिए प्रतीक्षा करना है।

स्पष्ट प्रतीक्षा WebDriverWait और ExpectedConditions वर्गों का उपयोग करके की जाती है। नीचे दिए गए उदाहरण में, हम एक तत्व के लिए 10 सेकंड तक प्रतीक्षा करेंगे, जिसकी आईडी उपयोगकर्ता नाम अगले कमांड पर आगे बढ़ने से पहले दिखाई देगी। यहाँ कदम हैं।

जावा में उदाहरण:

//Import these two packages:
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

//Declare a WebDriverWait variable. In this example, we will use myWaitVar as the name of the variable.
WebDriverWait myWaitVar = new WebDriverWait(driver, 30);

//Use myWaitVar with ExpectedConditions on portions where you need the explicit wait to occur. In this case, we will use explicit wait on the username input before we type the text tutorial onto it.
myWaitVar.until(ExpectedConditions.visibilityOfElementLocated(By.id(“username”)));
driver.findElement(By.id(“username”)).sendKeys(“tutorial”);

ExpectedConditions वर्ग में किसी तत्व की प्रतीक्षा करने के लिए कुछ पूर्वनिर्धारित सामान्य स्थितियां होती हैं। जावा बंधन में इन स्थितियों की सूची देखने के लिए यहां क्लिक करें

C # में उदाहरण:

using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.PhantomJS;

// You can use any other WebDriver you want, such as ChromeDriver.
using (var driver = new PhantomJSDriver())
{
    driver.Navigate().GoToUrl("http://somedomain/url_that_delays_loading");

    // We aren't going to use it more than once, so no need to declare this a variable.
    new WebDriverWait(driver, TimeSpan.FromSeconds(10))
        .Until(ExpectedConditions.ElementIsVisible(By.Id("element-id")));

    // After the element is detected by the previous Wait, 
    // it will display the element's text
    Console.WriteLine(driver.FindElement(By.Id("element-id")).Text);
}

इस उदाहरण में, सिस्टम दिखाई देने तक 10 सेकंड तक प्रतीक्षा करेगा। यदि तत्व टाइमआउट के बाद दिखाई नहीं देगा, तो WebDriver एक WebDriverTimeoutException को फेंक देगा।

कृपया ध्यान दें: यदि तत्व 10 सेकंड के समय से पहले दिखाई देता है, तो सिस्टम तुरंत आगे की प्रक्रिया के लिए आगे बढ़ेगा।


धाराप्रवाह इंतजार

निहित और स्पष्ट प्रतीक्षा के विपरीत, धाराप्रवाह इंतजार दो मापदंडों का उपयोग करता है। टाइमआउट मान और मतदान की आवृत्ति। मान लीजिए कि हमारे पास 30 सेकंड और मतदान की आवृत्ति 2 सेकंड के रूप में टाइमआउट मूल्य है। WebDriver टाइमआउट मान (30 सेकंड) तक हर 2 सेकंड के बाद तत्व की जांच करेगा। टाइमआउट मान बिना किसी परिणाम के पार हो जाने के बाद, अपवाद को फेंक दिया जाता है। नीचे एक नमूना कोड है जो धाराप्रवाह प्रतीक्षा के कार्यान्वयन को दर्शाता है।

जावा में उदाहरण:

Wait wait = new FluentWait(driver).withTimeout(30, SECONDS).pollingEvery(2, SECONDS).ignoring(NoSuchElementException.class);


WebElement testElement = wait.until(new Function() {
    public WebElement apply(WebDriver driver) {
        return driver.findElement(By.id("testId"));
    }
});

धाराप्रवाह प्रतीक्षा का उपयोग करने का एक और लाभ है, हम प्रतीक्षा करते समय विशिष्ट प्रकार के अपवादों (जैसे। NoSuchElementException) को अनदेखा कर सकते हैं। इन सभी प्रावधानों के कारण, धाराप्रवाह प्रतीक्षा AJAX अनुप्रयोगों के साथ-साथ परिदृश्यों में सहायक होती है जब तत्व लोड समय में अक्सर उतार-चढ़ाव होता है। धाराप्रवाह प्रतीक्षा के रणनीतिक उपयोग से स्वचालन प्रयासों में काफी सुधार होता है।


विभिन्न प्रकार की स्पष्ट प्रतीक्षा स्थितियां

स्पष्ट प्रतीक्षा में, आप एक स्थिति होने की उम्मीद करते हैं। उदाहरण के लिए आप एक तत्व क्लिक करने योग्य होने तक इंतजार करना चाहते हैं।

यहाँ कुछ सामान्य समस्याओं का प्रदर्शन है।

कृपया ध्यान दें: इन उदाहरणों में से कुल मिला कर आप किसी भी उपयोग कर सकते हैं By , इस तरह के रूप में एक खोजकर्ता classname , xpath , link text , tag name या cssSelector


जब तक तत्व दिखाई नहीं देता तब तक प्रतीक्षा करें

उदाहरण के लिए, यदि आपकी वेबसाइट को लोड होने में कुछ समय लगता है, तो आप पेज लोड होने तक इंतजार कर सकते हैं, और आपका तत्व WebDver पर दिखाई देता है।

सी#

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("element-id")));

जावा

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("element-id")));

जब तक तत्व दिखाई नहीं देता तब तक प्रतीक्षा करें

पहले की तरह ही, लेकिन उलट।

सी#

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.Id("element-id")));

जावा

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("element-id")));

निर्दिष्ट तत्व में पाठ मौजूद होने तक प्रतीक्षा करें

सी#

IWebElement element = driver.FindElement(By.Id("element-id"));

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.TextToBePresentInElement(element, "text"));

जावा

WebElement element = driver.findElement(By.id("element-id"));

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.textToBePresentInElement(element, "text"));

यदि आप ऊपर दिए गए लिंक पर जाते हैं, तो आपको वहां सभी प्रतीक्षा स्थिति दिखाई देगी।

इन प्रतीक्षा स्थितियों के उपयोग के बीच का अंतर उनके इनपुट पैरामीटर में है।

इसका मतलब है कि आपको WebElement को पारित करने की आवश्यकता है यदि इसका इनपुट पैरामीटर WebElement है, तो आपको तत्व लोकेटर को पास करने की आवश्यकता है यदि यह By लोकेटर को इसके इनपुट पैरामीटर के रूप में लेता है।

बुद्धिमानी से चुनें कि आप किस प्रकार की प्रतीक्षा स्थिति का उपयोग करना चाहते हैं।

Ajax के अनुरोध को पूरा करने के लिए प्रतीक्षा कर रहा है

सी#

using OpenQA.Selenium
using OpenQA.Selenium.Chrome;
using System.Threading;

namespace WebDriver Tests
{
    class WebDriverWaits
    {
        static void Main()
        {
            IWebDriver driver = new ChromeDriver(@"C:\WebDriver");
            
            driver.Navigate().GoToUrl("page with ajax requests");
            CheckPageIsLoaded(driver);

            // Now the page is fully loaded, you can continue with further tests.
        }

        private void CheckPageIsLoaded(IWebDriver driver)
        {
            while (true)
            {
                bool ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
                if (ajaxIsComplete)
                    return;
                Thread.Sleep(100);
            }
        }
    }
}

यह उदाहरण उन पृष्ठों के लिए उपयोगी है जहाँ ajax अनुरोध किए गए हैं, यहाँ हम अपने स्वयं के जावास्क्रिप्ट कोड को चलाने के लिए IJavaScriptExecutor का उपयोग करते हैं। चूंकि यह while भीतर है, इसलिए यह तब तक ajaxIsComplete == true रहेगा जब तक ajaxIsComplete == true और इसलिए रिटर्न स्टेटमेंट निष्पादित नहीं किया जाता है।

हम jQuery.active कि jQuery.active 0 बराबर है, यह पुष्टि करके सभी ajax अनुरोध पूर्ण हैं। यह काम करता है क्योंकि हर बार जब एक नया अजाक्स अनुरोध किया जाता है तो jQuery.active जाता है और हर बार एक अनुरोध jQuery.active को jQuery.active दिया jQuery.active है, इससे हम यह jQuery.active == 0 सकते हैं कि जब jQuery.active == 0 सभी ajax अनुरोध पूरे होने चाहिए।

धाराप्रवाह प्रतीक्षा

धाराप्रवाह प्रतीक्षा स्पष्ट प्रतीक्षा ( WebDriverWait ) का एक सुपरक्लास है जो अधिक विन्यास योग्य है क्योंकि यह प्रतीक्षा फ़ंक्शन के तर्क को स्वीकार कर सकता है। मैं अंतर्निहित प्रतीक्षा पर पास हो जाऊंगा , क्योंकि इससे बचना सबसे अच्छा अभ्यास है।

उपयोग (जावा):

Wait wait = new FluentWait<>(this.driver)
        .withTimeout(driverTimeoutSeconds, TimeUnit.SECONDS)
        .pollingEvery(500, TimeUnit.MILLISECONDS)
        .ignoring(StaleElementReferenceException.class)
        .ignoring(NoSuchElementException.class)
        .ignoring(ElementNotVisibleException.class);

WebElement foo = wait.until(ExpectedConditions.presenceOfElementLocated(By.yourBy));

// or use your own predicate:
WebElement foo = wait.until(new Function() {
  public WebElement apply(WebDriver driver) {
    return element.getText().length() > 0;
  }
});

जब आप स्पष्ट प्रतीक्षा के साथ इसका उपयोग करते हैं तो यह डिफॉल्ट के साथ होता है यह बस एक FluentWait<WebDriver> के डिफॉल्ट के साथ है: DEFAULT_SLEEP_TIMEOUT = 500; और NotFoundException अनदेखी NotFoundException

धाराप्रवाह इंतजार

प्रत्येक फ्लुएंटविट उदाहरण एक शर्त की प्रतीक्षा करने के लिए अधिकतम समय निर्धारित करता है, साथ ही आवृत्ति जिसके साथ स्थिति की जांच करना है। इसके अलावा, उपयोगकर्ता प्रतीक्षा के दौरान विशिष्ट प्रकार के अपवादों को अनदेखा करने के लिए प्रतीक्षा को कॉन्फ़िगर कर सकता है, जैसे कि NoSuchElementException जब पृष्ठ पर एक तत्व की खोज की जाती है। यह ड्राइवर के साथ जुड़ा हुआ है।

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS) //actuall wait for the element to pe present
.pollingEvery(5, SECONDS) //selenium will keep looking for the element after every 5seconds
.ignoring(NoSuchElementException.class); //while ignoring this condition
wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.id("username"));


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow