2014年8月26日火曜日

6.Selenium2

Selenium6

ここでは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 ServerWebDriverを終了する。
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.SeleneseTestBaseimportし、クラスは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 件のコメント:

コメントを投稿