c# - Selenium C# - ElementExists 没有 "By locator"

标签 c# selenium webdriver

我使用 Selenium WebDriver 工作了几个星期,我的项目即将完成,但有一些事情让我失去了耐心。

在我的项目中,我将所有内容划分为类,因此有一个类放置我的元素,声明如下例(在同一个类中,我放置在测试中实现的函数):

    [FindsBy(How = How.XPath, Using = "//div[@class='k-widget k-window' and not(contains(@style,'display: none;'))]//button[text()='Confirmar']")]
    private IWebElement GenericConfirmButton { get; set; }

我的职责之一是:

    private void ClickConfirmButtonIfVisible()
    {
        if (GenericConfirmButton.IsVisible())
            GenericConfirmButton.SetClick();
    }

函数IsVisible()执行以下代码(在另一个类中):

    public static bool IsVisible(this IWebElement element)
    {
        try
        {
            new WebDriverWait(GeneralProperties.Driver, TimeSpan.FromMilliseconds(0))
                .Until(ExpectedConditions.ElementToBeClickable(element));
            if (element.Enabled && element.Displayed)
            {
                return true;
            }
            else
            return false;
        }
        catch (WebDriverTimeoutException)
        {
            return false;
        }
    }

所以,我的问题是:这个函数 IsVisible() 需要大约 5 秒的时间来执行(如果该元素不存在)。我这样做的目的是,如果我点击“确认”按钮,它必须检查该元素是否存在,如果不存在,则返回false

我已经尝试使用 ElementExists 而不是 ElementToBeClickable 但我不知道该怎么做(因为我使用一个单独的类来声明 IWebElement 元素并且此函数需要 By 声明)。我想使用 ElementExists (我相信它会比现在运行得更快)。或者,如果您知道任何其他方法并且可以帮助我,我真的很感激。

仅此而已。谢谢!

最佳答案

它等待 5 秒,因为您在代码中的某个位置在驱动程序上设置了ImplicitlyWait。您可以删除它,但如果您有其他依赖于隐式等待的测试,这些测试可能会受到影响。

一般来说,我建议仅使用显式等待,部分使用 an issue意外的等待时间结合了显式隐式等待。

通过避免逻辑中的 if 语句,确保您的测试逻辑不会变得过于聪明,也可以避免此问题。在这种情况下,基本上您的测试用例应该知道按钮是否存在,因此逻辑应该反射(reflect)这一点。

关于c# - Selenium C# - ElementExists 没有 "By locator",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45081699/

相关文章:

c# - 从外部程序集动态加载类型

python - 尝试从 url 下载 PNG 时出错

java - 如何通过 Java 使用 Selenium 打印 url 中的所有按钮文本

java - 在不同的浏览器 session 中运行测试,但始终得到 'NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?'

java - 与远程浏览器通信时出错

c# - 将静态值分配给另一个类的类

c# - 替换方法的所有用法(引入间接)

javascript - 在 docker 容器中运行 selenium 测试

java - 我无法在 Selenium 中将 Java 的解决方案重写为 C#

c# - Skip and Take 在 Linq to Objects 中的表现