2013年3月13日水曜日

WebElementをもっと楽に探したい

テストを作っているとよく出てくる問題が
「同じようなタグの要素がいっぱいある…」「どう1個だけを指定したらいいんだ…」
なんて状態. リストが複数あるなかその中の要素を1個だけ選べとか言われても下手するとBy.xpath()使っても20や30も Listになって出てきたり, そもそもリスト以外の要素が引っかかったり…
そんな時だいぶ楽になる要素の探し方.

子要素の探索

要するにリストのように全く同じ要素が複数作成されるときは, 親要素に入れて管理している場合がほとんど(だと思う(・ω・`)). ならば親要素を特定してからその中を探索してやればすっごい楽になるよね!というお話. まぁ単純な話です. ちなみにコード中に出てくる Byについてはこちらにもメモがございます(宣伝
たとえば, 
<div class="parent1">
  <span class="child"></span>
  <span class="child"></span>
</div>
<div class="parent2">
  <span class="child"></span>
  <span class="child"></span>
  <span class="child"></span>
</div>
なんて要素の階層があったとする.
2つ目の divの中の2つ目の spanを探したい時, 直接探そうとするとかなりめんどくさい.
なので,
WebElement parent = driver.findElement(By.className("parent2"));
WebElement child = parent.findElemens(By.className("child")).get(1);
と, 先に親エレメントを特定してから, その下のエレメントを探してやることができる. コード的にだいぶ意味が通りやすくなるはず. なおもちろん driverは WebDriver.
これを「class="child"だけで見れば 4番目だから Listで取得して .get(3)だ!」なんて考えて
WebElement child = driver.findElement(By.className("child")).get(3);
こんなコードを書くとまず他の人には伝わらない. まして上の divに要素増えた時には…
Σ(||゚Д゚)ヒィィィィ

また, まとめて
WebElement child = driver.findElement(new ByChained(By.className("parent2"),By.className("child"))).get(1);
なんていう書き方も. これは
new ByChained(By locator, …)
を用いることで, 順に探している(らしい).


ただ問題はここまでのこと,  By.xpath()を使うとなんかうまくいかない…(・ω・`)なんでだろ







一番楽かつ安定なのは classなりわかりやすくつけて指定してやることなのよね…

0 件のコメント:

コメントを投稿

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...