2016-07-27 4 views
1

カスタムセレクタを持つために私自身のByクラスを実装したいと思います。カスタムセレクタセレンで自分のセレクタを使うことの長所と短所

DEVコードここ

<button class="btn js-AddNuts" type="button" testid="addbutton"> 

セレクターを使用しての長所と短所はtestid

理由は何されている:私たちは、DEVのすべての要素のためのテスト、特定のセレクタとデザイン名を持つことを計画していますDEVで何かを変更してもテストには影響しないようにコード化してください。

+0

なぜあなたはそれが単にBy.xpath'など '、' By.cssSelector'を見つけることができながら、独自のカスタムセレクタを作成しようとしています...?あなたの目的を具体化してください... –

+0

理由が更新された質問 –

答えて

0

独自のロケータの作成に問題はないことはわかっていますが、Seleniumはカスタムロケータを作成する機能を備えています。基本的にセレンは、By.idBy.nameなどの要素を見つけるときに、xPathを使用して要素を配置するために内部的に使用されます。Byクラスを拡張することで、簡単に独自のロケータを作成できます。

あなたがtestidを使用して要素を見つけカスタムロケータを作成したい場合、あなたは(あなたは、Javaを使用していると仮定すると)以下のように作成する必要があります: -

import java.util.List; 

import org.openqa.selenium.By; 
import org.openqa.selenium.SearchContext; 
import org.openqa.selenium.WebElement; 

class ByTestId extends By { 

    private final String testId; 

    public ByTestId(String testId) { 
     this.testId = testId; 
    } 

    @Override 
    public List<WebElement> findElements(SearchContext context) { 
     return context.findElements(By 
       .xpath(".//*[@testid = '"+testId+"']")); 
    } 

    @Override 
    public WebElement findElement(SearchContext context) { 
     return context.findElement(By 
       .xpath("//*[@testid = '"+testId+"']")); 
    } 
} 

今、あなたは簡単に以下のようにtestidを使用して要素を見つけることができます: -

//for single webelement 
WebElement element = driver.findElement(new ByTestId("addbutton")); 

//for list of webelements 
List<WebElement> elements = driver.findElements(new ByTestId("addbutton")); 

:またとしてBy.cssSelectorを使用してカスタムByクラスの要素を見つけることができます。By.cssSelector("*[testid = '"+testId+"']")

はそれが役に立てば幸い.. :)

+1

Seleniumは内部的にXPathを使用してBy.id、By.name'要素を見つけません。さらに、CSSセレクタで可能な場合はXPathを推奨するべきではありません。あなたはまた質問に答えるのを忘れてしまったことに注意してください。 –

+0

@FlorentB。もちろん私たちはここで 'By.cssSelector'を使うことができますが、この文脈では単一の属性を指しているだけです。もしBy.xpathを使うなら、全く問題はないと思います。そしてあなたがこのリンクで見ているようにhttp://grepcode.com/file/repo1.maven.org/maven2/org.seleniumhq.webdriver/webdriver-common/0.9.7089/org/openqa/selenium/By.java#By .id%28java.lang.String%29 ... else条件でxpathを使用して要素を見つけることは明らかです。 –

+1

単一の属性を指している場合でも、より安価なCSSセレクターを推奨します。そして、いいえ、セレニウムは要素By.idを見つけるためにXPathを使用しません。あなたが参照しているelse条件は、idでロケーションをサポートしていないドライバのフォールバックです。 Javaクライアントはそれを実装する唯一のクライアントです。この条件を満たすドライバはわかりません。XPathも間違っていることに注意してください。これはコンテキストではなく、ページではありません( '//'の代わりに './/')。 –

1

この場合、カスタムロケータ(または私は全体を実行しているかを考えることができ、いずれの場合)を作成する必要はありません。 CSSセレクタを使用する次のコードをそのまま使用することができます。

By.cssSelector("button[testid='addbutton']") 

CSSセレクタの読んだり学習したりすることをお勧めします。彼らは非常に強力です。

CSS Selector Reference

CSS Selector Tips

+0

私はすでに頼まれたので、OPは独自のカスタムセレクタを作成することに興味があります。ありがとう –

+0

そしてあなたは私の答えのための投票の理由... :) –

+1

@SaurabhGaurいいえ、OPは何を尋ねましたか、 "カスタムセレクタを使うことの長所と短所は何ですか?"主なCONは必要ありません。他のセレクタが何をしているのかを行う新しいロケータを作成することに私が考えることができるPROSはありません。答えにカスタムロケータを作成するためのPROは表示されていませんでした。 – JeffC

関連する問題