[英]Selenium c# Wait for javascript to execute
我正在使用 Selenium 和 c# 中的 Nunit 進行一些單元測試。
理論上這很簡單,我有一個元素我想點擊 go 到另一個頁面。 我遇到的問題是使其可點擊的部分加載時間晚於實際元素。 這意味着如果我只是等到元素加載完畢,單擊它仍然沒有任何作用。 我也嘗試等待它可以點擊,但它似乎仍然不起作用。
除了 static 延遲之外,還有什么辦法可以解決這個問題?
謝謝
我建議你創建一個等待 ajax/jquery 的方法:
public void WaitForJqueryAjax() {
int delay = MaxdelaySeconds;
while(delay > 0) {
Thread.Sleep(1000);
var jquery = (bool)(this.driver as IJavaScriptExecutor)
.ExecuteScript("return window.jQuery == undefined");
if(jquery) {
break;
}
var ajaxIsComplete = (bool)(this.driver as IJavaScriptExecutor)
.ExecuteScript("return window.jQuery.active == 0");
if(ajaxIsComplete) {
break;
}
delay--;
}
}
在我的實現中, int delay = MaxdelaySeconds;
與我的驅動程序隱式等待時間具有相同的值。
(如果需要,修改上述方法以將您的驅動程序作為參數)
也許您需要執行 JavaScript 或 Jquery 代碼
例如:
driver.ExecuteJavaScript("$(\"#CategorylId\").CascadingDropDown(\"#WareId\", \'/store/log/AsyncWare\');");
WaitUntilLoad(driver, "WareId", 5000);
page = driver.PageSource;
有關其他信息,此鏈接可能有用
所以有幾種方法:
public void WaitForAjax(){
var miliSecondsToWait = 15000;
bool ajaxIsComplete = false;
while (!ajaxIsComplete && miliSecondsToWait > 0) // Handle timeout somewhere
{
ajaxIsComplete = (bool)(Driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
Thread.Sleep(200);
miliSecondsToWait -= 200;
}
}
Thread.Sleep(10000).
等待 10 秒(不推薦的方法)不要忘記導入 System.Threading;
protected Func<IWebDriver, bool> ButtonToBeSuccessfullyClicked(IWebDriver driver, By locator)
{
Func<IWebDriver, bool> func = (_driver) =>
{
if (E(locator).Displayed)
{
E(_continueButton).Click();
return false;
}
else
{
return true;
}
};
return func;
}
使用該方法,您可以在預期條件下調用此 function
Driver.Until(ButtonToBeSuccessfullyClicked(Driver, _continueButton));
請注意,如果您使用的是 SeleniumExtras.WaitHelpers.ExpectedConditions,function 將無法工作,您必須編寫自己的實現。
這是我的首選方式。 如果在單擊過程中引發異常,您可以將單擊包裝在 try-catch 中。 所以結果將如下所示:
protected Func<IWebDriver, bool> ButtonToBeSuccessfullyClicked(IWebDriver driver, By locator)
{
Func<IWebDriver, bool> func = (_driver) =>
{
if (E(locator).Displayed)
{
try {
E(_continueButton).Click();
return false;
} catch ()
{
return true;
}
}
else
{
return true;
}
};
return func;
}
請仔細檢查 function 應該返回的內容,因為我沒有運行代碼,所以我沒有運行代碼,所以我是根據我的 memory 寫的(可能記錯了)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.