*

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

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


スポンサードリンク



関連記事

Java超入門 with Eclipse[4:クラスに関する基礎知識(修飾子とクラスとインスタンスと変数)]

前回は、Javaの基本であるクラスの基本的な知識をざっくりと説明させていただいたあと、 packa

記事を読む

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

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

記事を読む

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

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

記事を読む

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

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

記事を読む

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

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

記事を読む

EclipseでAndroidアプリケーションの開発環境の構築と”Hello World!”まで

対象のOSはMac(OS X 1.9.5)とWindows7 64bitとなります。 といっても手

記事を読む

JDK8(java 8)の新機能のラムダ式の利用方法[その1:概要]

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

記事を読む

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

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

記事を読む

Eclipseの使い方(Eclipse4.4のブックマーク機能とタスク機能)

今回は、Eclipseのブックマーク機能とタスク機能の説明をさせていただきます。 両機能とも効率的

記事を読む

「HyperSQL」の環境を作成し、Eclipseの「DBViewer」プラグインを利用してSQLを発行してみる

Eclipseの「DBViewer」プラグインを利用して「Java DB」の環境を作成し、SQLを発

記事を読む

Message

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

Spring5入門[STS(Spring Tool Suite)で簡単なWebアプリの典型的なユニットテストの実現方法]

前回は「Spring入門」で、Spring MVCを利用した簡単なWe

Spring5入門[STS(Spring Tool Suite)の環境作成と簡単なWebアプリの作成]

Struts1ももう過去の遺物になり、SAStrutsもEOLとなりも

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

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

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

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

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

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

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