硒-检查元素不存在的等待时间太长

时间:2019-02-22 09:06:46

标签: c# selenium selenium-webdriver

我为Webdriver设置了明确的等待时间:

WebDriverWait wait = new WebDriverWait(_driver, new TimeSpan(0, 0, 8));

我有一种情况,就是加载器元素阻塞了按钮,所以我等待加载器元素消失:

wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.InvisibilityOfElementLocated(By.XPath(".//*[contains(@class, 'block-ui-wrapper')]")));
btnMenuAdministration.Click();

问题在于,加载器元素仅存在1或2秒,并且测试仍然等待完整的8秒,然后单击按钮。我尝试使用'ElementToBeClickable',但出现按钮不可点击的异常情况。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

        public static void WaitUntil(this IWebDriver driver, Func<bool> Condition, float timeout = 10f)
    {

        float timer = timeout;
        while (!Condition.Invoke() && timer > 0f) {

            System.Threading.Thread.Sleep(500);
            timer -= 0.5f;

        }
        System.Threading.Thread.Sleep(500);

    }

driver.WaitUntil(() => driver.FindElements(By.XPath(".//*[contains(@class, 'block-ui-wrapper')]").Length == 0);

我有一类扩展,我在其中进行了一堆自定义Selenium操作。我发现隐式等待给我带来了很多麻烦,而不是值得的。而且我发现显式的selenium等待可能会变得有些冗长,而且这并不是我想要的框架中的所有内容,因此我做了很多扩展。这是其中之一。注意,我在上面的示例中使用FindElements,因为如果什么也没发现,我不希望引发异常。这应该为您工作。

注意:您需要将其放在静态类中才能起作用。在逻辑上扩展这样的现有类时要小心,因为当其他人试图确定方法的定义位置时,它会使其他人迷惑。

这是我的完整扩展文件,通过Github gist。我包装了几乎所有的Selenium函数。我使用Javascript的原因很多,因为JQuery在查找元素方面100%可靠,而Selenium的find函数在诸如IFrames之类的东西中存在一些麻烦。另外,JQuery具有极其健壮且超级可读的方式,可以使用任意数量的定位符查询DOM中的元素,无论它们是ID,Class,文本包含,伪选择器等;全部在同一查询字符串中! (Selenium CSS选择器中缺少伪选择器支持可能是一个限制),这就是为什么我使用它。它比xpath更具可读性,更容易编写,并且在正确编写时100%可靠。如果您在测试页面上没有JQuery,则只需在每次加载新页面时注入JQuery脚本即可。

所以我要做的是使用JQuery查找并生成一个显式XPath到页面上所需的确切元素,然后将确切的XPath传递给Selenium的“查找”逻辑。当您握着硒的手时,找到元素没有问题。

https://gist.github.com/tsibiski/04410e9646ee9ced9f3794266d6c5a82