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

2014年9月14日日曜日

Failed to connect to binary FirefoxBinary

概要

JavaでFirefoxDriverを使ってブラウザ起動しようとしたところタイトルのエラーが出て起動しなかった

エラーの詳細は以下

エラー詳細

org.openqa.selenium.WebDriverException: Failed to connect to binary FirefoxBinary(C:\Program Files (x86)\Mozilla Firefox\firefox.exe) on port 7055; process output follows: 
10570639060 addons.xpi  DEBUG   Skipping unavailable install location app-system-share
1410570639061   addons.xpi  INFO    Mapping {972ce4c6-7e08-4474-a285-3208198ce6fd} to C:\Program Files (x86)\Mozilla Firefox\browser\extensions\{972ce4c6-7e08-4474-a285-3208198ce6fd}
1410570639061   addons.xpi  INFO    Mapping fxdriver@googlecode.com to C:\Users\username\AppData\Local\Temp\anonymous6771863948985799219webdriver-profile\extensions\fxdriver@googlecode.com
1410570639062   addons.xpi  DEBUG   Ignoring file entry whose name is not a valid add-on ID: C:\Users\username\AppData\Local\Temp\anonymous6771863948985799219webdriver-profile\extensions\webdriver-staging
1410570639062   addons.xpi  DEBUG   checkForChanges
1410570639068   addons.xpi  DEBUG   Directory state JSON differs: cache [] state [{"name":"app-global","addons":{"{972ce4c6-7e08-4474-a285-3208198ce6fd}":{"descriptor":"C:\\Program Files (x86)\\Mozilla Firefox\\browser\\extensions\\{972ce4c6-7e08-4474-a285-3208198ce6fd}","mtime":1410549501858,"rdfTime":1410549501670}}},{"name":"app-profile","addons":{"fxdriver@googlecode.com":{"descriptor":"C:\\Users\\username\\AppData\\Local\\Temp\\anonymous6771863948985799219webdriver-profile\\extensions\\fxdriver@googlecode.com","mtime":1410570638589,"rdfTime":1410570638500}}}]
1410570639072   addons.xpi-utils    DEBUG   Opening XPI database C:\Users\username\AppData\Local\Temp\anonymous6771863948985799219webdriver-profile\extensions.json
1410570639073   addons.xpi  DEBUG   New add-on fxdriver@googlecode.com installed in app-profile
*** Blocklist::_loadBlocklistFromFile: blocklist is disabled
1410570639254   addons.xpi-utils    DEBUG   Make addon app-profile:fxdriver@googlecode.com visible
1410570639256   DeferredSave.extensions.json    DEBUG   Save changes
1410570639256   DeferredSave.extensions.json    DEBUG   Save changes
1410570639256   addons.xpi  DEBUG   New add-on {972ce4c6-7e08-4474-a285-3208198ce6fd} installed in app-global
1410570639259   addons.xpi-utils    DEBUG   Make addon app-global:{972ce4c6-7e08-4474-a285-3208198ce6fd} visible
1410570639259   DeferredSave.extensions.json    DEBUG   Save changes
1410570639259   DeferredSave.extensions.json    DEBUG   Save changes
1410570639265   addons.xpi  DEBUG   Updating database with changes to installed add-ons
1410570639265   addons.xpi-utils    DEBUG   Updating add-on states
1410570639265   addons.xpi-utils    DEBUG   Writing add-ons list
1410570640188   DeferredSave.extensions.json    DEBUG   Starting timer
1410570640222   addons.manager  DEBUG   shutdown
1410570640225   DeferredSave.extensions.json    DEBUG   Starting write
1410570640225   addons.xpi  DEBUG   shutdown
1410570640226   addons.xpi-utils    DEBUG   shutdown
1410570640312   DeferredSave.extensions.json    DEBUG   Write succeeded
1410570640312   addons.xpi-utils    DEBUG   XPI Database saved, setting schema version preference to 16
1410570640312   addons.xpi  DEBUG   Notifying XPI shutdown observers
1410570640314   addons.manager  DEBUG   Async provider shutdown done
1410570641494   addons.manager  DEBUG   Loaded provider scope for resource://gre/modules/addons/XPIProvider.jsm: ["XPIProvider"]
1410570641496   addons.manager  DEBUG   Loaded provider scope for resource://gre/modules/LightweightThemeManager.jsm: ["LightweightThemeManager"]
1410570641499   addons.xpi  DEBUG   startup
1410570641499   addons.xpi  DEBUG   Skipping unavailable install location app-system-local
1410570641500   addons.xpi  DEBUG   Skipping unavailable install location app-system-share
1410570641500   addons.xpi  INFO    Mapping {972ce4c6-7e08-4474-a285-3208198ce6fd} to C:\Program Files (x86)\Mozilla Firefox\browser\extensions\{972ce4c6-7e08-4474-a285-3208198ce6fd}
1410570641501   addons.xpi  INFO    Mapping fxdriver@googlecode.com to C:\Users\username\AppData\Local\Temp\anonymous6771863948985799219webdriver-profile\extensions\fxdriver@googlecode.com
1410570641501   addons.xpi  DEBUG   Ignoring file entry whose name is not a valid add-on ID: C:\Users\username\AppData\Local\Temp\anonymous6771863948985799219webdriver-profile\extensions\webdriver-staging
1410570641501   addons.xpi  DEBUG   checkForChanges
1410570641509   addons.xpi  DEBUG   No changes found
*** Blocklist::_preloadBlocklistFile: blocklist is disabled

Build info: version: '2.39.0', revision: 'ff23eac', time: '2013-12-16 16:11:15'
System info: host: 'WINDOWS-3RKIT3N', ip: 'xxx.xxx.xxx.xxx', os.name: 'Windows Server 2008 R2', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_51'
Driver info: driver.version: FirefoxDriver
    at org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.start(NewProfileExtensionConnection.java:130) ~[fndb_main_rank_getter.jar:?]
    at org.openqa.selenium.firefox.FirefoxDriver.startClient(FirefoxDriver.java:250) ~[fndb_main_rank_getter.jar:?]
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:110) ~[fndb_main_rank_getter.jar:?]
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:197) ~[fndb_main_rank_getter.jar:?]
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:190) ~[fndb_main_rank_getter.jar:?]
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:186) ~[fndb_main_rank_getter.jar:?]
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:103) ~[fndb_main_rank_getter.jar:?]
    at fndb.amazonapi.HTMLCreator.updateRanking(HTMLCreator.java:197) [fndb_main_rank_getter.jar:?]
    at fndb.main.MainRankGetter.create(MainRankGetter.java:68) [fndb_main_rank_getter.jar:?]
    at fndb.main.MainRankGetter.main(MainRankGetter.java:48) [fndb_main_rank_getter.jar:?]
Caused by: org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:

環境

  • Windows 2008 R2
  • Java 1.7.0_51-b13
  • Selenium Driver 2.39.0

対処方法

SeleniumのJarのバージョンをアップデートするだけ
http://www.seleniumhq.org/download/ にアクセスして

  • Selenium Server (formerly the Selenium RC Server)から
    selenium-server-standalone-2.43.0.jar

  • Selenium Client & WebDriver Language Bindings のJavaから
    selenium-java-2.43.0.jar

をダウンロードしクラスパスに通せばOKです
Seleniumはブラウザがバージョンアップするたびにバージョンアップするのでこの辺ついていくのが面倒ですね
Mavenでもバージョンの部分を書き換える必要があるので結局作業が必要になっちゃいますね

2014年5月11日日曜日

CentOS上でSeleniumのテストを実行できるようにするまで

実行しているテストコードは自作のUIテストなので環境の構築方法を参考にしていただければと思います

■環境
CentOS release 6.3 (Final)
firefox 24.5.0
Java 1.8_20
Maven 3.1.1
tigrevnc 1.1.0-8

■必要なパッケージの準備
yum -y groupinstall "Development Tools"
yum -y install firefox
JDKのインストール
mvnのインストール

■X環境の構築
Xおよびtigervncのインストール

■Seleniumテストコードの取得と実行
git clone https://github.com/kakakikikeke/java-selenium-ui-test.git
cd java-selenium-ui-test
vim src/test/resources/config.properties
mvn clean test-compile test

■Jekins-Tips
Jenkinsから実行させる場合にはジョブの設定時に「export DISPLAY="localhost.localdomain:1"」するのを忘れないようにしてください
またmvnビルドを実行するユーザに対してexportする必要があるのでexportするビルドとmvnコマンドを実行するユーザが同じになるようにビルドを設定してください
例えばSSHログインしてシェルスクリプトを実行等のビルドを使っているとrootでログインしてmvnコマンドは別のユーザなんてことがあるので気をつけてください
自分が設定した感じだと実行ユーザではまる点が多かったのでセキュリティ上問題なければ全部rootで実行しておくと無難です

2014年1月10日金曜日

SeleniumでJavaのテストコードを書く方法

私のおすすめの方法を紹介します

SeleniumでUIのテストを作成するときに個人的に一番大変だなと思うのがHTML要素の特定です
Selenium的にベストなのはすべての要素にid属性がふられているのがベストなのですが
そんなSeleniumに特化したUIは存在しないと思います
要素を特定するのに最悪は自然言語から検索してそれらを囲う要素を取得するなんてことをしなければならないこともあるのではと思います
今回は基本的な進め方の1つとして私がいつもやっているテストの作り方を紹介します
また今回はGoogleで検索するまでの動作を自動化してみたいと思います

■環境
Mac OSX 10.8.5(Windows環境でも問題なく動作します)
SeleniumIDE 2.5.0
Eclipse Juno(4.2.1)
Java SE 1.7.0_40

■UIテスト作成方法
0. 事前準備
  • SeleniumIDEのインストール
  • Eclipseのインストール(Maven Integration for Eclipse, TestNG for Eclipse プラグインのインストール)
  • Javaのインストール
  • (mavenのインストール)
は事前に済ませておいてください
mavenはなくてもOKです

1. SeleniumIDEでベースとなるテストの作成
  1. SeleniumIDEを起動します
  2. https://www.google.co.jp/ にアクセスします
  3. SeleniumIDEの右上のブラウザの操作記録を取得することができる赤ボタンをクリックし記録を開始します
  4. Googleの検索窓で「モバイルバックエンド」と入力しGoogle検索を押下します(今回は左記の動作を記憶しテストします)
  5. 記録を停止するため先ほどクリックした赤ボタンを押して記録を停止します
  6. 最終的にSeleniumIDE上で以下のようになっていればOKです


テストがうまく動作するかIDE上で確認します
Googleのトップに戻りSeleniumIDEの「現在のテストケースを実行」を押下します(緑色の三角のアイコンです)
ワードが自動で入力され検索結果が表示されればテストが実行されていることになります
IDE上にも問題がある場合はエラーが表示されるのでエラーがないことを確認します

2. テストのエクスポート
先ほど作成したテストをJavaのコードとしてエクスポートします
SeleniumIDEのメニューバーから
ファイル->テストケースをエクスポート->Java TestNG / Remote Control
をクリックします、ファイルの名前をつけて保存するダイアログが出力されますので「UITest.java」名前をつけて適当なフォルダ配下に保存します

おそらくは以下のようなコードが生成されると思いますので
package com.example.tests;

import com.thoughtworks.selenium.*;
import org.testng.annotations.*;
import static org.testng.Assert.*;
import java.util.regex.Pattern;

public class UITest extends SeleneseTestNgHelper {
        @Test public void testUI() throws Exception {
                selenium.open("/");
                selenium.type("id=lst-ib", "モバイルバックエンド");
                selenium.click("name=btnK");
        }
}
以下のようにいきなり変更します
ポイントしてはFirefoxDriverを生成してから要素を特定するようにしているのと
デフォルトで継承されているSeleneseTestNgHelperを継承しないようにしています
あとはtestngの機能を使ってテストの前処理と後処理を追加してあげました
※このあたりは個人的な好みの問題もあるのでSeleneseTestNgHelperを使って記載したい場合はそのままテストコードを使っても問題ないかと思います
package com.example.tests;

import org.openqa.selenium.By;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.*;

import java.io.IOException;

public class UITest {

        private FirefoxDriver driver;

        @BeforeClass
        public void before() throws IOException {
                FirefoxProfile profile = new FirefoxProfile();
                profile.setAcceptUntrustedCertificates(true);
                driver = new FirefoxDriver(profile);
        }

        @Test
        public void open() {
                driver.get("https://www.google.co.jp");
        }

        @Test(dependsOnMethods={"open"})
        public void testUI() throws Exception {
                driver.findElement(By.id("lst-ib")).sendKeys("モバイルバックエンド");
                driver.findElement(By.name("btnK")).click();
        }

        @AfterClass
        public void after() {
                driver.close();
        }
}
コードが修正できたらeclipseにコードをコピペします
プロジェクトは通常のJavaプロジェクトでも問題ないですが、自分はmavenプロジェクトで作成しました
パッケージ名はSeleniumIDEからエクスポートしたデフォルトの場合com.example.testsになっているのでそれに合わせるといいと思います
mavenプロジェクトで作成した場合は必要なライブラリの定義(testngとselenium)をpom.xmlに記載し、通常のJavaプロジェクトで作成した場合は各種必要なJarファイルを公式サイト等から持ってくる必要があります
最終的にはプロジェクトが以下のような感じになっていればOKです

3. SeleniumIDEによる要素の特定とコード変換
更にテストを追加していきます
その際に今度は要素を特定しつつ直接コードを書いていくことにします
要素の特定方法自体はFirebugを使ったりするなどいろいろな方法があるかとは思いますが今回はSeleniumIDEだけで要素を特定する方法を紹介します

先ほどのGoogle検索から更に検索結果をクリックするテストを追加したいと思います
SeleniumIDEを開いた状態でGoogleの検索結果のページを開きます
SeleniumIDEでブラウザの記録を開始する赤ボタンをクリックします
その状態で検索結果の一番上のリンクをクリックします


するとSeleniumIDEの対象の部分にSeleniumIDEが解釈した要素情報が表示されます


この情報をコードに反映します
今回SeleniumIDEは対象を「link=ニフティクラウド mobile backend: アプリ開発をよりスマートに、スピーディに」と判断しました
これをコードに変換すると
driver.findElement(By.linkText("ニフティクラウド mobile backend: アプリ開発をよりスマートに、スピーディに")).click();
となります
今回、対象に表示されたのは「link=hogehoge...」の形式でしたが他にも「xpath=」や「css=」等が存在します
それぞれソースコードにひもづけることができ
  • xpath= ⇛ driver.findElement(By.xpath("ここに=以降の値を入力する")).click();
  • css= ⇛ driver.findElement(By.cssSelector("ここに=以降の値を入力する")).click();
  • id= ⇛ driver.findElement(By.id("ここに=以降の値を入力する")).click();
  • name= ⇛ driver.findElement(By.name("ここに=以降の値を入力する")).click();
といった感じで紐付けることができます(上記以外でも他にパターンはあるかと思います)
対象に表示されている内容はSeleniumIDEが現在表示しているページ上で一意に特定できる値を表示してくれますのでこれで簡単に一意の要素を特定することができます
ただ、ここで注意が必要なのがSeleniumIDEが一意と判断したのはあくまでも現在表示されているページ内なので動的にページの内容が変わる場合は同じ要素でも一意に特定できる要素が変わってくる場合があるのでそこはプログラム上でうまくカバーしてあげる必要があります
例えばif文を使って要素がなかった場合は他の要素でクリックするようにするなどです

4. 実行
プログラムに反映したらプログラムからテストできるか確かめてみます
今回はtestng形式で記載しているのでeclipseに「TestNG for Eclipse」のプラグインをインストールする必要があります
プラグインがインストールできたらUITest.javaを右クリックし「Run As」->「TestNG Test」をクリックし実行します
ブラウザが立ち上がり検索結果のページをクリックできたら成功です

うまくテストが成功しない場合はThread.sleepを入れてみたりしてください
あとはプログラム側でいかにうまくテストさせるかとなります

紹介は以上となります
あとは3, 4を繰り返し、要素を調べつつコードを作成し実行する感じが簡単なんじゃないかなと思います
ただ、SeleniumIDE上で特定できてもコードからだとうまく実行できないといったケースもあるようなのでその場合はコード側でループを利用しリトライ処理を実装する等の工夫が必要となります
UIのテストは作るのだけでも一苦労ですが、できたときに動いたときは普通の単体テストとはまた別の感覚が味わえるんじゃないかなと思います

2014年1月7日火曜日

FirefoxにSeleniumIDEをインストールする方法

■環境
Windows7 64bit
Firefox 26.0
SeleniumIDE 2.5
※インストール方法に関しては2014/01/07時点でのバージョンとインストール方法です

■インストール方法
1. 公式のダウンロードサイトにアクセス
http://docs.seleniumhq.org/download/
firefoxのプラグインの拡張子である「.xpi」ファイルを直接ダウンロードできるリンクがあるのでクリックします


クリックすると
このサイトからはFirefoxにソフトウェアをインストールできない設定になっています
という吹き出しが左上にでるので「許可」をクリックしプラグインをインストールします
許可をクリック後、更にダイアログでインストールするかを尋ねられるので「今すぐインストール」をクリックします


2. Firefoxを再起動
インストールが完了後に左上の吹き出しから再起動を要求されるので再起動を実施します
再起動後に
メニューバー -> ツール -> SeleniumIDE
があればインストールに成功しています


3. 起動確認
先ほどのメニューバーからSeleniumIDEをクリックし以下のようなUIが起動されればOKです


これでインストールは完了です
せっかくインストールしたので実際にUIをテストする方法も紹介したいなと思っています

2013年1月16日水曜日

【Selenium】[error] Unknown command: 'while'

Selenium IDEはデフォルトではwhileという命令を使用できないようです
拡張のJavaScriptをインストールすると動かせます

  1. https://github.com/darrenderidder/sideflow/blob/master/sideflow.js
  2. からJavaScriptファイルを「goto_sel_ide.js」という名前でダウンロード
  3. Firefoxを起動し、ツールから「Selenium IDE」を起動
  4. オプション→設定を開く
  5. 「Selenium Core 拡張スクリプト(user-extension.js)のパス」という欄にダウンロードしたJavaScriptファイルを設定
  6. OKして一旦Selenium IDEを閉じて再度起動する
  7. whileの構文を使ったテストケースを記載する(以下は100回ループしてリフレッシュするサンプル)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="http://xxx.xxx.xxx.xxx/" />
<title>test</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">test</td></tr>
</thead><tbody>
<tr>
    <td>store</td>
    <td>0</td>
    <td>i</td>
</tr>
<tr>
    <td>while</td>
    <td>storedVars.i++&lt;100</td>
    <td></td>
</tr>
<tr>
    <td>refresh</td>
    <td></td>
    <td></td>
</tr>
<tr>
    <td>endWhile</td>
    <td></td>
    <td></td>
</tr>
</tbody></table>
</body>
</html>

※「storedVars」っていう名前の変数は定義されているものだから勝手に小文字にしたりしないでね
(自分はこれで結構はまった・・・)
お試しあれ

参考サイト:http://51elliot.blogspot.jp/2008/02/selenium-ide-goto.html

2012年9月3日月曜日

【Java】Seleniumを劇的に安定させる方法

https://gist.github.com/3497944

FirefoxDriverを継承してsleepを必要なメソッドに入れてあげた
自分はこれで飛躍的に安定しました
正直カッコ悪いですけどねw

2012年5月26日土曜日

Seleniumで別ブラウザに処理を変更する方法

for (String windowID: driver.getWindowHandles()) {
 if (!windowID.equals(driver.getWindowHandle())) {
  driver.switchTo().window(windowID);
 }
}
driverはWebDriverクラスから生成されたオブジェクトです
上記は2つのブラウザを想定して、今でないブラウザに変更するだけなので
3つ以上操作する場合は、もう少しIDをチェックするロジックを増やす必要があります

ちょっとif文をいじればできるとおもいますw
参考までに

2012年4月18日水曜日

JavaでWebUIをテストする方法【ブラウザ、Webアプリケーション】

http://java-source.net/open-source/web-testing-tools
http://alternativeto.net/software/selenium/
http://en.wikipedia.org/wiki/List_of_GUI_testing_tools


結構たくさんあるんですねー。
まだほとんど触ってないのですが、とりあえずメモしておきます。
新しいの触りたいけど、やっぱり Selenium なのかなー・・・