C# selenium`wait.until`不等待提供的路径在DOM上呈现

C# selenium`wait.until`不等待提供的路径在DOM上呈现,c#,angularjs,selenium,selenium-webdriver,nunit,C#,Angularjs,Selenium,Selenium Webdriver,Nunit,我正在使用selenium测试基于角度的应用程序,我想在DOM上处理一些测试用例。在通过DOM进行处理之前,我将使用wait.Until方法通过提供XPATH/Selector等待它得到渲染。您可以看到下面我在代码中使用的代码片段 wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//[@id='stepsGrid')); driver.FindElement(By.XPath("//[@id='stepsGrid']"))

我正在使用selenium测试基于角度的应用程序,我想在DOM上处理一些测试用例。在通过DOM进行处理之前,我将使用
wait.Until
方法通过提供
XPATH/Selector
等待它得到渲染。您可以看到下面我在代码中使用的代码片段

wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//[@id='stepsGrid'));
driver.FindElement(By.XPath("//[@id='stepsGrid']")).Click();
但是,
等待。直到
在DOM呈现之前启动代码,所以我的测试用例失败。任何关于它的见解

wait.till
方法是否正确地等待DOM得到渲染


任何帮助都将不胜感激。

在更新DOM时遇到了一些小问题,我认为旧的DOM已被删除,新的DOM将替换它。因为它被移除了,所以没有对象可以等待,因此它会激发

一个丑陋的黑客只是包含一个Thread.Sleep(x),但我不建议在生产代码中使用它

有时,它可以帮助在第一个对象之后放置另一个对象,以便在加载时尝试捕获新对象。或者尝试将另一个对象作为目标等待,然后获得您需要使用的正确对象


但是这是一个恼人的bug,答案取决于站点的行为和加载方式。

等待。
不等待DOM完全加载,只等待满足条件,在您的情况下,元素是可单击的

等待。在
返回它等待的
WebElement
之前,请尝试单击该元素,而不是重新定位它

wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("stepsGrid"))).Click();
ExpectedCondition期望值=新的ExpectedCondition()
{
公共布尔应用(WebDriver驱动程序)
{
return((JavascriptExecutor)driver.executeScript(“return document.readyState”).equals(“complete”);
}
};
尝试
{
等待,直到(期望);
FindElement(By.XPath(“/[@id='stepsGrid']))。单击();
}
捕获(可丢弃错误)
{
assertFalse(“等待页面加载请求完成的超时”,true);
}

您可以等待文档准备就绪,然后执行selenium单击…

问题出在哪里?我们无法预测DOM渲染需要多长时间。。?而在代码中使用时间来编写硬代码并不是一个好办法。不幸的是,不是。这是一个绕过这一部分继续编写代码的方法,直到你能在代码中获得永久修复为止。
    ExpectedCondition<Boolean> expectation = new ExpectedCondition<Boolean>() 
    {
        public Boolean apply(WebDriver driver)
        {
            return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
        }
    };

    try
    {
        wait.until(expectation);
        driver.FindElement(By.XPath("//[@id='stepsGrid']")).Click();
    }
    catch(Throwable error)
    {
        assertFalse("Timeout waiting for Page Load Request to complete.",true);
    }