Selenium C# - ElementExists没有"通过定位器"

时间:2017-07-13 13:13:30

标签: 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秒钟(如果元素不存在)。我的目的是,如果我按下按钮" Confirmar",它必须检查该元素是否存在,如果不存在,则返回 false

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

这就是全部。谢谢!

1 个答案:

答案 0 :(得分:3)

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

一般来说,我建议只使用显式等待,部分执行an issue,并将意外等待时间与显式隐含等等。

通过避免逻辑中的if语句,确保您的测试逻辑不会过于聪明,也可以避免此问题。在这种情况下,基本上你的测试用例应该知道按钮是否存在,所以逻辑应该反映出来。