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

6

我有多个XPath指向一个网页元素,我想确定这些元素是否等价(即,如果我在这两个元素上执行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。

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

我正在尝试开发一种可靠的方法来确定两个网页元素的相等性。

我正在使用Java和Selenium。


WebElement是一个接口。您需要确定实际对象的类型。然后,您可以在网上找到该对象的源代码,以查看equals()的实现。 - Tyler Lee
3个回答

2
然而,我不确定这个方法如何确定相等性?
驱动程序为文档中遇到的每个HTMLElement对象生成一个引用,并始终为一个HTMLElement对象返回相同的引用。
此引用存储在客户端的WebElement.id属性中,与使用定位器的id属性无关。
因此,要确定两个WebElement之间的相等性,客户端仅测试存储在WebElement.id中的引用。
在什么情况下两个web元素实际上是相同的,但该方法显示它们是不同的?
严格来说,永远不会发生,并且如果是这种情况,这将是一个严重的问题。
但这有点取决于您所说的“相同”。例如,按钮可以在两个不同的时刻看起来相同,但可能已被相同的按钮替换,从而生成新的引用。当页面或某些部分重新加载时,就是这种情况。
  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

RemoteWebElement是实现WebElement的类。equals方法比较id变量,该变量是一个字符串。即使您创建了两个指向同一元素的WebElements,它们的id值也将不同。事实上,id也用作haschcode。您可以通过打印两个元素的id来检查。


谢谢。并非所有的网络元素都有ID(例如Entropay.com上的用户名和密码字段),在这种情况下,RemoteWebElement如何进行比较? - ee clipse
1
这与HTML上的CSS ID无关。此ID是在RemoteWebElement类中生成的。请在此处查看源代码 - http://grepcode.com/file/repo1.maven.org/maven2/org.seleniumhq.selenium/selenium-remote-driver/2.47.1/org/openqa/selenium/remote/RemoteWebElement.java - Grasshopper
您还提到“如果您创建了两个 Web 元素,即使它们指向相同的元素,它们的 ID 值也会不同”,但事实并非如此。在我之前的主贴示例中,有两个完全不同的 Web 元素(element1 和 element2),equals() 方法返回 true。另外,如果 RemoteWebElement 不比较 Web 页面上的 HTML/CSS ID,则它们实际上在比较什么?我的意思是,它们基于什么来判断两个元素是否相同/不同? - ee clipse
你是对的,它们有相同的ID。所以我猜equals方法会起作用,即使它们是由不同的方法创建的。 - Grasshopper

1

以下是实现WebElement接口的RemoteWebElement中的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);

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接