当前位置: 首页 > 知识库问答 >
问题:

在硒元素中。Displayed()在捕获异常之前等待的时间太长

赵立果
2023-03-14

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

这是我的方法

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

    }

现在,有时它应该返回false,元素。在捕捉异常并返回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;
    }
}

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

共有1个答案

西门鹏程
2023-03-14

根据API DocsIWebElement。显示属性获取一个值,该值指示是否显示此元素。它不涉及等待。因此,如果引发任何异常,它会立即出现。

但当你诱导等待时。直到与提供一组可以使用WebDriverWait类等待的公共条件的ExpectedConditions类一起,WebDriver实例根据ExpectedConditions子句(即ExpectedConditions)等待。ElementToBeClickable方法(By)。

期望条件。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找到的,这与您在从以下列表中选择定位器时使用的定位器策略有关:

  • css选择器
  • 链接文本
  • 部分链接文本
  • 标签名称
  • x路径

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

  • 使用Selenium的定位器性能指标
  • Css Vs。X路径
  • Css Vs。X路径,在显微镜下
  • Css Vs。X路径,显微镜下(第2部分)
  • css-selector有什么区别
 类似资料:
  • 问题内容: 我试图让Selenium等待页面加载后动态添加到DOM的元素。试过这个: 如果有帮助,这里是: 但是它抛出一个-看起来像期望元素存在,所以这是有缺陷的。这一定是Selenium的面包和黄油,不想重新发明轮子……任何人都可以提出其他选择,理想情况下不用自己动手做? 问题答案: 需要等待时,您需要异常调用以忽略。 有关更多信息,请参见FluentWait文档。但是请注意,此条件已经在Exp

  • 我有一个动态加载的页面,其中包含一个按钮。我正在尝试等待selenium使用C#绑定点击按钮。我有以下代码: 不过这不管用。click事件永远不会被触发。selenium脚本不会抛出异常警告ID为“addInspectionButton”的元素不存在。它只是不能点击它。如果我加一根线。Sleep(3000)在wait语句和我获得按钮元素句柄的那一行之间。 我没有使用预期条件.元素在这里正确点击吗?

  • 我正在使用Java、Selenium和chrome进行测试自动化。我想输入文本,等待它显示,然后单击TAB,我想避免,所以我使用以下代码: 但是它将字段留空并转到下一个元素。 < li >我如何修复它? < li >有没有办法在发送密钥之前使用显式等待?

  • 我正在与async Wait try catch块斗争几天。 这个异步函数中的try-catch是否正确? 这就是我创建自定义错误类并全局导出的方式。 要求: 故意换了工作。我想找份工作。国际直拨电话 这样我就能抓住错误。如果有错误,则抛出新创建的自定义错误类。但抛出队列错误将导致日志记录 同样,即使不需要捕捉那个里的错误,因为try块在工作,若我抛出QueueError,我只想捕捉最后一个cat

  • 我最近将selenium升级到最新版本(2.53),将firefox升级到最新版(45.0.1)。 我在相同的网站上运行相同的代码,但我突然有很多这样的例外: Web 驱动程序异常: 消息: 元素在点 (312, 8.816665649414062) 不可单击。其他元素将收到单击: 例如: 有什么我应该注意的新东西吗?我之前的python selenium版本相当旧,而且我在Firefox 38上

  • 我正在用。NET核心编写一个ASP.NET MVC站点。我试图封装一些常见的异常处理。在基类中,我有这个方法。 从继承自该基类的控制器中,我使用如下方法: 假设_someservice.getAsync()方法如下: 这工作得很好,将捕获基类方法中的异常并返回NotFound结果。 但是,我希望避免从SomeService.GetAsync方法调用。result。我读到的任何地方都说不要那样做,因