[英]Exception: “Timed Out After xx seconds” on wait.until Selenium WebDriver C#
我試圖弄清楚如何等待條件以便使用Selenium Driver登錄到網頁。 但是,它並不像看起來那樣簡單。 我正在研究Thread.Sleep(3000);
但我相信應該有更好的解決方案。 因此,我的代碼如下:
執行一個javascript代碼片段以更改語言(我需要等待此時間才能登錄)。
IJavaScriptExecutor executor = (IJavaScriptExecutor)firefox; executor.ExecuteScript("arguments[0].click();", idioma_español);
以上說明導致頁面重新加載。
下一條指令旨在等待頁面重新加載
WebDriverWait wait = new WebDriverWait(newDriver,TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.TextToBePresentInElementValue(element,textToAppear));
繼續登錄。
但是,當我運行代碼時,它將引發以下異常:
仔細查看de輸出,我發現了這一點:
我試着用不同的預期條件,如: TextToBePresentInElement
, ElementExists
; 但會引發相同的異常。
我還嘗試了ExecuteAsyncScript("arguments[0].click();", idioma_español);
方法,但會引發“文檔已卸載”異常。
看起來text元素已被替換,因此該元素已過時。 我認為您可以通過每次獲取新元素來解決它。 參見下面的代碼:
public bool WaitForTextToAppear(IWebDriver driver, By elementLocator, string textToAppear, int timeoutInSec=10)
{
IWait<IWebDriver> wait = new DefaultWait<IWebDriver>(driver);
wait.Timeout = TimeSpan.FromSeconds(timeoutInSec);
wait.PollingInterval = TimeSpan.FromMilliseconds(300);
try
{
wait.Until(d => IsTextPresentedIn(d, elementLocator, textToAppear));
return true;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Error: " + ex.Message);
return false;
}
}
private bool IsTextPresentedIn(IWebDriver driver, By elementLocator, string textToAppear)
{
try
{
var elements = driver.FindElements(elementLocator);
if (elements.Count>0 && elements[0].Text.Equals(textToAppear, StringComparison.OrdinalIgnoreCase))
return true;
}
catch
{
return false;
}
return false;
}
// using the web driver extension.
bool textAppeared = WaitForTextToAppear(driver, By.CssSelector("selector-of-the-text-element"), "HERE IS THE EXPECTED TEXT");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.