【问题标题】:Selenium - Wait time for checking that element doesn't exist is too longSelenium - 检查元素不存在的等待时间太长
【发布时间】:2019-03-12 05:10:05
【问题描述】:

我为 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”,但出现按钮不可点击的异常。

有什么建议吗?

【问题讨论】:

  • 这听起来像是X-Y problem。与其寻求解决问题的帮助,不如编辑您的问题并询问实际问题。你想做什么?

标签: c# selenium selenium-webdriver


【解决方案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 操作。我发现隐含的等待给我带来的麻烦多于它的价值。而且我发现显式硒等待可能会有点冗长,而且它并不是我的框架中想要的一切,所以我做了很多扩展。这是其中之一。请注意,我在上面的示例中使用 FindElements,因为我不希望在找不到任何内容时引发异常。这应该适合你。

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

这是我的完整扩展文件,来自 Github gist。我包装了几乎所有的 Selenium 函数。我做了很多 Javascript,因为 JQuery 在查找元素方面是 100% 可靠的,而 Selenium 的查找功能在 IFrame 之类的东西中存在一些问题。此外,JQuery 有一种非常健壮且超级可读的方式来使用任意数量的定位器查询 DOM 中的元素,无论它们是 ID、类、文本包含、伪选择器等;都在同一个查询字符串中! (Selenium css 选择器缺乏对伪选择器的支持可能是一个限制)这就是我使用它的原因。它比 xpath 更具可读性,更容易编写,并且在正确编写时 100% 可靠。如果您在测试页面上没有 JQuery,您可以在每次加载新页面时简单地注入 JQuery 的脚本。

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

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

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 2021-02-22
    • 2019-12-02
    • 2017-10-17
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2012-06-14
    相关资源
    最近更新 更多