在我的一些项目中,要正确保存表单,用户需要执行单击“保存”或“保存更改”按钮。该单击导致整个页面重新加载(完成更改将在重新加载后的页面上显示),但如果出现错误,验证将阻止页面重新加载。 我想创建一个简单的断言来检查该页面是否重新加载,如果不是,我的测试将失败。我试着使用这段代码:
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次,2次测试将失败)。 有没有办法升级它以100%的使用率正常工作? 或者可能有另一种方法来检查页面是否重新加载?
答案 0 :(得分:0)
可能有一些Ajax调用是异步的。你可以等到ajax调用结束,然后再做你的情况,看看:
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);
}
}
答案 1 :(得分:0)
正如我的观点,你最好使用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;
}
我建议您等待标记刷新页面状态的特定元素。
答案 2 :(得分:0)
对于网页加载,遗憾的是没有一种尺寸适合所有解决方案。每种情况都不一样您如何在自动化套件中等待非常关键。显式等待是推荐的等待方式,而不是使用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 docs here