是否有一种方法来检查页面是否被WebDriver (c#)重新加载
本文关键字:是否 WebDriver 新加载 加载 检查 一种 方法 | 更新日期: 2023-09-27 18:01:44
在我的一些项目中,为了正确保存表单,用户需要执行点击"保存"或"保存更改"按钮。该单击会导致整个页面重新加载(重新加载后页面上可以看到所做的更改),但如果出现错误,验证将阻止页面重新加载。我想创建一个简单的断言来检查页面是否被重新加载,如果没有,我的测试将失败。我尝试使用这个代码:
public bool WasPageRefreshed(float seconds)
{
DriverLocal.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.MinValue);
string getReadyState = "return document.readyState;";
for (int i = 0; i < 10; i++)
{
string readyState = GetJsExecutor().ExecuteScript(getReadyState) as string;
if (readyState != "complete")
return true;
Thread.Sleep(TimeSpan.FromMilliseconds(seconds / 10));
}
DriverLocal.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(60));
return false;
}
我在Assert.True()中使用它来检查页面是否被重新加载,但它并不总是工作(我可以在同一表单上使用它5次- 3次ok, 2次测试将失败)。是否有一种方法可以升级它,使其在100%的使用率下正常工作?或者可能有另一种方法来检查页面是否被重新加载?
对于网页加载,不幸的是没有一个适合所有的解决方案。情况各不相同。如何在自动化套件中等待是非常关键的。显式等待是推荐的等待方式,而不是使用Javascript选项,你可以在页面加载后等待一个新元素,或者等待某些元素不可见,告诉你页面已加载
new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut))
.Until(ExpectedConditions
.ElementExists((By.Id("new Element Id"))));
或
new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut))
.Until(ExpectedConditions
.InvisibilityOfElementLocated((By.Id("old Element Id"))));
你可以在这里查看ExpectedElements文档
可能有一些Ajax调用是异步工作的。您可以等到ajax调用完成后,再处理您的case,见如下:
public void WaitForAjax()
{
while (true) // break if ajax return false
{
var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
if (ajaxIsComplete)
break;
Thread.Sleep(100);
}
}
在我看来,你最好使用SeleniumWait而不是Sleep。试试这个
public bool WasPageRefreshed(double seconds)
{
WebDriverWait wait = new WebDriverWait(DriverLocal, TimeSpan.FromSeconds(seconds));
wait.PollingInterval = TimeSpan.FromSeconds(1);
string getReadyState = "return document.readyState;";
try
{
wait.Until(d =>
{
string readyState = GetJsExecutor().ExecuteScript(getReadyState) as string;
if (readyState == "complete")
return true;
});
}
catch (Exception)
{
}
return false;
}
我建议您等待标记刷新页面状态的特定元素