ここではJavaソース変換後、Selenium2に適応するために必要な事柄を説明する。
6.1. 移行作業
6.1.1. テストスイーツ
A) import文を追加する
import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.webdriven.WebDriverBackedSelenium;
B) main関数からテストケースの呼び出しを追加する
変換ソースはJUnitテストをターゲットとして出力しているが、Javaアプリケーションとして実行する場合、main関数内からテストケースのメソッドの呼び出しを追加する。
下記は、JUnitテストでのテストケース実行をJavaアプリケーションで実行する場合の1つの例
6.1.2. テストケース
A) import文を追加する
import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.webdriven.WebDriverBackedSelenium;
B) TestCaseを継承するクラスに変更する
クラス名に「extends TestCase」を付加する。JUnitテスト対応である。
例.
public class Access111GrpOK {
↓
public class Access111GrpOK extends TestCase {
C) Javaアプリケーション用メソッドをテストケースのクラスに追加する
以下の記述は1つの例である。
@Ignore
public void exec( Parameters p, Selenium s ){
try {
testLoginDiplayOK211();
} catch (Exception e) {
e.printStackTrace();
}
}
D) NaNを修正する
変換できない数値はNaNと出力するので、修正する
例.
pause ( 30000 ) は、Thread.sleep(NaN);と出力するので、Thread.sleep( pauseTime );のように修正する。
E) 変数を修正する
変数は、文字列として出力するので、修正する。
例.
open( ${pc_testurl} )は、selenium.open( "${pc_testurl}" );と出力するので、selenium.open( pc_testurl );のように修正する。
F) captureEntirePageScreenshotコマンドを修正する
SeleniumAPIとして出力するがマルチブラウザに対応できないので、TakesScreenshotインターフェースを使用する。
例.
captureEntirePageScreenshot( ${captureFolder}10.1.2.png )は、selenium.captureEntirePageScreenshot("${captureFolder}10.1.2.png", "");と出力するが、マルチブラウザに対応できないので、File scrnsht = ((TakesScreenshot)(driver)).getScreenshotAs(OutputType.FILE);を使用してファイルに出力する。
6.1.3. その他
A) WebDriverの起動
変換ソースではJUnitテストとしてテストケースクラスのsetUpメソッドでFireFoxを起動するように作成しているのみなので、マルチブラウザとJavaアプリケーションに対応する為、Selenium Server起動の前に下記を適当な箇所で行う。
● IEの場合
File file = new File(iedrvpath);
System.setProperty("webdriver.ie.driver", file.getAbsolutePath());
WebDriver driver = new InternetExplorerDriver();
● Chromeの場合
File file = new File(chdrvpath);
System.setProperty("webdriver.chrome.driver", file.getAbsolutePath());
WebDriver driver = new ChromeDriver();
● FireFoxの場合
WebDriver driver = new FirefoxDriver();
B) Selenium Serverの起動
WebDriver起動後に下の記述を行う。
String baseUrl = "http://xgate4.orangesoft.co.jp/";
Selenium selenium = new WebDriverBackedSelenium ( driver, baseUrl );
C) 終了する時
テストを終了する時には、Selenium ServerとWebDriverを終了する。
Selenium Server の終了 : selenium.stop();
WebDriverの終了 : driver.quit();
D) ビルド
Selenium Server (selenium-server-standalone-(version).jar)をビルドに含める。
6.2. Selenium API
主なSeleniumコマンドの変換内容について説明する。
A) waiFor系コマンド
検証コマンドとしてwaitFor系以外にassert系、verify系があるが、エラー情報の取得やエラー発生時後の続行の対応などを考慮するのであれば、waitFor系コマンドを使用することを薦める。
メニューの[作成]要素の有無の検証を例にassertText, verifyText, waitForText、それぞれの変換内容を下に示す。
assertText ( 作成, css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label ) の場合
assertEquals("作成", selenium.getText("css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label"));
verifyText( 作成, css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label )の場合
verifyEquals("作成", selenium.getText("css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label"));
waitForText( 作成, css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label )の場合
for (int second = 0;; second++) {
if (second >= 60) fail("timeout");
try { if ("作成".equals(selenium.getText("css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label"))) break; } catch (Exception e) {}
Thread.sleep(1000);
}
|
assert系は、SeleniumAPIによるエラーメッセージを出力後、処理を終了する。
verify系は、SeleniumAPIによるエラーメッセージを出力後、処理を続行する。
waitFor系コマンドでは、検証項目がページに存在することを待つコードを出力するので、ここで任意のエラーメッセージの出力やエラー後の処理の対応が可能である。
下記は、waitForTextについてエラーメッセージを出力し、処理を続行するように変更した例
for (int second = 0;; second++) {
if (second >= 60){
System.out.print( "[Error] NG要素" );
System.out.println("timeout ");
break;// fail("timeout");
}
try { if ("作成".equals(selenium.getText("css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label"))) break; } catch (Exception e) {}
Thread.sleep(1000);
}
B) assert系コマンド
エラーになる場合、エラーメッセージをSeleniumが出力後、処理を中断する。
例.
assertEquals ("作成11", selenium.getText("css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label"));を実行すると下の様にエラーメッセージを出力し、処理を中断する。
Exception in thread "main" junit.framework.ComparisonFailure: expected:<作成[11]> but was:<作成>
at junit.framework.Assert.assertEquals(Assert.java:100)
at junit.framework.Assert.assertEquals(Assert.java:107)
at junit.framework.TestCase.assertEquals(TestCase.java:269)
at jp.co.orangesoft.testcase.xgate4.common.MainMenu01.testMainMenu01(MainMenu01.java:116)
↑この行がassertEquals
at jp.co.orangesoft.testcase.xgate4.common.MainMenu01.exec(MainMenu01.java:26)
:
C) verify系コマンド
verifyコマンドをSelenium2で使用する場合、次のコードを記述する。verifyTextを例に説明する。
verifyText( 作成, css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label )を変換すると
verifyEquals("作成", selenium.getText("css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label"));
であるが、実行する為にcom.thoughtworks.selenium.SeleneseTestBaseをimportし、クラスはSeleneseTestBaseを継承する。
エラーになる場合、エラーメッセージをSeleniumが出力後、処理を続行する。
例.
verifyEquals("作成11", selenium.getText("css=a[name=\"send\"] > div.ui-sprite-inner > span.ui-sprite-label"));を実行すると下のエラーメッセージを出力する。
expected "作成" to match glob "作成11" (had transformed the glob into regexp "作成11"
D) pauseコマンド
pauseコマンドは、Thread.sleep() に変換する。
例.
pause ( storedVars['pauseTime'] )
↓
Thread.sleep(NaN);と変換するので、移行後にNaNを任意の値/変数に修正する。
E) store系コマンド
主なstore系コマンドの変換結果を示す。waitFor系コマンドでは判定処理が不十分な場合などに活用しやすい。
➢ 任意の変数を扱うstore系
store ( expression, variableName )
expressionを文字列としてStringオブジェクトに代入する
例.
store ( 1234567-10-234567-20-234567-301234567-40, signame )
↓
String signame = "1234567-10-234567-20-234567-301234567-40";
storeEval ( script, variableName )
scriptを文字列としてStringオブジェクトに代入する
ほとんどの場合、修正・変更を行う必要があると思われる。
例.
storeEval ( storedVars['charcnt'] + 1, charcnt )
↓
String charcnt = selenium.getEval("storedVars['charcnt'] + 1");
※この変数の使用目的はカウンタなので、
例えば、int charcnt; charcnt++のように変更する。
➢ 対象要素の情報を取得する
storeText ( locator, variableName )
指定要素の持つテキストをStringオブジェクトにセットする。
例.
storeText ( id=allow_ip, ipaddr )
↓
String pw = selenium.getText("name=opw");
storeText ( xpath=//div[@id='lbxdata']//div//div//span[4], subject )
↓
String subject = selenium.getText("xpath=//div[@id='lbxdata']//div//div//span[4]");
storeValue ( locator, variableName )
<input>タグに入力されている値またはvalue属性の値をStringオブジェクトにセットする。
例.
storeValue ( name=qmark, quoatmark )
↓
String quoatmark = selenium.getValue("name=qmark");
storeTextPresent ( pattern, variableName )
指定テキストが現ページに存在するか検証行い、その結果をbooleanオブジェクトにセットする。
例.
storeTextPresent ( ${quoatmark} ${subject}, f )
*${quoatmark}と${subject}との間にある半角スペースがある。
↓
boolean f = selenium.isTextPresent(quoatmark + " " + subject);
storeElementPresent ( locator, variableName )
指定要素が現ページに存在するか検証を行い、その結果をbooleanオブジェクトにセットする。
例.
storeElementPresent ( css=img.ui-sprite.sp-mail, flg1 )
↓
boolean flg1 = selenium.isElementPresent("css=img.ui-sprite.sp-mail");
storeXpathCount ( xpath, variableName )
指定xpathの数をNumberオブジェクトにセットする。
例.
storeXpathCount ( xpath=//a[@name='delete']//div[@class='ui-act-inner']//span[@class='ui-act-label'], xcnt )
↓
Number xcnt = selenium.getXpathCount("xpath=//a[@name='delete']//div[@class='ui-act-inner']//span[@class='ui-act-label']");
6.3. 拡張スクリプトの扱い
SeleniumIDEで使用した拡張スクリプトはコメントアウトするので、適宜、修正・変更する。
例.
gotoIf ( storedVars['pw'] == "", newpass1 )
変数pwが空の場合、ラベルnewpass1へ移動するという制御文だが、変換後はコメントアウトされる。
↓
// selenium.gotoIf("storedVars['pw'] == \"\"", "newpass1");
0 件のコメント:
コメントを投稿