2016-08-17 6 views
3

私は複数の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)); 

これは、同じ要素へのXPathポイントの両方限りtrueを返します。

しかし、方法が平等をどのように判断するのか不明です。実際には2つのWeb要素が同じである(つまり、同じWeb要素上で実行されるアクションはすべて同じWeb要素上で実行される)状況はありますか?またはその逆?

私は、2つのWeb要素の同等性を判断する完全な方法を開発しようとしています。

私はJavaとSeleniumを使用しています。

ありがとうございます。

+0

WebElementはインターフェイスです。あなたはあなたが持っている実際のオブジェクトのタイプを決定する必要があります。そのオブジェクトのオンラインソースを探して、equals()の実装 –

答えて

1

しかし、私は方法が平等をどのように決定するかわからないのですか?

ドライバは、文書内の各遭遇HTMLElementオブジェクトの参照を生成し、常にHTMLElement目的のために、同一の参照を返します。

この参照はクライアント側のWebElement.idプロパティに格納されており、ロケータで使用されるid属性とは関係ありません。

2つのWebElementの間の同等性を判断するために、クライアントは単にWebElement.idに格納されている参照をテストします。

2つのWeb要素が実際に同じであるが、方法が異なることを示す状況はありますか?

技術的に言えば、決して起こることはありません。それが事実であれば深刻な問題になります。

しかし、それはあなたが同じものが何を意味するかによって異なります。例えば、ボタンは2つの異なる瞬間に同じように見えるかもしれませんが、新しい参照を生成する同じものに置き換えられているかもしれません。これは、ページまたは一部が読み込まれた場合です。

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)を比較します。同じ要素を指していても2つのWebElementsを作成した場合、id値は異なります。 Infact idはハッシュコードとしても使われます。両方の要素の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

また、「同じ要素を指していても2つのWeb要素を作成すると、id値が違う」と言われましたが、これは当てはまりません。前のメインポストの例では、全く異なる2つのWeb要素(element1とelement2)があり、equals()メソッドはtrueを返します。また、RemoteWebElementがWebページ上のHTML/CSS idを比較しない場合は、実際に比較しています。私は、彼らが2つの要素が同じ/異なっていると判断する根拠は何ですか? –

0

以下は、WebElementインターフェイスを実装するRemoteWebElementのequals実装です。

このメソッドでは、idが同じ場合は2つの要素が等しいとみなされます。idはfindElementの応答としてブラウザから返されます。したがって、2つの異なるxpathを使用してfindElementを実行すると、返される要素からid属性を確認できます。 2つの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); 

}

関連する問題