SelenideでのBISのテストコード実装について(WF処理画面)

Selenideを利用したテストコードで、BISの申請処理を作成した時にハマったところを紹介します。

テストの内容とハマったところ

テストコードで行う操作としては以下の通りです。

  • 画面入力後、申請ボタンをクリック
  • 動的承認者を設定
  • 標準処理画面の申請ボタンをクリックして、申請を実行する

テストコードを実装してみたところ、
申請ボタンをクリックした後に表示される標準処理画面で操作が止まってしまい、エラーとなっていました。
またログを見ると「NoSuchElementException」が発生しており
操作しようとしていた要素がSelenideからは見つけることができないようでした。

原因調査と解決方法

Selenideはエラー発生時にスクリーンショットとHTMLファイルを保存する機能があります。
保存されたHTMLファイルとブラウザ上で表示させたHTMLを見比べてみたところ、HTMLファイルには処理画面のHTMLが存在しませんでした。
また、処理画面のHTMLをよく見てみると、iframeで実装されているようでした。
何か特殊な操作が必要なのかと思い、iframeとSelenideについて検索してみたところ、
以下のページが見つかり、iframeの切り替えが必要でありそうなことがわかりました。
Selenideを活用したい人に向けて - Qiita

そこでiframeを切り替える処理を追加してみたところ、エラーが解消されました。
なお後続の動的承認者設定処理も同様のエラーで止まってしまいましたが、
こちらは検索画面が別ウィンドウで表示されておりましたが、同様に切り替え処理を追加して対応できました。

実際のテストコード

実際のテストコードは以下のようになりました。

// bis申請画面の申請ボタンクリック
$("input[type=button][value=申請]").click();

// 標準画面に操作対象を切替
switchTo().frame("GB_frame");
switchTo().frame("IMW_GREYBOX_WINDOW");
switchTo().frame("IMW_PROC_MAIN");

// 動的承認者設定画面を表示
$x("//label[text()='フロー設定']").closest("tr").$$x(".//tbody/tr").get(0).$x("./td/a").click();

// ユーザ検索画面に切り替えて処理対象者を設定
$x("//div[@id='mainSetting']//tbody/tr[2]/td/a[1]").click();
switchTo().window("ユーザ検索");
switchTo().frame("frame-jp-co-intra_mart-master-app-search-tabs-user-list_user");
$x("//input[@id='searchTextbox']").val("aoyagi");
$x("//input[@id='searchButton']").click();
switchTo().window("ユーザ検索");
$x("//button[contains(@class, 'imui-button-selectall')]").click();
$x("//input[@id='decisionButton']").click();

// 操作対象を標準画面に戻す
switchTo().window(0);
switchTo().frame("GB_frame");
switchTo().frame("IMW_GREYBOX_WINDOW");
switchTo().frame("IMW_PROC_MAIN");

// 標準画面の申請ボタンクリック
$("#proc").click();
$x("//div[@aria-labelledby='ui-dialog-title-1']").$x(".//button/span[text()='決定']").click();

以上、Selenideを利用したWF申請処理のテストコードについてでした。