Untuk menambah jawaban @ jarib, saya telah membuat beberapa metode ekstensi yang membantu menghilangkan kondisi balapan.
Ini pengaturan saya:
Saya memiliki kelas yang disebut "Driver.cs". Ini berisi kelas statis penuh metode ekstensi untuk driver dan fungsi statis lain yang berguna.
Untuk elemen yang biasanya perlu saya ambil, saya membuat metode ekstensi seperti berikut:
public static IWebElement SpecificElementToGet(this IWebDriver driver) {
return driver.FindElement(By.SomeSelector("SelectorText"));
}
Ini memungkinkan Anda untuk mengambil elemen itu dari kelas tes apa pun dengan kode:
driver.SpecificElementToGet();
Sekarang, jika ini menghasilkan a StaleElementReferenceException
, saya memiliki metode statis berikut di kelas driver saya:
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);
}
}
Parameter pertama fungsi ini adalah fungsi apa pun yang mengembalikan objek IWebElement. Parameter kedua adalah batas waktu dalam detik (kode untuk batas waktu itu disalin dari Selenium IDE untuk FireFox). Kode dapat digunakan untuk menghindari pengecualian elemen basi dengan cara berikut:
MyTestDriver.WaitForDisplayed(driver.SpecificElementToGet,5);
Kode di atas akan memanggil driver.SpecificElementToGet().Displayed
hingga driver.SpecificElementToGet()
tidak ada pengecualian dan .Displayed
mengevaluasi hingga true
5 detik belum berlalu. Setelah 5 detik, tes akan gagal.
Di sisi lain, untuk menunggu elemen tidak ada, Anda dapat menggunakan fungsi berikut dengan cara yang sama:
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);
}
}