Selenium IDEでフォームテストとSELECTメニューテストを作る
Google ChromeとSelenium IDE 3.17.0でテストケースを作っていました。(FireFoxでも試しましたが、同様でした。)
レコーディングを開始して、ブラウザに表示されたフォームのtextarea欄に複数行を入力しました。
aaa
bbb
ccc
Code language: plaintext (plaintext)
すると、Selenium IDEのvalue欄には、
aaa\nbbb\nccc
Code language: plaintext (plaintext)
と表示されました。改行がJSONエンコードされて「\n
」と表示されたんですね。問題ありません。
これを実行すると、ブラウザのtextarea欄には、
aaa
bbb
ccc
Code language: plaintext (plaintext)
と入力されました。
送信ボタンをクリックした後、再度フォームを表示します。さきほどのtextarea欄をassert valueしたところ、成功です。これをフォームテストとして保存しました。
このtextarea欄はサーバー側で処理されて、改行で分割して、別のページでSELECTメニューとして表示されます。
このページを表示して、そのSELECTメニューの最初の要素が「aaa
」となるはずのassertも成功しました。これをSELECTメニューテストとして保存しました。
いい感じだね
selenium-side-runnerでSELECTメニューテストが失敗
さて、ここからが本題です。
次に、ターミナルでselenium-side-runnerで実行しました。Chromeのheadlessです。
フォームテストは、無事成功しました。
ところが、SELECTメニューテストが失敗しました。SELECTメニューの最初の要素が「aaa
」となるはずが、「aaa\nbbb\nccc
」となっています。
さかのぼって調べると、フォームテストのtextarea欄へ
aaa\nbbb\nccc
Code language: plaintext (plaintext)
と入力されていました。
sideファイルを確認すると、
"value": "aaa\\nbbb\\nccc"
Code language: plaintext (plaintext)
となっていました。バックスラッシュ「\
」 が 2つになっていますね。
Selenium IDEとselenium-side-runnerで、改行の扱いが違うようです。
Selenium IDEでは、ブラウザ上のtextarea欄の「改行」は、Selenium IDEのvalue欄では「\n
」、sideファイルでは「\\n
」。JSONの改行の扱いとしては、こちらが正しいです。
selenium-side-runnerでは、ブラウザ上のtextarea欄の「改行」は、sideファイルでは「\n
」。
selenium-side-runnerの立場から見ると、sideファイルは、バックスラッシュ「\
」 が1つの、
"value": "aaa\nbbb\nccc"
Code language: plaintext (plaintext)
と、なっていると期待どおりに動きそうです。
フォームテストのtextarea欄のassert valueは失敗しないの?
"aaa\nbbb\nccc"
と入力して、"aaa\nbbb\nccc"
と同じかどうかチェックしているから、合格したのね。
オレオレ証明書みたいだね
sedで置換して対応
やっつけですが、sedコマンドで「\\n
」を「\n
」に置換することにしました。
元のsideファイル自体を置換してしまうと、Selenium IDEで読み込みと実行に影響があるので、元のsideファイル自体はそのままにします。
元のsideファイルは、Selenium IDE用。例:myproject.side
置換した新しいsideファイルは、selenium-side-runner用です。例:myproject.side.tmp
置換した新しいsideファイルをselenium-side-runnerで実行します。
#!/bin/bash -ue
testsuite_side="myproject.side"
testsuite_side_tmp="$testsuite_side.tmp"
sed 's/\\\\n/\\n/g' <"$testsuite_side" >"$testsuite_side_tmp"
selenium-side-runner \
-c "browserName=chrome goog:chromeOptions.args=[--headless,--nogpu]" \
--output-directory=./results \
--output-format=junit \
"$testsuite_side_tmp"
Code language: Bash (bash)