我使用Specflow / Selenium自动测试我在ASP.Net环境中工作的Web应用程序。大多数“按钮”点击次数为'导致完整的页面加载。我执行以下几行代码来执行单击这样一个按钮,但它是一段闪烁的代码 - 有时它会找到元素,有时它会失败。那是为什么?
public class CreateQuestionPOM : BasePOM
{
//Flickering find!
[FindsBy(How = How.XPath, Using = "//label[text()[contains(.,'True/False')]]")]
private IWebElement trueFalseOption;
[FindsBy(How = How.XPath, Using = "//a[@ct='Button' and @title='Next']")]
private IWebElement nextButton;
public CreateQuestionPOM(IWebDriver driver) : base(driver) { }
public void CreateTrueFalseQuestion()
{
trueFalseOption.Click();
nextButton.Click();
WebDriverWait wait = new WebDriverWait(GetDriver(), TimeSpan.FromSeconds(20));
wait.Until(driver1 => ((IJavaScriptExecutor)GetDriver()).ExecuteScript("return document.readyState").Equals("complete"));
}
}
上述方法签名类似于页面上发生的所有按钮点击。单击上一个按钮后调用上面的代码。该方法与上述方法非常相似 - 等待document.readystate
为complete
。但为什么这种频繁闪烁以及推荐的解决方案是什么?
答案 0 :(得分:1)
您的代码中没有等待,有一个wait.until()
。执行该代码时,会立即执行该代码并检查until
条件。如果until
条件为真,则继续执行。只有当until
条件为假时才会有等待。如果代码执行得足够快,则在检查until
条件之前,浏览器可能无法转换到下一页。 until
条件将通过,因为当前页面(您单击该元素的页面)已经加载。您可以尝试的一件事是从点击的页面中选择一个元素并等待它过时。当元素不再存在于DOM中时,该元素是陈旧的。加载下一页时,上一页上的元素是陈旧的。尝试下面的代码,看看它是否有帮助。
public void CreateTrueFalseQuestion()
{
trueFalseOption.Click();
nextButton.Click();
WebDriverWait wait = new WebDriverWait(GetDriver(), TimeSpan.FromSeconds(20));
// when nextButton is stale you know the browser is transitioning...
wait.until(ExpectedConditions.stalenessOf(nextButton));
// ... then you wait for the new page to load
wait.Until(driver1 => ((IJavaScriptExecutor)GetDriver()).ExecuteScript("return document.readyState").Equals("complete"));
}