2017-12-21 5 views
1

WebElementがhtmlコードの前に来るかどうか調べることはできますか?Selenium WebElementsのhtmlコードの順番を確認することは可能ですか

さらに一般的には、WebElementオブジェクトのコレクションをhtmlコードでその順序に従ってソートすることは可能ですか? (注:多くの要素をソートすることは、実際に私の意図ではありません)XPath

/* 
<html> 
    <body> 
    <div> 
     <div>first</div> 
    </div> 
    <div>second</div> 
    </body> 
</html> 
*/ 
public int compare(WebElement a, WebElement b) { 
    return -1; // if a=first, b=second 
    return 0; // I'm not really interested in corner cases 
    return 1; // if a=second, b=first 
} 

あなたはpreceding::following::軸を持っていますが、私の場合、私はすでにWebElementオブジェクトを持っていると私はそれらの相対的な順序を決定します。

+2

これはあなたの意図ではない場合、実際の質問をしてください。 – JeffC

+0

あなたがしたいことが、WebElementオブジェクトをDOMの最上部に近接してソートされていれば、それは可能ではないと思います。基本的に、DOM上のhtml /からの最短ノードオフセットを評価しようとしています。 – shagans

+0

さて、最初の文は私の実際の質問で、2つの要素の順序を比較しています。 WebElementsのコレクション全体をソートするのは悪い考えだと思うが、より一般的なケースについて言及することが最善であると思っただけだ。最初に要素を取得したセレクタを変更すると、より効率的に実行できます。 – neXus

答えて

0

は、私はこれをテストしていないと私は、オンザフライでそれをコード化しています:

public WebElement firstInList(WebElement a, WebElement b) { 

    WebElement found = null; 
    List<WebElement> all = driver.findElements(By.xpath("//*"); 

    for (WebElement test : all) { 
     if (test.equals(a)) { 
      found = a; 
      break; 
     } else if (test.equals(b)) { 
      found = b; 
      break; 
     } 
    } 

    return found; 

} 
+0

すべての要素のリスト(ドキュメント順)を取得したら、 'for'ループの代わりに' indexOf'を使うだけで済みます。私はこの解決策は、私が言及xpath軸を使用して改善することができると思います。それは私がすでに考えていたことでしたが、私はその暴力ではないものを発見することを望みました。 – neXus

0

が苦痛になります2貴様のIWebElementsを使用してそれを作るために - 困難であるとproccessすることに多くの時間がかかりますhtmlノードを発見するための情報と、それぞれがどこにあるのかを知り、最終的に誰が最初で誰が2番目であるかを知らせます。

私のsugestionは、cssSelectorまたはXpathという2つのセレクタを使用しています。どちらも自分自身の内部で複数の条件を組み合わせることができ、findElementsを使用してIWebElementsのリストを返そうとすると、html順序に基づいて返されます。それは、fiersのhtmlノードがリストの最初の要素になることを意味します。

例(C#の場合、申し訳ありませんが、私は、Javaを知らない)

public bool IsATheFirstElement(string aXPathSelector, string bXPathSelector) 
{ 
    // Creates a xpath to find both elements: A and B 
    var generalXPath = aXPathSelector + " | " + bXPathSelector; 

    // Get a list of elements containing A and B, in HTML order 
    var ab = _driver.FindElements(By.XPath(generalXPath)); 

    // Get the A element 
    var a = _driver.FindElement(By.XPath(aXPathSelector)); 

    // Returns a bool value that checks if a is the first element or not 
    return ab.First() == a; 
} 
0

このソリューションではなく、 "ブルートフォース" です。
aの後のすべての要素を探し、bがあるかどうかを確認します。

public int compare(WebElement a, WebElement b) { 
    if(a.equals(b)){ 
     return 0; 
    } 
    List<WebElement> afterA = a.findElements(By.xpath("descendant::* | following::*")); 
    if(afterA.contains(b)) { 
     return -1; 
    } else { 
     return 1; 
    } 
} 
関連する問題