2016-08-17 46 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); 

}