*

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

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


スポンサードリンク



関連記事

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

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

記事を読む

Selenium入門その1[自動テストの概要]

ソフトウェア業界って3Kですよね・・・ アジャイル開発手法が話題に上がるようになってもう10年

記事を読む

Eclipse(4.3,4.4)の使い方[各画面エリアの名称とパースペクティブのビューのカスタマイズ]

本エントリーでは、Eclipse(Eclipse4.3,4.4)の各画面エリアの名称の説明と、ビュー

記事を読む

Eclipse(4.3,4.4)のJava言語のリファクタリング機能の使い方[リファクタリングの説明と「名前変更」と「移動」]

本エントリーでは、Eclipse(4.3,4.4)の「リファクタリング」機能の使い方を説明させていた

記事を読む

JDK8(Java8)のインストール方法[Windows]

本エントリーは、Windows7 64bitにJDK8(Java8)をインストールする説明を記載させ

記事を読む

Java超入門 with Eclipse[2:プリミティブ型(基本データ型)とは]

他のプログラミング言語と同様に、Javaにもデータ型が存在します。 Java超入門の第2回では、プ

記事を読む

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

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

記事を読む

Java超入門 with Eclipse[3:クラスに関する基礎知識(クラスとインスタンスとパッケージ)]

Javaといえば、「オブジェクト指向」とのイメージがとっても強いですよね。 そう、そうです。間違い

記事を読む

Selenium入門その3[Selenium WebDriver(Java/Junit4)の使い方]

WebDriverでは、予め中継サーバを起動しなくても、テスト実行時にブラウザ拡張機能や、OSのネイ

記事を読む

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

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

記事を読む

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 ↑