-
19-09-2019 - |
質問
ASP.NETを使用すると、タグIDはかなり揮発性であるため、テストをより堅牢にするために、ラベルテキストで要素を見つけたいと思います。私はワティンと一緒にプレイしましたが、これを完璧に行いますが、そのプロジェクトは最近死んでいるように見えますので、フレームワークを決定する前にセレンも調べると思いました。
このようなHTMLがあります
<label for="ctl00_content_loginForm_ctl01_username">Username</label>:
<input type="text" id="ctl00_content_loginForm_ctl01_username" />
入力したくない:
selenium.Type("ctl00_content_loginForm_ctl01_username", "xxx");
それはIDに依存しすぎています。ワティンで私は書く:
browser.TextField(Find.ByLabelText("Username")).TypeText("xxx");
セレンでこれを行う方法はありますか?
解決
私はあなたが次のことでこれを行うことができると信じています:
selenium.Type(selenium.getAttribute("//label[text()='Username']/@for"), "xxx");
text()= 'username'ビットは、innerhtmlで必要なラベルを取得し、 /@forはその「for」属性の値を返します。
注意喚起: これはテストされていません(謝罪!)が、IDEプラグインのいくつかのツールに基づいて機能すると思います
他のヒント
これは機能します:
//input[@id=(//label[text()="Username"]/@for)]
説明:入力を探しているので:
//input[@id=("ctl00_content_loginForm_ctl01_username")]
「ctl00_content_loginform_ctl01_username」をラベルの属性の値で置き換えます。
//label[text()="Username"]/@for
わかりました、これは1歳かもしれませんが、彼らは何がちょっと。これにより、テキスト「ユーザー名」を含むラベルの下の最初の入力が選択されます。
//label[text()='Username']/input
一部のブラウザが時折の要素に迷惑なスペースを追加していることがわかっているので、私は通常、contains()を使用することを好みます。
//label[contains(., 'Username')]/input
入力前のシングルスラッシュは、1レベルダウンのみを示し、ダブルスラッシュがラベルの下のすべてのレベルを確認することに注意してください。 FirefoxにXpatherを使用して、Xpathsを作成して確認してください。非常に便利です。
はい、XPath、CSS、またはDOMロケーターを使用して要素を識別できます。この例では、xpathは// lable [@for = 'ctl00_content_loginform_ctl01_username']のように見えます。