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

硒:检查元素的存在

孙才捷
2023-03-14

在实时自动化中,在对每个元素执行操作之前,我们是否检查它们的存在(在测试中)?

只要有一个findElement语句,就有可能出现NoTouchElementException。我的问题是我们是否每次都检查元素的存在?

是否每个findElement语句都需要被try-catch块包围?

共有3个答案

弓晔
2023-03-14

您可能会发现AbstractWebDriverEventListener类的使用特别有用。此类实现接口WebDriverEventListener,该接口为WebDriver触发的事件定义之前之后的挂钩。

可以实现一个这样的前钩子前FindBy来检查元素的存在。例如:

public void beforeFindBy(By by, WebElement element, WebDriver driver) {
    // Explicit wait to check for the presence of the element using the "by" locator
}

类似地,可以实现beforeClickOn之前的before钩子,以在对该元素执行click事件之前检查该元素是否可单击。

仲阳朔
2023-03-14

逐一回答您的问题:

  • “在实时自动化中,在对每个元素执行某些操作之前,我们是否检查每个元素(在测试中)是否存在”:是,根据最佳实践,每当用户被重定向到新页面时,您需要确保元素的状态符合所需操作

有3个最广泛使用的预期条件,它们可以与WebDriver等等一起使用来验证元素的状态,如下所示:

定位元素的存在(通过定位器)定义如下:

public static ExpectedCondition<WebElement> presenceOfElementLocated(By locator)

Description : An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible.

VisibilityOfElement定位(通过定位器)定义如下:

public static ExpectedCondition<WebElement> visibilityOfElementLocated(By locator)

Description : An expectation for checking that an element is present on the DOM of a page and visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0.

ElementToBeClickable(通过定位器)定义如下:

public static ExpectedCondition<WebElement> elementToBeClickable(By locator)

Description : An expectation for checking an element is visible and enabled such that you can click it.
  • “只要有一个findElement语句,就有可能没有触及到例外”:不,一点也不。如果你构造了一个合适的定位策略,你就不会面临无接触异常

在这里,您将看到关于NoTouchElementExeption的详细讨论,selenium无法定位元素

  • 是否每个findElement语句都需要被try-catch块包围:不,不一定。如果您的用例同时涉及肯定和否定场景的处理,那么try-catch{}block就是perfecto

吴俊晤
2023-03-14

有两种情况需要说明:

  1. 元素是否存在;这意味着它是否存在于DOM中
  2. 元素是否可见;这意味着它在DOM中,没有隐藏或等效的标志

对于第一种情况,我使用以下helper方法:

this.waitForElement = function(locator) {
    browser.wait(function() {
      return browser.isElementPresent(locator);
    }, testData.Timeout.TWO_MINUTES);
};

这将等待与提供的定位器匹配的元素出现的任意时间(它存在于DOM中)。

对于第二种情况,我使用以下helper方法:

this.waitForElementIsVisible = function(el){
    let EC = protractor.ExpectedConditions;
    browser.wait(EC.visibilityOf(el), testData.Timeout.TWO_MINUTES, "Element did not become visible after 2 minutes");
};

这将使用一个WebElement作为单个参数,并等待直到元素变得可见(它存在于DOM中,并且不通过css样式或其他方式隐藏)

作为奖励,我还发现这个助手方法对于测试表单中的错误状态非常有用:

this.waitForElementIsClickable = function(el){
    let EC = protractor.ExpectedConditions;
    browser.wait(EC.elementToBeClickable(el), testData.Timeout.TWO_MINUTES, "Element did not become clickable after 2 minutes");
};

将一个WebElement作为第一个参数,并等待直到可以单击该WebElement。

注意,我在这些代码片段中使用了量角器和引用量角器。所以,除非您也使用量角器,否则很可能无法通过直接复制粘贴100%地工作。不过,调整它们以适应您的设置应该很容易。

 类似资料:
  • 问题内容: 在实时自动化中,在对每个元素执行某些操作之前,我们是否要检查每个元素的存在? 无论哪里有声明,都有机会出现 NoSuchElementException 。我的问题是我们是否每次都要检查元素的存在? 是否每个语句都必须用块包围? 问题答案: 您可能会发现使用AbstractWebDriverEventListener类特别有用。此类实现WebDriverEventListener接口,

  • 本文向大家介绍检查Java ArrayList中元素的存在,包括了检查Java ArrayList中元素的存在的使用技巧和注意事项,需要的朋友参考一下 java.util.ArrayList.contains()方法可用于检查ArrayList中是否存在元素。此方法具有单个参数,即要测试其在ArrayList中是否存在的元素。如果该元素存在于ArrayList中,则返回true;如果不存在该元素,

  • 这是代码: 这是我已经在python上尝试过的: 返回: 你知道吗?谢谢

  • 问题内容: 我有一个看起来像元组的列表: 检查该元组中是否存在值的最佳方法是什么?例如,我想能够说: 并得到真 问题答案: 您正在寻找: 结合一个简单的生成器表达式,就可以完成任务。生成器表达式接受每个元组,如果包含则产生。然后在请求的第一个项目返回时返回(否则为)。因此,这就是您想要的。它也可以很好地读取- 如果有任何元组包含。 如果您要执行大量操作并且需要性能,那么可能值得设置所有值的集合以使

  • 问题内容: 我想检查Selenium中是否存在一个元素,如果存在,请将其分配给一个名称。 现在,我有这样的东西: 但是,当不存在值为9的元素时,它将返回错误。有没有一种方法可以检查它是否存在,或者类似的东西? 问题答案: 有几种选择。我推荐这些。 1.创建方法或Web驱动程序扩展。 2.计算元素,如果有1个或更多元素,则获取它。 那你可以检查

  • 问题内容: 我有一个问题-我正在使用Selenium(firefox)Web驱动程序打开网页,单击一些链接等,然后捕获屏幕截图。 我的脚本可以从CLI正常运行,但是通过cronjob运行时,它并没有通过第一个find_element()测试。我需要添加一些调试,或一些帮助我弄清为什么失败的东西。 基本上,我必须先单击“登录”锚点,然后才能进入登录页面。元素的构造为: 我正在通过LINK_TEXT方