*

Selenium利用時のトラブルシューティング方法[クリック編]

公開日: : 最終更新日:2016/12/05 Java, Selenium , ,


スポンサードリンク



Seleniumは便利なテスト自動化ツールですし、今後は更なる利用者の増加が見込まれます。
とは言え、使いこなすにはノウハウが必要です。
(そんなにたいそうなノウハウ内容ではないですが・・・)

今までSeleniumを利用してトラブった経験を元にした内容も書いてみようかと思っています。
ちなみに、Selenium歴は10年ぐらいです。

今回はクリック編となります。何故かHTML要素が思ったようにクリックできないとお困りの方は是非ごらんください。

  1. HTML要素が見つからない
  2. Element is not clickable at pointと言われる
  3. クリックしてもイベントが発火しない


HTML要素が見つからない

JavaでSeleniumを利用する時のHTML要素の検索方法は
Selenium入門その4[Selenium WebDriver(Java/Junit4)の基本コマンド]
で説明させていただきましたが、
findElementを呼び出したタイミングでちゃんと表示されているにも関わらずorg.openqa.selenium.NoSuchElementExceptionがスローされることがあります。

私が遭遇した事象と検証の結果
HTMLの構造によって、findElementが見つけられない場合があることが分かりました。

具体的には
以下のようなHTMLのチェックボックスです。

 

のfindElementでNoSuchElementExceptionがスローされてしまいます。

この事象に始めて遭遇した時は、findElementする前に単純スリープ入れてみたり、該当ページのHTMLのソースをファイルに出力してみたりして、
みましたが、解決の光は見えてきませんでした。

ちなみにですが、該当ページのHTMLのソースを取得する方法は以下の通りです。

driver.getPageSource()でも取得できますが、HTMLタグがサニタイジングされ見にくいです。

話は本題に戻って、あ!、きっとこんな階層構造をSeleniumは予期してないんだ!!と思い。

このヘンテコな構成を含む検証用の静的なHTMLを作成し、そのHTMLをターゲットにfindElementを実行してみたところ、やはり同じ結果でした。
ヘンテコなHTMLのLABELを1つにして、同じテストを実行するとうまくいきます。

本来であれば、こんなヘンテコな構造のHTMLを書き換えたいところなのですが、まあ色々大人の事情もあり、タグの構造はそのままで自動テストを実現したい!
となり、またまた色々試してみました。

結局、findElementで見つけられないならSeleniumでは無理・・・
でも押したい・・・

そこで思いついたのがJavaScriptでした。JavaScriptだったらSeleniumが介在せずそのまま実行してくれるのではないかと?

思った通り問題なくクリックできました。
実際には、チェックされていなければチェックするとの処理が必要となりますし、executeScriptだと要素の検出時のタイムアウトが存在しませんので、できるだけ近い親の要素をfindElementした後で実行する必要があります。

※Macで確認したところ問題なく動作します。Windows(Ruby/Capybara)の時は間違いなく失敗していたのですが・・・

Element is not clickable at pointと言われる

こちらの現象は、要素は検索できるのですが、押すと以下のような例外が発生します。

この現象が発生する原因としては

  • クリックしようとしている要素が表示されれいる領域に表示されていない
  • クリックしようとしている要素のSeleniumがクリックするポイントが他の要素に隠れている

があります。

クリックしようとしている要素が表示されれいる領域に表示されていない

FireFoxだとこの現象は発生しないのですが(あくまで私が見たケースではですが・・・)
Chromeだとよく発生します。

画面上には表示されているが、スクロールしないと見えない状態の時ですので、スクロールしてクリックすればOKです。

1行目でスクロールに必要なorg.openqa.selenium.interactions.Actionsを生成し、
2行目でマウスカーソルを当てたい要素を検索
3行目で要素にマウスカーソルを当てています。この時に対象の要素が表示されている領域に存在しない場合はスクロールが発生します。

クリックしようとしている要素のSeleniumがクリックするポイントが他の要素に隠れている

Seleniumのクリックは対象要素の真ん中を叩きます。運悪く真ん中が他の要素に隠れている場合があります。
よくあるのはdivやspanです。

ではどうやって回避するかと言うと、以下の2通りの選択肢があります。

・叩く場所を変える。
・JavaScriptでクリックする。

叩く場所を変える。

