Saya sudah memulai proyek Selenium di C #. Mencoba menunggu halaman selesai dimuat dan baru setelah itu melanjutkan ke tindakan berikutnya.
Kode saya terlihat seperti ini:
loginPage.GoToLoginPage();
loginPage.LoginAs(TestCase.Username, TestCase.Password);
loginPage.SelectRole(TestCase.Orgunit);
loginPage.AcceptRole();
di dalam loginPage.SelectRole(TestCase.Orgunit):
RoleHierachyLabel = CommonsBasePage.Driver.FindElement(By.XPath("//span[contains(text(), " + role + ")]"));
RoleHierachyLabel.Click();
RoleLoginButton.Click();
Saya mencari elemen RoleHierachyLabel. Saya telah mencoba menggunakan beberapa cara untuk menunggu halaman dimuat atau mencari properti elemen yang memungkinkan untuk beberapa batas waktu:
1. _browserInstance.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));
2. public static bool WaitUntilElementIsPresent(RemoteWebDriver driver, By by, int timeout = 5)
{
for (var i = 0; i < timeout; i++)
{
if (driver.ElementExists(by)) return true;
}
return false;
}
Bagaimana Anda akan mengatasi rintangan ini?
Saya telah mencari alternatif dan saya telah memilih versi berikut ini. Semua menggunakan penantian eksplisit dengan batas waktu yang ditentukan dan didasarkan pada properti elemen dalam kasus pertama dan pada staleness elemen dalam kasus kedua.
Pilihan pertama akan memeriksa properti elemen sampai timeout tercapai. Saya telah sampai pada properti berikut yang mengkonfirmasikan bahwa itu tersedia di halaman:
Existence - Ekspektasi untuk memeriksa bahwa sebuah elemen ada pada DOM halaman. Ini tidak selalu berarti bahwa elemen tersebut terlihat.
//this will not wait for page to load
Assert.True(Driver.FindElement(By elementLocator).Enabled)
//this will search for the element until a timeout is reached
public static IWebElement WaitUntilElementExists(By elementLocator, int timeout = 10)
{
try
{
var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
return wait.Until(ExpectedConditions.ElementExists(elementLocator));
}
catch (NoSuchElementException)
{
Console.WriteLine("Element with locator: '" + elementLocator + "' was not found in current context page.");
throw;
}
}
Visibilitas - Ekspektasi untuk memeriksa bahwa sebuah elemen ada pada DOM halaman dan terlihat. Visibilitas berarti bahwa elemen tidak hanya ditampilkan tetapi juga memiliki tinggi dan lebar yang lebih besar dari 0.
//this will not wait for page to load
Assert.True(Driver.FindElement(By elementLocator).Displayed)
//this will search for the element until a timeout is reached
public static IWebElement WaitUntilElementVisible(By elementLocator, int timeout = 10)
{
try
{
var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
return wait.Until(ExpectedConditions.ElementIsVisible(elementLocator));
}
catch (NoSuchElementException)
{
Console.WriteLine("Element with locator: '" + elementLocator + "' was not found.");
throw;
}
}
Dapat diklik - Ekspektasi untuk memeriksa sebuah elemen terlihat dan diaktifkan sehingga Anda dapat mengkliknya.
//this will not wait for page to load
//both properties need to be true in order for element to be clickable
Assert.True(Driver.FindElement(By elementLocator).Enabled)
Assert.True(Driver.FindElement(By elementLocator).Displayed)
//this will search for the element until a timeout is reached
public static IWebElement WaitUntilElementClickable(By elementLocator, int timeout = 10)
{
try
{
var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
return wait.Until(ExpectedConditions.ElementToBeClickable(elementLocator));
}
catch (NoSuchElementException)
{
Console.WriteLine("Element with locator: '" + elementLocator + "' was not found in current context page.");
throw;
}
}
Pilihan kedua berlaku ketika objek pemicu, misalnya item menu, tidak lagi melekat pada DOM setelah diklik. Ini biasanya terjadi ketika aksi klik pada elemen akan memicu pengalihan ke halaman lain. Dalam hal ini berguna untuk memeriksa StalenessOf(elemen) di mana elemen adalah item yang diklik untuk memicu pengalihan ke halaman baru.
public static void ClickAndWaitForPageToLoad(By elementLocator, int timeout = 10)
{
try
{
var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
var element = Driver.FindElement(elementLocator);
element.Click();
wait.Until(ExpectedConditions.StalenessOf(element));
}
catch (NoSuchElementException)
{
Console.WriteLine("Element with locator: '" + elementLocator + "' was not found in current context page.");
throw;
}
}
Saya biasanya menggunakan wait eksplisit untuk hal ini, dan menunggu sampai sebuah elemen terlihat, kemudian melanjutkan ke tindakan berikutnya. Ini akan terlihat seperti ini:
WebDriverWait waitForElement = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
waitForElement.Until(ExpectedConditions.ElementIsVisible(By.Id("yourIDHere")));
Lebih lanjut tentang Explicit waits di sini: Explicit waits Selenium C# dan di sini WebDriver Explicit waits