*

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)の使い方[パースペクティブのツールバーのカスタマイズ(「ツール・バー可視性」と「メニュー可視性」タブ)]

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

記事を読む

Selenium入門その4[Selenium WebDriver(Java/Junit4)の基本コマンド]

前回はEclipse環境でSelenium WebDriverでJava/Junit4を利用したテス

記事を読む

JUnit入門その6[Eclipse4.4のJUnitプラグインとDBUnitの併用(便利に利用するためのユーティリティの作成)]

JUnit入門その4 でDBUnitの環境構築を説明させていただきました。 今回は、前提値デ

記事を読む

Eclipse4.4,4.3の使い方[エディタのフォントサイズの変更方法]

今回は、Eclipse4.4と,4.3におけるエディタエリアのフォントサイズの変更方法を説明させてい

記事を読む

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

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

記事を読む

Java8の新機能に完全対応のEclipseメジャーリリースとなる Eclipse 4.4 Luna (ルナ) が遂にリリース

Eclipse メジャーリリースとなる Eclipse 4.4 Luna (ルナ) が遂にリリースさ

記事を読む

JUnit入門その2[Eclipse4.4のJUnitプラグインのassertThatの使い方]

JUnit入門その1ではEclipseのJUnitプラグインの基本的な使い方を説明させていただきまし

記事を読む

利用すると生産性が格段に向上する厳選Eclipseショートカット集

今回のエントリーは、利用すると生産性が格段に向上するEclipseのショートカット集となります。

記事を読む

Eclipse4.4(Java)におけるビルド・パス関係の設定方法[JRAおよびクラス・フォルダー/ライブラリー]

Eclipse4.4(Java)におけるビルド関係のビルド・パス上の「JRAおよびクラス・フォルダー

記事を読む

JUnit入門その9[@RunWithアノテーションを利用したテストの作成]

今回は@RunWithアノテーションを利用したテストの作成方法を説明させていただきます。 JU

記事を読む

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 ↑