在Selenium中,Element.Displayed()在捕获Exception之前等待太久

时间:2018-02-23 16:55:57

标签: c# visual-studio selenium qwebelement

我编写了一个方法IsElementPresent,它返回true / false是否显示元素。

这是我的方法

    public static bool IsElementPresent(this IWebElement element)
    {
        try
        {
            return element.Displayed;                                  
        }
        catch (Exception)
        {
            return false;
        }

    }

现在有时当它应该返回false时,element.Displayed在捕获Exception并返回false之前等待大约20秒(通过调试找到)。如果它找到了元素,它工作正常。

我还将代码更改为:

public static bool IsElementPresent(this IWebElement element)
{          
    try
    {
        WebDriverWait wait = new WebDriverWait(DriverContext.Driver, TimeSpan.FromSeconds(0.1));
        wait.Until(ExpectedConditions.ElementToBeClickable(element));                
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

现在在Wait.Until行中发生了同样的等待。代码工作正常但只是在找不到元素时不必要的延迟。重要的是如何找到元素。当按类发现元素时,会发生这种特殊的延迟。使用xpath,css或id可以找到大多数其他元素。如果我错过任何信息,请告诉我。使用VS社区15.5.6

1 个答案:

答案 0 :(得分:0)

根据API文档IWebElement.Displayed属性 gets a value indicating whether or not this element is displayed 。它没有等待。因此,如果任何 Exception 立即被提升。

但是当您使用ExpectedConditions Class引入 Wait.Until 时,它会提供一组可以使用WebDriverWait Class WebDriver 实例根据ExpectedConditions子句等待,在您的情况下为ExpectedConditions.ElementToBeClickable Method (By)

ExpectedConditions.ElementToBeClickable Method (By) 被定义为检查元素是否可见并启用的期望,以便您可以单击它。

  • 语法为:

    public static Func<IWebDriver, IWebElement> ElementToBeClickable(
        By locator
    )
    
  • 参数:

    locator
    Type: OpenQA.Selenium.By
    The locator used to find the element.
    
  • 返回值:

    Type: Func<IWebDriver, IWebElement>
    The IWebElement once it is located and clickable (visible and enabled).
    

因此,在使用 WebDriverWait ExpectedConditions 时,功能上没有任何延迟。

最后,正如你提到的,当类被发现时,会发生这种特殊的延迟。大多数其他元素都是使用xpath,css或id 找到的,这是与Locator Strategy相关的事实,您从下面的列表中选择locator时使用了该事实:

  • css selector
  • link text
  • partial link text
  • tag name
  • xpath

有很多关于定位器性能方面的实验和基准测试。你可以在这里找到一些讨论: