2016-12-06 11 views
3

Selenium Webテストでは、WebElementsを識別する方法がいくつかあります。私の経験でfindElement()で使用する最も効率的なセレクタは何ですか?

、私は以下のセレクタを使用しています

  • クラス名 - By.className()
  • CSSセレクタからBy.cssSelector()
  • IDからBy.id()
  • リンク・テキスト - By.linkText()
  • 名前 - By.name()
  • タグ名からBy.tagName()
  • のXPathからBy.xpath()明らか

、唯一のオプションは、要素の位置を特定するために使用可能であるとき、私たちはそのいずれかを使用する必要があります複数のメソッドが使用されている場合(例:下のdivなど)、どのメソッドを使用するかはどのように決定する必要がありますか?より効率的なのセレクタが他に比べてですか? より耐久性のあるものがありますか

<div class="class" id="id" name="name">Here's a div</div> 

答えて

1

私はこのようなセレクタの優先順位を設定したい:

  • IDからBy.id()
  • 名前 - By.name()
  • CSSセレクタからBy.cssSelector()
  • XPathのからBy.xpath()
  • タグ名からBy.tagName()
  • リンク・テキストからBy.linkText()

はしかし、uniqのIDと名前は常に存在していません。また、CSSセレクタを使用してID #element_idまたは名前[name=element_name]またはクラス名.element_classで検索することができます。ID,NameおよびClassNameの代わりにCSSセレクタを使用することをお勧めします。 CssはxPathよりも速いので、可能であればそれを使用する方が良いです。 xPathは、CSSセレクタが見つけることができない難しい要素ロケータに適しています。また、xPath(リンクテキストの場合は//a[text()='link_text']、タグ名//div)やCSSセレクタ(タグ名divの場合)と同じように書くことができるので、タグ名とリンクテキストは使用しません。

7

ただのため& gs ...

私は5つの別々の時間の上にあるdivを見つけ出し、その要素を見つけるのに要した時間の平均をとったそれぞれの識別方法を計時しました。

WebDriver driver = new FirefoxDriver(); 
driver.get("file://<Path>/div.html"); 
long starttime = System.currentTimeMillis(); 
//driver.findElement(By.className("class")); 
//driver.findElement(By.cssSelector("html body div")); 
//driver.findElement(By.id("id")); 
//driver.findElement(By.name("name")); 
//driver.findElement(By.tagName("div")); 
//driver.findElement(By.xpath("/html/body/div")); 
long stoptime = System.currentTimeMillis(); 
System.out.println(stoptime-starttime + " milliseconds"); 
driver.quit(); 

彼らが

  • CssSelector ..平均実行時間によって以下にソートされています(796ms + 430ms + 258ms + 408ms + 694ms)/ 5 =
  • 517.2ms ClassName:(670ms + 453ms + 812ms + 415ms + 474ms)/5 = 〜564.8ms
  • :(342ms + 901ms + 542ms + + 393ms 847ms)/ 5 = 〜605ms
  • ID:〜614ms
  • (888ms + 700ms + 431ms + 550ms + 501ms)/ 5 = のXpath:(835ms + 770ms + 415ms + 491ms + 852ms)/ 5 = 〜672.6ms
  • TagNameに:(998ms + 832ms + 1278ms + 227ms + 648ms)/ 5 =
  • 796.6ms

@ JeffCの答えを読んだ後、By.cssSelector()とclassname、tagname、idを検索条件として比較しました。再び、結果は

WebDriver driver = new FirefoxDriver(); 
driver.get("file://<Path>/div.html"); 
long starttime = System.currentTimeMillis(); 
//driver.findElement(By.cssSelector(".class")); 
//driver.findElement(By.className("class")); 
//driver.findElement(By.cssSelector("#id")); 
//driver.findElement(By.id("id")); 
//driver.findElement(By.cssSelector("div")); 
//driver.findElement(By.tagName("div")); 
long stoptime = System.currentTimeMillis(); 
System.out.println(stoptime-starttime + " milliseconds"); 
driver.quit(); 
  • By.cssSelector(".class") ..以下である:(327ms + 165ms + 166ms + 282ms + 55ms)/ 5 = 〜199ms
  • By.className("class"):(338ms + 801ms + 529ms + 804ms + 281ms)/ 5 = 〜550ms
  • By.cssSelector("#id"):(58ms + 818ms + 261ms + 51ms + 72ms)/ 5 = 〜252ms
  • By.id("id") - (820ms + 543ms + 112ms + 434ms + 738ms)/ 5 = 〜529ms
  • By.cssSelector("div"):(594ms + 845ms + 455ms + 369ms + 173ms)/ 5 = 〜487ms
  • By.tagName("div"):(825ms + 843ms + 715ms + 629ms + 1008ms)/ 5 = 〜804ms

