我编写了一个方法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
答案 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
强> 有很多关于定位器性能方面的实验和基准测试。你可以在这里找到一些讨论: