ラベル Selenium2 の投稿を表示しています。 すべての投稿を表示
ラベル Selenium2 の投稿を表示しています。 すべての投稿を表示

2012年6月5日火曜日

[Selenium 2] Try & Error集 2

バージョン2.21で「Could not load native events component」例外が発生する

確認バージョン:Selenium 2.21
ブラウザ:Firefox 9, 12
対処法:バージョン上げる ※2.22検証済

以前書いたマウスホバー実現方法のエントリで、
「現時点のSelenium最新バージョン2.21はFirefox12に対応していないようで動かず…」
と書きましたが、あの後Firefox9で試してみたら9でも例外発生しました。
発生した例外は以下。

org.openqa.selenium.InvalidElementStateException: Cannot perform native interaction: Could not load native events component.

発生元は以下。

上記以外でも発生するかもしれません。

発生原因は不明。きっとSeleniumのデグレでしょう。バージョン2.22にしたら解決。

「MoveTargetOutOfBoundsException」例外の対処法

確認バージョン:Selenium 2.18
ブラウザ:Firefox 9
対処法:事前にターゲットが見えるように座標やウィンドウサイズ調整する

ただリンクやボタンをクリックするだけといった何てこと無い処理で、時々以下例外が発生することがありました。

org.openqa.selenium.interactions.MoveTargetOutOfBoundsException: Element cannot be scrolled into view

ターゲットがウィンドウ領域外にある場合、見える位置まで自動スクロールしてから処理が実行されるのですが、どうも時々スクロールがうまくいかない場合がある模様。
スクロールが原因なのであれば、JavaScriptで座標調整したり、ウィンドウ最大化するなどして、予めターゲットが見えるような状態にしておけばよい。

※サイト・ページによっては、上記コードが働かない場合がありました。原因不明。

FirefoxのJavaScriptを無効化できない!

確認バージョン:Selenium 2.18, 2.21
ブラウザ:Firefox 9
対処法:不明

それっぽいメソッドがあったので使ってみたのですが、falseセットしても無効化できず。

OSやブラウザバージョンとか他にいろいろ設定して試してみてもダメだった。

[Selenium 2] Firefox起動時のポートロック待ち時間変更方法

試した環境

  • ブラウザ:Firefox 9
  • JDK 6
  • Selenium 2.18, 2.21, 2.22
  • Windows 7 64bit

ある日のこと、Seleniumテストケースを並行して数十個同時にスタートした時、以下の例外が発生した。

org.openqa.selenium.WebDriverException: Unable to bind to locking port 7054 within 45000 ms
…

調べてみると、どうもSeleniumはブラウザプロセス起動する時にTCP7054番ポートをロックするらしく、このポートのロックを一定時間待っても獲得できない場合に上記例外が発生する模様。ちなみにロックはプロセス起動したら開放されるっぽい。

この値はFirefoxBinaryクラスのtimeoutプロパティの値で、デフォルトでは45秒。変更したい場合は以下のように、タイムアウト値を設定したFirefoxBinaryオブジェクトをコンストラクタに渡せばよい。

同時にCapabilitiesオブジェクトも使いたいんだけど…

例えばプロキシを使用する場合は、以下のようにCapabilitiesを使用する訳ですが…

FirefoxDriverのコンストラクタには、FirefoxBinaryとCapabilitiesをパラメータとするものが用意されていません。どうしたらいいんでしょう。Help me...的な事を当初書いていたら、hutyaoさんからコメント欄にてご教示いただけました。ありがとうございます!
CapabilitiesオブジェクトにFirefoxBinaryを入れる

それと、プロキシ設定はCapabilitiesオブジェクトではなくFirefoxProfileでも指定可能だよってことも教えていただきました。

<非推奨>
FirefoxDriverのソースからメソッドコピペするというダッサイ方法
僕の頭ではこんな方法しか思いつきませんでした…

以下のimport文とメソッドをコピーし、適当なクラスに貼り付けてください。アクセス修飾子はprivateなので、適宜変更してください。

そしてFirefox起動ロジックは以下のような感じで。

僕は上記コピペメソッドや一連の生成ロジックはFactoryクラスに持たせています。

コピペなんてDRYの原則に反してるじゃねぇか!って方はSeleniumのソース弄ってください。僕としては、コピペ元はjarの中のソースなんで別にいいかなって思いますけど。

※繰り返しますが当節の方法は非推奨です。

2012年5月27日日曜日

[Selenium 2] Try & Error集

「window is null」例外対処法

確認バージョン:Selenium 2.2
ブラウザ:Firefox 4
対処法:バージョン上げる ※2.15以降検証済

見てお分かりの通り、かなり古いバージョンでのお話ですが…
コードを実行していたら、突然「window is null」的な例外が発生し、キャッチしてfinally節でWebDriver#close()してるのにブラウザ閉じないという現象に遭遇した。
残念ながら例外メッセージはメモが見つからなかったのでお見せできませんが(何分古いバージョンのお話なもので…)、以下みたいなのだったっけな…
Handling “Selenium (WebDriver) Exception: this.getWindow() is null” ~ Nishant Verma
org.openqa.selenium.WebDriverException: this.getWindow() is null

恐らくブラウザウィンドウの参照を見失ってアクセスできなくなったとかそんな感じの事なんでしょう。

発生原因は不明。ただ発生するページ・しないページがハッキリしていたので、ページ構造とかDOCTYPEとかが関係しているのかもしれない。
対処法は見つからず。ただバージョンを2.15に上げたら全く発生しなくなった。

リッチテキスト要素(iframe)スイッチ例外対処法

確認バージョン:Selenium 2.15・2.18
ブラウザ:Firefox 9
対処法:JavaScript使って入力

ブログの記事エディタのような所謂リッチテキストエディタへの文字入力で遭遇したトラブル。
エディタの実態はiframe要素だったので、定石に従って以下のように書いたら…例外発生。

発生した例外は確か以下(「確か」ですみません…)。
org.openqa.selenium.WebDriverException: Permission denied for to get property HTMLDocument.compatMode


発生原因は不明。「compatMode」とかあるので、これももしかしたらDOCTYPEが関係しているのかも(申し訳ないですが未検証)。
対処法は、JavaScriptでinnerHTMLプロパティセットするというNotスマートな方法しか見つからず。

ちなみにSeleniumバージョン2.2だと発生しませんでした。はいそうです、前述の「window is null」対処によるデグレです。

要素クリックでの「Permission denied」対処法

確認バージョン:Selenium 2.15・2.18
ブラウザ:Firefox 9
対処法1:リターンキー送出
対処法2:フォーカス(orマウスホバー)してからクリック ※効き目無い場合あり

ボタンやリンクを普通に「WebDriver#click()」したら発生。例外は前述のiframeのものと同じです。これも発生するページ・しないページはハッキリしていました。
対処法は以下の通り。

ちなみにこれもSeleniumバージョン2.2では発生しませんでした。


2012年5月6日日曜日

[Selenium 2]マウスホバーの実現方法

いい加減にSelenium2ネタを消化してきます。
今回はマウスホバーの実現方法です。ただ最初に断っておきますけど、ページの作りか何かの影響を受けているのか、ページによっては全くマウスホバーイベントが発生しない場合がありました。もし100%確実に成功させる方法をご存じの方がいましたらご教示ください!

試した環境

  • ブラウザ:Firefox 9
  • JDK 6
  • Selenium 2.18
  • Windows 7 64bit
SeleniumとFirefoxのバージョンはちょっと古めとなっていますが、多分バージョン11とかでも大丈夫だと思います。
このエントリ書く当たって自宅PC環境で試してみたんですけど、現時点のSelenium最新バージョン2.21はFirefox12に対応していないようで動かず…

Actionsオブジェクト使用する方法(ただし非推奨)

Actions#moveToElementで実現できます。できるんですけど…

これだとマウスホバーがキープされません。よって「マウスホバーで動的に表示されたメニューをクリック」したい場合、以下のコードではダメです。

正しくは以下のコードです。ホバーとクリックを間髪入れずに連続実行しています。

「正しくは」といったものの、上記はただ連続実行しているだけで結局ホバーキープはできていないので、厳密には正解ではありません。実際、ホバー後のクリックが間に合わずにエラーとなってしまったケースが多々ありました。
補足
もしかしたらActions#clickAndHold()使えばいいかもしれん(厳密にはマウスホバーではないけど)。けど前述の通り自宅環境だとSeleniumが動かないので試せない。

ホバーキープしたい場合はDefaultSeleniumかますのが確実

以下の方法だとホバーキープされました。

ただし、冒頭でも述べましたが、これだとそもそもマウスホバーイベントが全く発生しないケースが少ないですがありました。
あと、z-indexが正しく解釈されないのか、動的表示したメニューをクリックしたとき、メニューではなくその奥にある要素がクリックされてしまうということも。

