WebElement.equals()方法如何检查平等?

时间:2016-08-17 17:01:31

标签: java selenium xpath

我有超过1个XPath指向一个web元素,我想确定两个元素是否相等(即,如果我在两个web元素上执行动作sendKeys()或click(),则动作将在相同的网页元素)目前我正在使用以下方法检查是否相等:

    WebElement element1 = driver.findElement(By.xpath(".//*[@id='ap_email']"));
    WebElement element2 = driver.findElement(By.xpath(".//*[@type='email']"));


    System.out.println(element1.equals(element2));

只要两个XPath都指向同一个元素,这将返回true。

但是,我不确定该方法如何确定相等性?在这种情况下,两个网络元素实际上是否相同(即,对它们执行的任何操作都将在同一个网络元素上执行)但方法显示它们不同?反之亦然?

我正在尝试开发一种简单的方法来确定两个Web元素的相等性。

我正在使用Java和Selenium。

由于

3 个答案:

答案 0 :(得分:1)

  

但是,我不确定该方法如何确定相等性?

驱动程序为文档中每个遇到的HTMLElement对象生成一个引用,并始终为HTMLElement对象返回相同的引用。

此引用存储在客户端的WebElement.id属性中,与定位器使用的id属性无关。

因此,要确定两个WebElement之间的相等性,客户端只需测试WebElement.id中存储的引用。

  

在这种情况下,两个网页元素实际上是否相同,但方法显示它们不同?

从技术上讲,不会发生这种情况,如果是这样的话,这将是一个严重的问题。

但这取决于你的意思。例如,按钮在两个不同时刻看起来相同,但可能已经被生成新引用的相同按钮所取代。重新加载页面或某些部分时就是这种情况:

  driver.get("http://stackoverflow.com/");

  WebElement elementA = driver.findElement(By.cssSelector("#logo"));
  WebElement elementB = driver.findElement(By.cssSelector("#logo"));

  boolean same1 = elementA.equals(elementB);  // return true

  elementB.click();  // reloads the page, all the previous web element are now obsolete

  WebElement elementC = driver.findElement(By.cssSelector("#logo"));

  boolean same2 = elementA.Equals(elementC);  // return false

答案 1 :(得分:0)

以下是RemoteWebElement中实现WebElement接口的equals实现。

根据这种方法,如果两个元素的id相同,则将两个元素视为相等,其中id是从findElement响应的浏览器返回的。因此,如果我们使用2个不同的xpath执行findElement,您可以从响应中返回的元素中检查id属性。如果两个id相同,它们将被视为相同的元素,否则它们将被视为不同的元素。

public boolean equals(Object obj) {
if (!(obj instanceof WebElement)) {
  return false;
}

WebElement other = (WebElement) obj;
while (other instanceof WrapsElement) {
  other = ((WrapsElement) other).getWrappedElement();
}

if (!(other instanceof RemoteWebElement)) {
  return false;
}

RemoteWebElement otherRemoteWebElement = (RemoteWebElement) other;

return id.equals(otherRemoteWebElement.id);

}

答案 2 :(得分:-1)

RemoteWebElement是实现WebElement的类。 equals方法比较id变量,它是一个String。如果创建两个WebElements,即使它们指向同一个元素,它们的id值也会不同。 Infact id也用作haschcode。您可以通过打印出两个元素的ID进行检查。

相关问题