こんにちは。ITSS事業部の豊田です。
前回に引き続きSeleniumについて書いていこうと思います。
jQueryのように要素を取得してWebDriverに対してこの要素にこの動きをしてほしいという指示を出すのがSeleniumのおおまかな使い方だと前回書きました。しかしこの要素の取得自体がなかなか曲者だったりして苦労させられました。
自分のメモがてら、要素取得で困ったあれこれを書いていこうと思います。

・Webページの要素が取得される前にSeleniumの処理が進んでしまう
jsなどでwebページが動的に生成されたりする場合、要素の取得の前にseleniumの処理が進んでしまう場合があり、org.openqa.selenium.NoSuchElementExceptionが発生して処理が終了してしまいます。
それを防ぐため、確実に要素を取得できるよう要素が出現するまで待機するWebDriverWaitを使用します。

//WebDriverWait設定(最大10秒待機)
WebDriverWait wait = new WebDriverWait(driver, 10);
//指定の要素を取得できるまで
		wait.until(new ExpectedCondition() {WebElement iframe=driver.findElement(By.cssSelector("#cotoha-webchat-script-generate-frame"));
		driver.switchTo().frame(iframe);
			@Override
			public Boolean apply(WebDriver driver) {
				boolean b = driver.findElement(By.cssSelector("要素名")).getText().length() > 0;
				return Boolean.valueOf(b);
			}
			});

指定待機時間以内に要素が取得できなかった場合はorg.openqa.selenium.TimeoutExceptionが発生して処理が終了します。

・iframeや新しいウィンドウの中の要素が取得できない
switchToでWebDriverにこの中の要素を取得してくれ、と指示を出すと以降iframeやウィンドウの中の要素を取得できるようになります。

//iframeの場合
WebElement iframe=driver.findElement(By.cssSelector("iframeの要素名"));
		driver.switchTo().frame(iframe);
//ウィンドウの場合
driver.switchTo().window("新しいウィンドウ名");

・要素に一意の名前がない場合のプルダウンリストを選択する
例えばこんな感じのプルダウンリストから選択したい時

    • 新規登録

 

    • 解約

 

    • 登録情報変更

 

    • お問合せ

 

nameなどで一つ一つの項目に一意の名前を振れば取得は簡単なのですが、jsなどで動的に作られていた場合、自動テストのためにjsを書き換えるのもちょっと…
そこで項目一覧をlistで取得してみました。

int num;
WebElement ul = driver.findElement(By.cssSelector(".pulldown_list"));
		List li = ul.findElements(By.cssSelector(".items"));
		WebElement li1 = li.get(num);
		li1.click();

リストの何番目の項目かを指定して選択、という形式にしましたがもっと上手いやり方がありそうですね。

・要素が存在するかの判定
null判定などはできないので要素の長さが0以下かどうかで判定します。

if ( driver.findElements(By.cssSelector("要素名").size() <= 0 ) {
//要素が存在しない時の処理
}

詳しいseleniumのリファレンスはこちらを。

今回も非常に初心者クオリティな技術ブログでしたが、徐々にパワーアップできるように頑張っていきたいと思います。
成長を見守っていただければ幸いです。