SelenideのTips
Firefox以外のブラウザを使う
さきほどのコードではブラウザはFirefoxを使うことを前提にしていましたが、ここではほかのブラウザを使った方法を説明します。
どのブラウザでも基本的に行うことは同じで、以下の通りです。
先のサンプルで書いた以下の部分で指定します。
- ブラウザ毎に対応したDriverのバイナリをダウンロードし適当な場所に配置する。
- Selenideの初期化時にDriverのバイナリの場所を通知し、使用するブラウザを指定する。
Configuration.browser = WebDriverRunner.GECKO;@@ System.setProperty("webdriver.gecko.driver","C:/PATH/TO/geckodriver.exe")
各ブラウザ毎に設定するbrowserとプロパティキーは以下の通りです。
ブラウザ名 | Configuration.browser | プロパティキー |
---|---|---|
Chrome | WebDriverRunner.CHROME | webdriver.chrome.driver |
Internet Explorer | WebDriverRunner.INTERNET_EXPLORER | webdriver.ie.driver |
Edge | WebDriverRunner.EDGE | webdriver.edge.driver |
Safari | WebDriverRunner.SAFARI | webdriver.safari.driver |
要素取得のテスト
Selenideのコードで記述した要素取得方法が正しいか検証するのに、毎回テストコードを起動させるのは時間が掛かり非常に手間です。これを簡略化する方法としてIDEのデバッグモードを利用する方法があります。
oepn(String url)
でテスト対象サイトのURLを書いただけのシンプルなテストコードを書き、これをIDEのデバッグモードで起動させます。このときブレークポイントとして、open(String url)
の直後の行を指定しておきます。
こうすることでSelenideによるブラウザが起動し、対象サイトが開いた状態で止まります。ここで、IntelliJ IDEAでAlt+F8を押すと[Evaluate Expression]という、行評価ウィンドウが開きます。
このウィンドウで[Code Fragment Mode]ボタンを押下すると、入力部分が複数行になる[Evaluate Code Fragment]になります。
ここにJavaのコードを入力し[Evaluate]ボタンを押下すると、入力した式が評価されます。つまり、ここにSelenideの要素取得メソッドを記載し評価することで、実際に取得結果が確認できるのです。失敗しても評価がエラーになるだけでデバッグモードは中断されませんので何度でも試すことができます。
最初のopen(String url)
で開いたURLとは別の画面で試したい場合は、Selenideで開いたブラウザを直接操作して対象画面へ遷移させてから試すことができます。
Java 9からはJShellというREPL環境が提供されるので、もしかしたらこのような手法を使わずに済むかもしれませんね。
DOM構造を上からたどって取得する
実践で試したサイトは、テストで必要となる要素すべてにIDが振られていました。そのため要素取得は$("#id")
で十分でした。しかし、実際のテストでは必要な要素にIDが振られていないこともあり、またClass指定すら無い場合があります。その場合どのようにすればよいでしょうか。
困ったときはJavaDocを見ます。
要素を取得するメソッドはcom.codeborne.selenide.Selenide.$
ですが、この戻り値はcom.codeborne.selenide.SelenideElement
です。SelenideElementにはやはり$
メソッドがあり、さらに検索を続けることができます。このとき検索はDOMの子要素方向にのみ向かいます。
例えば、
<div id="zipCode"> <tr> <th>郵便番号</th> <td>100-0000</td> </tr> </div>
のようなHTMLがあり、ここで郵便番号の番号だけがほしい場合、以下のようにすることで目的の値が取得できます。
$("#zipCode").$("td");
ここでは$
を複数回使用しての絞り込みを行いましたが、検索結果のフィルタや親要素に戻るメソッドなど多数あります。これらを駆使することで任意の要素を取得することが必ずできるはずです。是非JavaDocを熟読してみてください。きっとほしいメソッドがあるはずです。
もし見つからなければ、GitHubで要望を出してみたりTwitterでコミッターに質問してみるとよいかもしれません。すでにあればそれを教えてくれるでしょうし、無ければもしかしたら今後作られるかもしれません。
もちろん、コードはGitHubで公開されているのでforkして自分で機能を作り込み、pull requestを投げてみるのもよいかもしれません。Selenideはオープンソースなのですから!