为什么Selenium"闪烁"找到和找不到特定的HTML元素之间?

时间:2015-10-01 19:54:30

标签: selenium

我使用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.readystatecomplete。但为什么这种频繁闪烁以及推荐的解决方案是什么?

1 个答案:

答案 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"));
}