tanaka's Programming Memo

プログラミングについてのメモ。

SeleniumでJavascript / ウィンドウやフレーム / 属性での選択 / リストボックス

出席登録サイトを自動化するためのプログラムを開発している際に気づいたこと、役立ったことのメモ。

Javascriptの実行

  • JavascriptExecutorを使うと、現在のページ時にあるJavascriptの関数などを呼び出すことができる。以下、JavaでのJavascriptExecutorの利用例。エラーが出たらimportを適宜追加のこと。
WebDriver driver = new FirefoxDriver();
driver.get("http://am1.jp");
JavascriptExecutor exe = (JavascriptExecutor)driver;
exe.executeScript("alert('this is javascript.');");
  • Javascriptの関数呼び出しは便利だが、目的のボタンに仕込まれている関数を呼び出すだけだと、そのボタンに他に設定されている処理があった場合などに目的の動作が行われない。ややこしそうな処理は、WebElementを取り出してclick()した方が確実に処理ができる。

ウィンドウやフレームの切り替わり

  • エレメントやJavascriptの関数が見つからない場合は、どこかでWindowやFrameが切り替わった可能性がある。操作したい場所の要素をチェックして、どのウィンドウやフレームが表示されているかを確認する。
  • ウィンドウは以下で現在表示されている全てのものが確認できる。
Object [] wins;
wins = driver.getWindowHandles().toArray();
driver.switchTo().window(wins[0].toString());
  • switchTo().window(ウィンドウハンドル文字列)でウィンドウを切り替えられるので、成功するものを見つける。
  • フレームは以下の通り。フレーム名としてidやnameの値を指定できるので、ウィンドウよりも指示が簡単。
driver.switchTo().frame("フレーム名");
  • フレームは処理が終わったら以下でフレームを基本のものに戻しておく。
driver.switchTo().defaultContent();

目的のエレメントの取得

  • 通常、driver.findElement(By.id(id名))などでエレメントを取得するが、テーブル内のデータなどはidやnameがユニークに設定されていないものもある。
  • 押したいエレメントのタグを列挙して、getAttribute()でhrefやonclickなどの属性を取得して、該当するものかを見分けてclick()する。
List<WebElement> atts = driver.findElements(By.tagName("a"));
for (int i=0 ; i<atts.size() ; i++) {
    if (atts.get(i).getAttribute("href").compareTo("target.html") == 0)
    {
        atts.get(i).click();
    }
}

リストボックスの選択

Java
  • "selname"というname属性のComboboxで、変数numの数値をvalue属性にもった選択肢を選ぶ例
Select sel = new Select(driver.findElement(By.name("selname")));
sel.selectByValue(""+num);

  • selectByValue()はvalue属性、selectByIndex()はインデックス、selectByVisibleText()は表示文字列で選択する
PHP
$sel = PHPUnit_Extensions_Selenium2TestCase_Element_Select::fromElement($this->byName("selname"));
$sel->selectOptionByValue(num);