6

要素にアクセスするための独自のロケーターを作成したいと考えています。WebDriver の API は現在、id、name 属性、タグ名、完全または部分的なリンク テキスト、XPath、クラス名、および css セレクターによって要素を取得できる 8 つのロケーターを提供します。ただし、新しい属性を介して要素にアクセスする必要があるため、これらのデフォルトのロケーターは今では十分ではありません。ここで私が本当に欲しいものを理解できるように、例を挙げましょう。

例: ユーザー名を選択してください:

ここで、次のような myLocator ロケーターを使用してユーザー名ボタンにアクセスできるようにコードを書きたいと思います。

*driver.findElement(By.myLocator("username")).*

独自のロケーターを追加するために BY クラスを書き直す方法を誰かが教えてくれれば、非常に役に立ちます。

よろしくお願いいたします。

4

5 に答える 5

1

クラスをサブクラス化し、およびメソッドByの実装を提供する必要があります。これは、実際の要素検索の「肉」が発生する場所であるためです。findElementfindElements

その後、通常どおりに使用できるはずdriver.FindElementです。

于 2013-01-11T10:06:29.170 に答える
0

これでは実際にはあなたの質問に答えられないことは知っていますが、Xpathを使用しないのはなぜですか?DOMをクロールするだけでなく、新しいロケーターを構築するのは、多くの余分な作業になるようです。

例えば:driver.findElement(By.Xpath("//div[@username='YourUsername']")

使用している属性とページについてさらに詳しく説明した、より良い例を挙げましょう。

于 2013-01-10T18:39:14.037 に答える
0

次のようなことができます。

private final String myLocator = "//*[contains(@id,'username') and contains (@type,'text') and contains (text(),'exactly what I want')]";

そのため、マッピングしている属性に応じて、必要に応じてロケーターを作成できます。クリックまたは選択のために 5 つの行を用意する必要はありません。

また、そのロケーターでワイルドカードを使用して、パラメーターとして使用したいものを次のように "%s" に置き換えることができます。

private final String myLocator = "//*[contains(@id,'%s') and contains (@type,'text') and contains (text(),'exactly what I want')]";

次に、次のような動的要素を作成します。

private WebElement usernameSelectElement(String text) {
    return driver.findElement(By.xpath(String.format(myLocator, text)));
}

使用法は次のようになります。

public void clickMyElement(text){
usernameSelectElement(text).click();
}

あなたが持っていた例については、私の見解では非常に複雑です。

于 2013-08-13T14:56:53.367 に答える
0

Michielが答えたのと同じように、Seleniumがすでに提供しているもので、あなたが望むものを達成できると思います. 開発者が ID と要素名を変更するために回避したいメンテナンスのオーバーヘッドである場合は、特定する必要がある要素を追跡する別のファイルを作成できます。

//EG. (not Java I know :))
string usernameXPath = "//div[@username='YourUsername']";

その後、変更があった場合は、これを維持できます。さらに一歩進んで、「他のタイプ」の要素ごとにクラスを実装し、コンストラクターでその周りに XPath を配置することもできます。XPath は ' contains ' や ' parent::div'などの機能を提供するため、非常に柔軟です。XPath の詳細については、W3schools ページを参照してください。

編集:また、注目に値するのは、C#バインディングの最新リリースには次のように記載されていることです:

.Net: CustomFinderType プロパティの更新を .NET FindsByAttribute に導入します。これにより、PageFactory でカスタム By サブクラスを使用できます。カスタム ファインダーは By のサブクラスである必要があり、文字列引数を取るパブリック コンストラクターを公開する必要があります。

これが次の Java リリースにあることを願っています :)

于 2013-01-11T03:09:58.007 に答える