【问题标题】:How can I check if webelement exists in Selenium?如何检查 Selenium 中是否存在 webelement?
【发布时间】:2019-06-12 15:23:44
【问题描述】:

我想创建一个 java 方法来检查是否存在实际的 selenium webelement。

重要的是,我需要创建一个方法,该方法将 Webelement 作为参数,而不是 By 或 String id。而且我想避免 try-catch 解决方案,如果发生 NoSuchElementException,它将返回 false。

public boolean isElementExists(WebElement element) {
    //TODO Implement...
}

例子:

foo.html

<!DOCTYPE html>
<html>
<body>

<button id="button1" type="button">First button</button>

</body>
</html>

FooPage.java

public class FooPage {

    @FindBy(how = How.ID, using = "button1")
    public WebElement fistButton;

    //Missing button
    @FindBy(how = How.ID, using = "button2")
    public WebElement secondButton;

}

FooPageTest.java

public class FooPageTest {
    public void test(FooPage page) {
        page.firstButton.click(); // OK
        page.secondButton.click(); // NoSuchElementException
        //So I need to check if element exists in this class.
        //I can access here to the FooPage, the webelement to check, and to the driver.
    }
}

【问题讨论】:

  • 据我所知,您的方法不起作用,因为您点击WebElement element=driver.findElement(XXX) line selenium 的那一刻将尝试返回页面上不存在的元素。因此,如果页面上不存在元素,您将在点击isElementExists 方法之前得到NoSuchElement 异常。
  • 如果您仍然想坚持自己的想法,那么您可以采用这种方法 - 使用 findElements,然后将其作为参数发送到 isElementExists(listofEelement, indexOfInteresedElement) 方法。
  • 问题是,我有一个很大的 UI 测试系统,我必须在很多时候修复它。并且已经有 Page 对象,它们具有 WebElement 属性。这些属性至少使用了 1000 个位置,并且没有检查这些属性是否存在。我想创建一个 Util 类,它会有这个方法,我会调用它。但是在大多数地方,我没有 ID,或者关于元素属性的任何信息,只有 WebElement 和 Page 对象,我必须以某种方式处理它。所以在这种情况下我可能无法使用 findElements。
  • 您最好创建一个 WebElement 接口的自定义实现,该接口包装另一个 WebElement,以便捕获在元素不存在时抛出的 NoSuchElementException。你确定你不是在寻找一些东西来测试一个元素是否是你可以与之交互的东西吗?这是一个完全不同的问题要解决。
  • 也许吧。所以实际的系统不会检查一个元素是否存在,所以它只是尝试例如单击不存在的按钮并将文本发送到不存在的输入元素。在这个方面,我可以说我不能与他们互动,但如果你的意思是,元素存在,它只是被禁用或任何东西,那么不,这不是我想要的。是否有意义?我试着很快在这里写一个例子。

标签: java selenium


【解决方案1】:

由于 Selenium 在尝试单击第二个按钮时会引发 NoSuchElementException,因此请在您的页面对象中创建一个方法来执行单击:

public class FooPage {
    @FindBy(how = How.ID, using = "button1")
    public WebElement firstButton;

    //Missing button
    @FindBy(how = How.ID, using = "button2")
    public WebElement secondButton;

    public FooPage(WebDriver driver) {
        PageFactory.initElements(driver, this);
    }

    public void clickThebuttons() {
        firstButton.click();

        try {
            secondButton.click();
        } catch (NoSuchElementException ex) {
            // Do something when the second button does not exist
        }
    }
}

【讨论】:

  • try-catch 解决方案会使流程变慢多少?例如,如果我必须在测试用例中单击大约 200 次?
  • @pityo10000:我怀疑差异会很明显。通常是 try-catchcatch/exception 堆栈展开部分较慢,即使这样,您也需要对性能进行基准测试以了解速度差异是否实际上有问题。
  • 好的,那么我可能会使用这个解决方案。似乎没有其他方法(这会很漂亮)。非常感谢!
猜你喜欢
  • 2017-04-28
  • 2018-05-14
  • 1970-01-01
  • 2019-12-13
  • 2023-01-11
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2011-10-27
相关资源
最近更新 更多