actions.moveByOffsetを利用します。

JavaScriptでクリックする。

長々と書いていますが、
1.HTML要素が見つからない
と同じ処理を施す
となります。
(結局同じかよ・・・)

クリックしてもイベントが発火しない

canvasやイメージをクリックする時に見かける事象です。とはいえ原因は不明です。誰か教えてくださいませ・・・

対処方法としては

・クリック前にThread.sleepを入れてみる。
・ActionsのMoveToElementしperformしてからクリックする。
・ActionsのMoveToElementしperformしてからJavaScriptでクリックする。
・ActionsのclickAndHoldを実行する。

がありますが万能ではないです。

Thread.sleepは、イベントの関連付けが遅延するようなページでの対処方法となります。
(当たり前の事を書いて恥ずかしい・・・)

それ以外の対処方法は、原因が不明でやみくもに対症療法を行っているだけなので、やはり原因が分かり、その原因に対処しないと根本解決にはならないですが、是非お試しください。


スポンサードリンク



関連記事

Eclipse(4.3,4.4)の使い方[パースペクティブのツールバーのカスタマイズ(「コマンド・グループ可用性」と「ショートカット」タブ)]

「パースペクティブのカスタマイズ」画面には、以下の4つのタブが存在しております。 ツール・バ

記事を読む

Eclipse(4.3)の使い方[パースペクティブのツールバーのカスタマイズ(「ツール・バー可視性」と「メニュー可視性」タブ)]

前回エントリー「Eclipse(4.3)の使い方[各画面エリアの名称とパースペクティブのカスタマイズ

記事を読む

Eclipse4.4(Java)におけるビルド・パス関係の設定方法[ビルド・パス上のソース・フォルダー]

Eclipse4.4(Java)におけるビルド関係のビルド・パス上のソース・フォルダーの利用方法を説

記事を読む

JUnit入門その5[DBUnitの概要説明]

前回エントリーでは「JUnit入門その4」と題してDBUnitをEclipseで動作させるための環境

記事を読む

java8(JDK8)の新機能のラムダ式の利用方法をEclipseとJUnitで説明[その2:関数型インターフェースを例としたラムダ式]

「JDK8(Java 8)の新機能のラムダ式の利用方法」では、 指定できる場所の概説と関数型インタ

記事を読む

JDT betaを利用してJDK8(java 8)対応のEclipse開発環境を作成する[Mac編]

「Java 8の新機能について」では、どんな新機能があるか紹介させていただきました。 今後、少

記事を読む

Eclipse4.4(Java)におけるビルド・パス関係の設定方法[ビルド・クラスパスの順序およびエクスポート設定]

Eclipse4.4(Java)におけるビルド関係のビルド・パス上の「ビルド・クラスパスの順序および

記事を読む

Selenium入門その5[ページオブジェクトパターン(Page Object Design Pattern)を利用して変更に強いテストを作成する方法]

Selenium入門その2 では「UIマップファイル」と言う仕組みが存在していることに言及させてい

記事を読む

Java超入門 with Eclipse[1:Eclipse環境の作成とEclipseの使い方の説明]

「JDT betaを利用してJDK8(java 8)対応のEclipse開発環境を作成する」では、最

記事を読む

JUnit入門その4[Eclipse4.4のJUnitプラグインとDBUnitの併用(環境構築と基本)]

JUnit入門その1 JUnit入門その2[Eclipse4.4のJUnitプラグインのasse

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Selenium入門その6[Selenium3でWebDriver(Java/Junit4)の環境を作成しEdge,Chrome,Firefoxで確認してみる]

Selenium3も3.0.1がリリースされましたし、今後は本格的にS

Selenium利用時のトラブルシューティング方法[クリック編]

Seleniumは便利なテスト自動化ツールですし、今後は更なる利用者の

Java8のラムダ式とStream APIを利用してコーディング量の削減サンプル集

Java8になりラムダ式と「Stream API」が利用できるようにな

Selenium入門その5[ページオブジェクトパターン(Page Object Design Pattern)を利用して変更に強いテストを作成する方法]

Selenium入門その2 では「UIマップファイル」と言う仕組みが

Javaによる非同期処理入門その1[非同期処理の実装方法の概説]

Javaによる非同期処理に関するエントリーを前々から作成したいと思って

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