假设有一个测试页面,其代码如下所示。

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <script type="text/javascript">
  5. function output(resultText){
  6. document.getElementById('output').childNodes[0].nodeValue=resultText;
  7. }
  8. function show_confirm(){
  9. var confirmation=confirm("Chose an option.");
  10. if (confirmation==true){
  11. output("Confirmed.");
  12. }
  13. else{
  14. output("Rejected!");
  15. }
  16. }
  17. function show_alert(){
  18. alert("I'm blocking!");
  19. output("Alert is gone.");
  20. }
  21. function show_prompt(){
  22. var response = prompt("What's the best web QA tool?","Selenium");
  23. output(response);
  24. }
  25. function open_window(windowName){
  26. window.open("newWindow.html",windowName);
  27. }
  28. </script>
  29. </head>
  30. <body>
  31. <input type="button" id="btnConfirm" onclick="show_confirm()" value="Show confirm box" />
  32. <input type="button" id="btnAlert" onclick="show_alert()" value="Show alert" />
  33. <input type="button" id="btnPrompt" onclick="show_prompt()" value="Show prompt" />
  34. <a href="newWindow.html" id="lnkNewWindow" target="_blank">New Window Link</a>
  35. <input type="button" id="btnNewNamelessWindow" onclick="open_window()" value="Open Nameless Window" />
  36. <input type="button" id="btnNewNamedWindow" onclick="open_window('Mike')" value="Open Named Window" />
  37. <br />
  38. <span id="output">
  39. </span>
  40. </body>
  41. </html>

用户必须响应警告/确认弹窗,并且将焦点移到新开的弹窗上。幸运的是,Selenium 可以处理 JavaScript 弹窗。

在我们开始介绍警告/确认/提示的细节之前,有必要先了解一些共性的基础知识。警告、确认和提示都有下面的一些命令模式:

命令 描述
assertFoo(pattern) 如果模式不匹配弹窗中的文本,抛出错误
assertFooPresent 如果没有弹窗,抛出错误
assertFooNotPresent 如果存在任何弹窗,抛出错误
storeFoo(variable) 把弹窗中的文本存储在一个变量中
storeFooPresent(variable) 把弹窗中的文本存储在一个变量中并返回真或假

当 Selenium 运行时,JavaScript 弹窗将不会出现。这是因为 JavaScript 的函数调用,在运行时被 Selenium 自己的 JavaScript 代码覆盖。然而,没看到弹窗,并不意味着不用处理它。通过调用 AssertFoo(pattern) 来处理弹窗。如果弹窗显示的断言失败了,测试会暂停并提示类似下面的错误信息:
[error] Error: There was an unexpected Confirmation! [Chose an option.]

Alerts 警告弹窗

首先介绍警告弹窗,因为这是要处理的最简单的弹窗。首先,在浏览器中打开上面的 HTML 示例文件,单击“显示警告”弹窗按钮。请注意,当你关闭警告弹窗后,页面上会显示“Alert is gone.”。现在,在 Selenium IDE 的录制模式下,重复刚才的操作,注意文本验证命令在关闭弹窗后会自动加到了脚本中。录制好的测试案例将会是下面的样子:

命令 目标
open /
click btnAlert
assertAlert I’m blocking!
verifyTextPresent Alert is gone.

你可能会奇怪,自己并没有添加警告弹窗的断言,这些都是 Selenium IDE 为我们做的处理,Selenium IDE 同时也为我们关闭了警告弹窗。如果你去掉断言命令,然后回放脚本,你会收到以下错误:
[error] Error: There was an unexpected Alert! [I’m blocking!]

你必须在脚本中包含一个断言命令来承认弹窗的存在。

如果你只是想断言警告弹窗出现了,并不关心它包含的文本是什么,这时可以使用 assertAlertPresent。他将返回真或假,当返回假时,停止测试。

Confirmations 确认弹窗

确认弹窗的行为跟警告弹窗类似,assertConfirmation 和 assertConfirmationPresent 提供与警告弹窗命令类似的功能。默认情况下,弹出确认弹窗后,Selenium 会选择“OK”。试着录制下列操作,在示例页面上点击“显示确认弹窗”的按钮,然后在确认弹窗框中选择 “Cancel” 按钮 ,然后断言输出的文本。录制好的测试案例看上去可能像下面这样:

命令 目标
open /
click btnConfirm
chooseCancelOnNextConfirmation
assertConfirmation Choose an option.
verifyTextPresent Rejected

chooseCancelOnNextConfirmation 函数告诉 Selenium 所有后续的确认应返回 false。它可以通过调用 chooseOkOnNextConfirmation 来重置。

请注意,此测试案例不能正常回放,届时 Selenium 会提示有一个未处理的确认。这是因为 Selenium IDE 录制事件的顺序错误导致的 Click 和 chooseCancelOnNextConfirmation 两个命令的顺序错误。(仔细想想,Selenium 并不知道在你打开一个确认弹窗之前会取消操作)只要交换前后这两个命令的位置,测试案例就会正常工作。

Prompts 提示弹窗

提示弹窗的行为跟警告弹窗类似,assertPrompt 和 assertPromptPresent 提供与警告弹窗命令类似的功能。默认情况下,弹出的提示信息后,Selenium 将等待你输入数据。试着录制下列操作,在示例页面上点击“显示提示弹窗”的按钮,然后在提示框中输入 Selenium 。录制好的测试案例看上去可能像下面这样:

命令 目标
open /
answerOnNextPrompt Selenium!
click id=btnPrompt
assertPrompt What’s the best web QA tool?
verifyTextPresent Selenium!

如果你在提示弹窗上点选取消按钮,你可能会注意到,answerOnNextPrompt 只会显示一个空白的目标。在提示弹窗上 Selenium 对待取消和一个空白的输入是一样的。