これからは、あなたができることすべてについて、CSSセレクタを使用する必要があるようです。

3

私の経験で、私はこのためにこれらのロケータを使用します。

  1. ID
  2. linkText/partialLinkText
  3. CSSセレクタ
  4. のXPath

その他:クラス名、タグ名、名前などはすべてCSSセレクタを使って見つけることができます。私はめったに1つのクラス名を必要としないので、複数のクラスを使用することができるようにCSSセレクターを好むだけでなく、より具体的で壊れにくいタグ名を指定することもできます。タグ名はめったに使われません... TABLEやTRタグやTDタグについては、CSSセレクタですべて行うことができます。私は一般的にnameのタグにはidがあるので、idを好むことがわかります。あなたがあなたの答えで行ったように

私は最近、CSSセレクタが最速であることを、発見しました。 Seleniumはブラウザを使用して検索を行い、CSSセレクタは非常に一般的であるため、さまざまなブラウザではパフォーマンスが最適化されているため、これは理にかなっています。

linkText/partialLinkTextは非常に私は本当にそれらをカウントされませんので、特化されます。私はできる時にそれを使い、それは理にかなっています。私はちょうどBy.cssSelector("#someId")を使用することについて考えましたが、実際にはそれほど大きな違いはないと思っています。By.id()はIDを使用するときにちょっとだけ分かります。

私はめったにXPathを使用していないと私は、例えば、他のロケータとそれを達成することができない場合にのみ、

CSSセレクタではできないタグや奇妙な子/子孫のテキストの場合です。私はXPathサポートがブラウザによって異なることを見つけました(そして読んで)、それは遅くなりますので、絶対に必要でない限り避けてください。#1-3で99%の要素を見つけることができました。

IDは、最も耐久性にする必要があります。 LinkTextとpartialLinkTextはおそらく、ページに応じてかなり耐久性があります。適用されるクラスと、CSSセレクタで使用するHTMLの構造は、おそらくページの更新で変更される可能性が最も高いです。ページの部分的な部分が変更されたかどうかは、実際には更新のサイズによって異なります。 CSSセレクタとXPathは、(一般的に)この種の変更の影響を受けます。

最後に、何百もの要素のページを削っていない限り、1ページの遷移は、ロケータメソッドの違いの数百msよりも重要である可能性があります。

1

ロケータはで、説明的でユニークで、変更する可能性は低いです。次のようにだから私の優先順位は次のとおりです。

  1. ID - あなたが望む正確な要素を得るでしょうし、それが記述することができ、誤って変更されることはありません。
  2. クラス - 親要素のコンテキスト内で、おそらくユニークな、非常にわかりやすいです。
  3. CSS - XPathよりも優れたパフォーマンス - Dave Haeffnerのgreat benchmarkを参照してください。
  4. のXPathは - CSSがAxis例えば好きではない機能を備えています::parentとなり、機能はとなります。

私はLinkTextTagNameを避けることになります。非常に一般的なフィルタリングのために予期しないエラーが発生する傾向があります。 CSSとXPath上

注://div/li[1]/*/span[2]またはdiv > li:nth-child(1)ようなもので、これらを使用することもする必要があります彼らはレンダリングと変化しやすいように依存を避けました。

+0

私はCSSがおそらく永遠にXPathより速いと思っていますが、それらのベンチマークは本当に古く、もはや有効ではない可能性があります。彼はChrome 32に対してテストを行っていますが、現在のバージョンは54です。私は彼のテストが現在のブラウザで再実行され、何が変わったのかを見たいと思います。 – JeffC

+0

https://youtu.be/IjGDxXCaDnE?t=40m20s :)古いバージョンでは、xpathの方が速くて、どこから聞いたか覚えていないことがわかった... – Moshisho

+0

これはすばらしい、ありがとう!私はこれまで実際にこれを見てきたと思うが、それは長い時間だった。 – JeffC

関連する問題