@ जरीब के जवाब में जोड़ने के लिए, मैंने कई विस्तार विधियां बनाई हैं जो दौड़ की स्थिति को खत्म करने में मदद करती हैं।
यहाँ मेरा सेटअप है:
मेरे पास एक क्लास है जिसे "Driver.cs" कहा जाता है। इसमें ड्राइवर और अन्य उपयोगी स्थिर कार्यों के लिए विस्तार विधियों से भरा एक स्थिर वर्ग होता है।
उन तत्वों के लिए जिन्हें मुझे आमतौर पर पुनर्प्राप्त करने की आवश्यकता होती है, मैं निम्नलिखित की तरह एक एक्सटेंशन विधि बनाता हूं:
public static IWebElement SpecificElementToGet(this IWebDriver driver) {
return driver.FindElement(By.SomeSelector("SelectorText"));
}
यह आपको कोड के साथ किसी भी परीक्षण वर्ग से उस तत्व को पुनः प्राप्त करने की अनुमति देता है:
driver.SpecificElementToGet();
अब, यदि इसका परिणाम होता है StaleElementReferenceException
, तो मेरे पास मेरे ड्राइवर वर्ग में निम्नलिखित स्थैतिक विधि है:
public static void WaitForDisplayed(Func<IWebElement> getWebElement, int timeOut)
{
for (int second = 0; ; second++)
{
if (second >= timeOut) Assert.Fail("timeout");
try
{
if (getWebElement().Displayed) break;
}
catch (Exception)
{ }
Thread.Sleep(1000);
}
}
इस फ़ंक्शन का पहला पैरामीटर कोई भी फ़ंक्शन है जो IWebElement ऑब्जेक्ट लौटाता है। दूसरा पैरामीटर सेकंड में एक टाइमआउट है (टाइमआउट के लिए कोड को सेलेनियम आईडीई से फायरफॉक्स के लिए कॉपी किया गया था)। कोड का उपयोग बासी तत्व अपवाद से बचने के लिए निम्न तरीके से किया जा सकता है:
MyTestDriver.WaitForDisplayed(driver.SpecificElementToGet,5);
उपरोक्त कोड driver.SpecificElementToGet().Displayed
तब तक कॉल करेगा जब तक driver.SpecificElementToGet()
कोई अपवाद नहीं फेंकता और .Displayed
मूल्यांकन नहीं करता है true
और 5 सेकंड बीत चुके हैं। 5 सेकंड के बाद, परीक्षण विफल हो जाएगा।
दूसरी तरफ, तत्व के मौजूद न होने का इंतजार करने के लिए, आप निम्न फ़ंक्शन का उसी तरह उपयोग कर सकते हैं:
public static void WaitForNotPresent(Func<IWebElement> getWebElement, int timeOut) {
for (int second = 0;; second++) {
if (second >= timeOut) Assert.Fail("timeout");
try
{
if (!getWebElement().Displayed) break;
}
catch (ElementNotVisibleException) { break; }
catch (NoSuchElementException) { break; }
catch (StaleElementReferenceException) { break; }
catch (Exception)
{ }
Thread.Sleep(1000);
}
}