@ জারিবের উত্তরে যুক্ত করতে, আমি বেশ কয়েকটি এক্সটেনশন পদ্ধতি তৈরি করেছি যা রেসের শর্তটি দূর করতে সহায়তা করে।
এখানে আমার সেটআপ:
আমার কাছে "ড্রাইভার.সি" নামে একটি ক্লাস রয়েছে। এতে ড্রাইভার এবং অন্যান্য দরকারী স্ট্যাটিক ফাংশনগুলির জন্য এক্সটেনশন পদ্ধতিতে পূর্ণ একটি স্ট্যাটিক শ্রেণি রয়েছে।
যে উপাদানগুলির জন্য সাধারণত আমার পুনরুদ্ধার করা প্রয়োজন, আমি নিম্নলিখিতগুলির মতো একটি এক্সটেনশন পদ্ধতি তৈরি করি:
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);
}
}
এই ফাংশনটির প্রথম প্যারামিটারটি এমন কোনও ফাংশন যা কোনও আইওবিএলেমেন্ট অবজেক্ট দেয়। দ্বিতীয় প্যারামিটারটি সেকেন্ডে সময়সীমা হয় (টাইমআউটটির কোডটি ফায়ারফক্সের সেলেনিয়াম আইডিই থেকে অনুলিপি করা হয়েছিল)। কোডটি বাসি উপাদানটির ব্যতিক্রম নিম্নলিখিত উপায়ে এড়াতে ব্যবহার করা যেতে পারে:
MyTestDriver.WaitForDisplayed(driver.SpecificElementToGet,5);
উপরের কোডটি কোনও ব্যতিক্রম এবং মূল্যায়ন না করা driver.SpecificElementToGet().Displayedপর্যন্ত কল করবে willdriver.SpecificElementToGet().Displayedtrue এবং 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);
}
}