Selenium利用時のトラブルシューティング方法[クリック編]Java、Eclipse、JUnitに関連した技術情報のブログです。回帰テストスポンサードリンクSeleniumは便利なテスト自動化ツールですし、今後は更なる利用者の増加が見込まれます。言え、使いこなすにはノウハウが必要です。(そんなにたいそうなノウハウ内容ではないですが・・・)今までSeleniumを利用してトラブった経験を元にした内容も書いてみようかと思っています。ちなみに、Selenium歴は10年ぐらいです。今回はクリック編となります。HTML要素が思ったようにクリックできないとお困りの方は是非ごらんください。WebDriver(Java/Junit4)の基本コマンド]で説明させていただきましたが、findElementを呼び出したタイミングでちゃんと表示されているにも関わらずorg.openqa.selenium.NoSuchElementExceptionがスローされることがあります。私が遭遇した事象と検証の結果HTMLの構造によって、findElementが見つけられない場合があることが分かりました。具体的には以下のようなHTMLのチェックボックスです。type="checkbox"><span><label>チェックボックスのレベル</label></span></label></body></html>Javadriver.findElement(By.id("checkBoxId")).click();1driver.findElement(By.id("checkBoxId")).click();のfindElementでNoSuchElementExceptionがスローされてしまいます。この事象に始めて遭遇した時は、findElementする前に単純スリープ入れてみたり、該当ページのHTMLのソースをファイルに出力してみたりして、みましたが、解決の光は見えてきませんでした。ちなみにですが、該当ページのHTMLのソースを取得する方法は以下の通りです。Javadriver.findElement(By.tagName("body")).getText();1driver.findElement(By.tagName("body")).getText();driver.getPageSource()でも取得できますが、HTMLタグがサニタイジングされ見にくいです。話は本題に戻って、あ!、きっとこんな階層構造をSeleniumは予期してないんだ!!と思い。このヘンテコな構成を含む検証用の静的なHTMLを作成し、そのHTMLをターゲットにfindElementを実行してみたところ、やはり同じ結果でした。ヘンテコなHTMLのLABELを1つにして、同じテストを実行するとうまくいきます。本来であれば、こんなヘンテコな構造のHTMLを書き換えたいところなのですが、まあ色々大人の事情もあり、タグの構造はそのままで自動テストを実現したい!となり、またまた色々試してみました。結局、findElementで見つけられないならSeleniumでは無理・・・でも押したい・・・そこで思いついたのがJavaScriptでした。driver).executeScript("document.getElementById('radio1').click();");思った通り問題なくクリックできました。実際には、チェックされていなければチェックするとの処理が必要となりますし、executeScriptだと要素の検出時のタイムアウトが存在しませんので、できるだけ近い親の要素をfindElementした後で実行する必要があります。driver).executeScript(checkScript.toString());※Macで確認したところ問題なく動作します。pointと言われるこちらの現象は、要素は検索できるのですが、押すと以下のような例外が発生します。click:この現象が発生する原因としてはクリックしようとしている要素が表示されれいる領域に表示されていないクリックしようとしている要素のSeleniumがクリックするポイントが他の要素に隠れているがあります。クリックしようとしている要素が表示されれいる領域に表示されていないFireFoxだとこの現象は発生しないのですが(あくまで私が見たケースではですが・・・)Chromeだとよく発生します。画面上には表示されているが、スクロールしないと見えない状態の時ですので、スクロールしてクリックすればOKです。driver.findElement(By.id(("add")));btnElement.click();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は、イベントの関連付けが遅延するようなページでの対処方法となります。(当たり前の事を書いて恥ずかしい・・・)それ以外の対処方法は、原因が不明でやみくもに対症療法を行っているだけなので、やはり原因が分かり、その原因に対処しないと根本解決にはならないですが、是非お試しください。8」を正式に公開しました。今回のエントリーは、利用すると生産性が格段に向上するEclipseのショートカット集となります。8の新機能について」では、どんな新機能があるか紹介させていただきました。記事を読むEclipseの使い方(Eclipse4.4のブックマーク機能とタスク機能)今回は、Eclipseのブックマーク機能とタスク機能の説明をさせていただきます。Eclipse[5:クラスに関する基礎知識(メソッドをJUnitを使って説明)]クラスに関する基礎知識シリーズも、いよいよメソッドを残すのみとなりました。コメントをキャンセルメールアドレスが公開されることはありません。(4.7.1)を利用してJUnit5の公式ガイドの内容を実践してみる。JUnit5が本格的に利用できる環境が整ってきました。RSSWordPress.orgSelenium利用時のトラブルシューティング方法[クリック編]Java、Eclipse、JUnitに関連した技術情報のブログです。