2016-08-17 45 views
3

我有超过1个XPath指向一个web元素,我想确定这两个元素是否相等(即,如果我在这两个web元素上执行动作sendKeys()或click(),该动作将在相同网络元素)目前我使用以下方法检查平等:WebElement.equals()方法如何检查平等?

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


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

这将返回true,只要双方的XPath指向同一个元素。

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

我想开发一个万无一失的方法来确定两个web元素的相等性。

我正在使用Java和Selenium。

谢谢

+0

WebElement是一个接口。您需要确定您拥有的实际对象的类型。然后,您可以在线查找该对象的源代码以查看equals()实现 –

回答

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 
0

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

+0

谢谢。并非所有Web元素都有ID(例如Entropay.com上的用户名和密码字段)在这种情况下,RemoteWebElement如何比较它们? –

+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

+0

此外,您还提到“如果您创建两个Web元素,即使它们指向相同的元素,它们的id值也会不同”,但似乎并非如此。在我之前的主帖子中,有两个完全不同的web元素(element1和element2),equals()方法返回true。另外,如果RemoteWebElement没有比较网页上的HTML/CSS ID,那么它们实际上是在比较什么。我是说他们在什么基础上决定两个元素是相同/不同的? –

0

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

根据此方法,如果两个元素的id相同,则在浏览器响应findElement而返回id时,两个元素将被视为相等。因此,如果我们使用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); 

}