我有超过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。
由于
答案 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进行检查。