JavaとJavaEEプログラマのブログ

JavaEEを中心にしたをソフトウェア開発についてのブログ

Seleniumを使ってExt-JSのコンポーネントを操作する。

SeleniumIDEを使用してExt-JSコンポーネントを使った画面の操作記録を取得し、それをSeleniumで実行するとうまく動かないときがあります。
たとえば、以下のようなコードです。

driver.findElement(By.id("ext-id223")).click();

Ext-JSコンポーネントの中に、IDが動的に振られるためIDが変化してしまうものがあることが原因です。
IDが変化してしまうExt-JSコンポーネントSeleniumから操作テストするときは次のようにXPathでElementを指定します。

driver.findElement(By.xpath("//*[@id=\"solidTable\"]/tbody/tr[2]/td[2]/em/button")).click();

XPathの取得にはFireFoxFireBugアドインを使用します。
FireFoxで操作を行う画面を開き、Seleniumから操作したい要素の上にマウスカーソルを合わせて右クリックメニューから"要素を調査"を選択。FireBugの画面に表示された要素のIDにマウスカーソルを合わせて右クリックメニューから"id属性を削除"を選択。もう一度右クリックメニューから"XPathをコピー"を選択します。
するとクリップボードには以下のようなXPathがコピーされます。

/html/body/div[14]/div[2]/div[2]/div/div/div/div/table/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td[2]/em/button

このXPathを使用してもよいのですが、他の要素の変更による影響が及びにくいように、一番近い固定IDを持つ要素からのXPathに修正します。
HTMLソースを読むと、このXPathの中では最後のtable要素にid="solidTable"が振られていたので、それを利用します。
適当な要素が無い場合は、新たに固定idを設定しましょう。
修正したXPathは以下のようになりました。

//*[@id=\"solidTable\"]/tbody/tr[2]/td[2]/em/button

このように作成したXPathを使えば、動的にIDが振られるExt-JSのコンポーネントSeleniumから操作できます。以下のコードではXPathで指定したボタンをクリックできます。

driver.findElement(By.xpath("//*[@id=\"solidTable\"]/tbody/tr[2]/td[2]/em/button")).click();