何かSelenium WebDriverってまだまだバグが多いな…何か忘れたけどびっくりするようなデグレが発生してた事もあったような。

参考

2011年12月25日日曜日

Selenium 2 事始め - Maven編

さて、前回エントリではSeleniumのJARファイルを手動配置してましたが、実際試した方はお分かりでしょうがJARファイルたくさんあります。これだとバージョン上げるときに大変です。
今回は、Seleniumのバージョンを指定すれば必要なJARを自動で探して取ってきてくれるMavenを使用した環境構築手順をご紹介します。
まあSeleniumとうよりは、殆どMavenの使い方です。
Mavenか…Javaメインだった前職の業務系SIerでは、4年半勤めて結局1回も使う機会は無かったなー…はー情けない…

各種ソフトウェアのバージョン

  • Maven 3.0.3
  • Selenium 2.15
  • Java SE 7
  • Firefox 9.0.1
  • eclipse 3.7
  • Windows 7

Mavenインストール

ダウンロード&配置
まずはアーカイブをダウンロード。
解凍したものは任意のディレクトリに配置。
環境変数設定
以下設定を追加。ルートディレクトリのパスはお使いの環境のものに置き換えてください。
  • Path : {Mavenルート}\bin
  • JAVA_HOME : {JDKルート}
動作確認
コマンドプロンプトでmvnコマンド実行してみてエラーが無ければOK。
C:\maven>mvn --version
Apache Maven 3.0.3 (r1075438; 2011-03-01 02:31:09+0900)
Maven home: C:\maven\bin\..
Java version: 1.7.0_02, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_02\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

Seleniumプロジェクト作成

以下コマンドでプロジェクト作成。「-DgroupId」でパッケージを、「-DartifactId」でプロジェクト名を指定します。
尚、以下のやり方だとコマンド実行したディレクトリに作成されます。多分オプションで作成先は指定できると思うけど、調べてないから知らん。
C:\maven>mvn archetype:create -DgroupId=com.example.selenium -DartifactId=Selenium2SampleByMaven
pom.xmlにSeleniumライブラリの依存設定追加
Mavenの肝。これ設定しておくと、必要なJARを勝手に取ってきてくれます。
バージョン上げるときは<version>変更するだけ。コンパイル(mvn complile)などのタイミングで取りに行きます。
公式サイトにある依存設定を<dependencies>タグ配下に追記します。

eclipseプロジェクトに変換
eclipseで読み込めるように「.project」や「.classpath」を作成してくれます。
ちなみにpom.xml編集していれば、このタイミングでJAR取得しにいきます。
> cd Selenium2SampleByMaven
> mvn eclipse:eclipse

eclipse設定

Maven関連の設定追加
設定ダイアログで[Java] -> [ビルド・パス] -> [クラスパス変数]と進み、「新規...」で追加します。
  • M2_REPO : {ローカルリポジトリのパス}
    ※デフォルトだと{ユーザールート}\.m2\repository
もう一個の方は設定ダイアログで[実行/デバッグ] -> [ストリング置換]と進み、「新規...」で追加します。
  • maven_exec : {Mavenルート}\bin\mvn.bat

あとは

作成したプロジェクトをeclipseにインポートして、前回エントリのサンプルを作って動かしてみてください。
ちなみに、当エントリのやり方だと、プロジェクトのコンパイラー設定がバージョン1.4になってしまっており、コンパイルエラーが発生しちゃってました。これも多分プロジェクト変換時にオプションで指定できると思います。追々調べて追記しときます。

参考

Selenium 2 事始め

ブラウザを自動操作するテストツールであるSelenium 2の導入メモです(言語はJava)。
今年の6月辺りに、バージョン1系を散々調査・検証の上カスタマイズしたりしてよっしゃ終わったと思ったら、彗星の如く現れやがった時の脱力感ときたらなかったです。

各種ソフトウェアのバージョン

  • Selenium 2.15
  • Java SE 7
  • Firefox 9.0.1
  • eclipse 3.7
  • Windows 7

SeleniumのJARをダウンロード

公式サイトからZIPファイルをダウンロード。
解凍したら中身から以下を取り出し、プロジェクトのビルドパスに追加。
  • selenium-java-2.15.0.jar
  • libsフォルダ内のJAR全て

サンプルクラスで試す

公式ドキュメントの以下ページのサンプルをコピペして試してみましょう。

Firefoxが起動し、Google検索が自動実行されればOK。
いやー感動しますね。何かいろいろと作れば楽できそうだ。