出向している現場のチームが画面上で手動でテストデータ作成していたのでSeleniumを導入しました。
担当しているシステムはIEでしか動かないのでIDEでテストケースは作らず
WebDriverを利用してjavaでケースを実装し、ブラウザ操作を行いました。
備忘録を兼ねて問題や使い方をまとめます。
環境
windows10 64bit
IE11
java 1.8.0_121
eclipse Neon.2 Release (4.6.2)
selenium 2.53.1
設定
1.eclipseで新規mavenプロジェクトを作成する
作成時に「シンプルなプロジェクトの作成」にチェックします
2.pom.xmlを修正
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.53.1</version>
</dependency>
</dependencies>
3.IEDriverServerをダウンロード
こちらから
※僕はWindows64bitを利用していますが
IEDriverServerは32bit版をダウンロードしました。
64版だとうまく動かないシーンがあります。後述の「問題と対応 2」をご覧ください。
4.Java実装へ
3で取得したDriverServierのパスをsetPropertyする必要があります。
System.setProperty("webdriver.ie.driver","C:\\任意の場所\\IEDriverServer.exe");
WebDriver driver = new InternetExplorerDriver();
問題と対応
1.Selenium起動時エラー
Unexpected error launching Internet Explorer.
Protected Mode must be set to the same value (enabled or disabled) for all zones.
IEブラウザの
インターネットオプション→セキュリティタブの設定
→すべてのゾーンで保護モードの設定を同じにする
2.sendKeysがめっちゃ遅い
ブラウザのテキストを入力するsendkeysが異常な遅さで使えません
詳細原因は追究してませんが、64bit版のIEDriverServerを利用するとそうなるようです。
3.クリック操作しても発火しない
IEだとたまに発生するようです。
以下の記述で回避できました。
WebElement element = driver.findElement(clickTarget);
element.sendKeys(Keys.CONTROL);
element.click();
もしくは
new Actions(driver).click(element).build().perform();
4.ファイルダウンロードポップアップが表示されると停止する
IEでファイルをダウンロードしたときに出るポップアップ(通知バー)
あれが出るとseleniumは停止します。
手動でぽちりしても動きません。
IE11だとブラウザから設定変更もできませんでした。
よって子スレッドを作ってダウンロード処理はそちらに任せて
親スレッドが本筋の処理を継続させるよう苦肉の対応を行っています。
Tips
ブラウザの子画面を操作したい
親画面がJSで子画面を生み出した場合
子画面にフォーカスして操作したいときのやりかた。
// 親ウィンドウ情報を保持
String currentHandle = driver.getWindowHandle();
// 子ウィンドウにフォーカスを切り替える
Set<String> windowHandles = driver.getWindowHandles();
for (String handle : windowHandles) {
if (!handle.equals(currentHandle)) {
driver.switchTo().window(handle);
}
}
// 子ウィンドウ処理が終わったら親に戻す
driver.switchTo().window(currentHandle);
ブラウザの処理が終わるまで待機したい
Seleniumで操作を命令した後、それが終わるまで待機したい。
例えば、検索のした後に、検索終わって一覧が出てから次の操作を行いたい。
以下のソースは、idがlistのエレメントが画面に表示されるまで待機する。
タイムアウトは10秒、超えると例外発生。
// 待機用オブジェクト
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(
ExpectedConditions.presenceOfElementLocated(
By.id("list")
)
);
ファイルをアップロードしたい
WebElement element = driver.findElement(By.xpath("//input[@type='file']"));
element.sendKeys("./ファイル.txt");
参考文献
https://donow.jp/skillup/?p=776#i-7
http://qiita.com/tukiyo3/items/44f5b64cf222d9da1b5b
http://bokuibi.blogspot.jp/2012/05/selenium-2.html
http://qiita.com/nkns165/items/53d1afc17023d9ae3ebd