*

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

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


スポンサードリンク



関連記事

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

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

記事を読む

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

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

記事を読む

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

Struts1ももう過去の遺物になり、SAStrutsもEOLとなりもう半年以上が経過しました。

記事を読む

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

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

記事を読む

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

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

記事を読む

Eclipse4.4(Java)におけるビルド・パス関係の設定方法[ビルド・パス上に必要なプロジェクト/プロジェクト参照の追加]

Eclipse4.4(Java)におけるビルド関係のビルド・パス上の「ビルド・パス上に必要なプロジェ

記事を読む

Eclipseのインストールと日本語化とJDK8(Java8)対応[Eclipse4.4とEclipse4.3]

インストールするEclipseのバージョンですが、とりあえず4.3をターゲットとしておき、 4.4

記事を読む

JUnit入門その1[Eclipse4.4のJUnitプラグインの基本的な使い方]

利用する環境の作成につきましては、「Eclipseの使い方(Windows環境のEclipse4.3

記事を読む

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

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

記事を読む

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

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

記事を読む

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 ↑