65.9K
CodeProject 正在变化。 阅读更多。
Home

Web Replay 2——自动化 Web 测试

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (9投票s)

2005年8月16日

4分钟阅读

viewsIcon

91594

downloadIcon

1531

本文介绍了一个基于 Internet Explorer 的 Web 应用程序(Internet/Intranet)的自动化软件测试工具。

引言

Web Replay 2 是一个Web 应用程序的自动化软件测试工具。它通过重放场景来测试应用程序,帮助检测 Web 应用程序中的错误和回归。使用 Web Replay 2,您可以自动导航到网页,填写表单字段,点击提交(确定)按钮,然后继续到另一个网页。要使用 Web Replay 2,请构建一个 JavaScript 场景文件(见下文),在编辑框中输入文件名,然后点击 Replay 按钮。

背景

Web Replay 2 基于 Microsoft 的 Internet Explorer 6.0、DHTML behaviors 和 JavaScript(而Web Replay 1 是用 C++/COM 实现的)。

Web Replay 2 使用一个 FRAMESET,并将 DHTML behavior 附加到最底层 frame 的 onload 事件上,以执行一些 JavaScript 代码来回放场景。它仅用脚本实现(在 Internet Explorer 中运行的客户端 JavaScript 和在 ASP 页面中运行的服务器端 JavaScript)。

因此,Web Replay 2 让您在场景文件中可以完全访问 Microsoft Internet Explorer 文档对象模型 (DOM)。由于场景是一个 JavaScript 程序,您可以实现几乎任何测试用例。

使用函数 WebReplay_Navigate(),您可以调用服务器端代码来实现测试用例的先决条件和后置条件(例如,设置数据库或检查创建/修改的记录是否正确)。

使用代码

Web Replay 提供以下功能

  • 从 JavaScript 文件重放场景。
  • 支持 Microsoft Internet Explorer 支持的全部功能(包括 Windows 集成身份验证)。
  • 支持 HTML 表单、HTML 输入元素、HTML 超链接(锚点)。
  • 支持JavaScript 中可用的对 HTML 元素的任何操作(更改值、触发事件等)。
  • 支持未命名的 HTML 元素:可以使用其关联的值和/或 innerText 和/或 HREF 来查找元素(HTML 元素可以基于任何属性的值来查找)。
  • 支持动态生成的网站(客户端):如果您的网站在浏览器中生成 HTML(使用 JavaScript 命令,如“document.write”),Web Replay 2 仍然可以回放给定的场景 - 它使用超时机制来查找动态生成的控件。
  • 基于 JavaScript 正则表达式模式匹配检测 HTTP 错误和/或应用程序错误。
  • 支持简单的对话框(“alert”和“confirm”方法)。Web Replay 会用自定义实现覆盖 window.alertwindow.confirm 方法,以处理场景回放。
  • 仅支持同一域上的服务器重放场景(被测网站必须与 Web Replay 应用程序在同一域)。这是由于 Internet Explorer 的安全限制(跨站脚本)。有关此限制的更多信息,请参阅以下 MSDN 文章

JavaScript 场景文件包含一个名为 WebReplayScenario(); 的函数定义,看起来像这样

function WebReplayScenario()
{
  switch (gintState)
  {
    case 0:
      // Open a web page (LOCALHOST only due 

      // to cross-site scripting limitations)

      "http://perso.wanadoo.fr/replay.grasse/freeware/WebReplay2/WebReplay2/WebReplaySDK.htm#WebReplay_Navigate" target=_blank>WebReplay_Navigate(
        "https:///WebReplay2/WebReplay2Scenario1_step1.asp");
      break;

    case 1:
      // Type in some text in a form field

      "http://perso.wanadoo.fr/replay.grasse/freeware/WebReplay2/WebReplay2/WebReplaySDK.htm#WebReplay_SimulateTextInput" target=_blank>WebReplay_SimulateTextInput("Text1", "NewValue1");
      break;

    case 2:
      // Submit form by clicking on a submit button

      "http://perso.wanadoo.fr/replay.grasse/freeware/WebReplay2/WebReplay2/WebReplaySDK.htm#WebReplay_SimulateHTMLElementClick" target=_blank>WebReplay_SimulateHTMLElementClick("OK");
      break;

    default:
      // Automatically exit from scenario

      "http://perso.wanadoo.fr/replay.grasse/freeware/WebReplay2/WebReplay2/WebReplaySDK.htm#WebReplay_SetStateNext" target=_blank>WebReplay_SetStateNext(-1);
      break;
  }
}

此函数基于全局变量 gintState 实现一个状态机;每次请求的操作成功时(例如,点击按钮),状态会增加 1(状态从 0 开始)。当场景完成时,状态设置为 -1。发生任何错误时,状态设置为 -2

实用函数 WebReplayScenarioAuto() 可以简化场景构建过程 - 它的输入是一个简单的状态数组(状态机已实现 - 无需管理 switch 和状态编号)

function WebReplayScenario()
{
   "http://perso.wanadoo.fr/replay.grasse/freeware/WebReplay2/WebReplay2/WebReplaySDK.htm#WebReplayScenarioAuto" target=_blank>WebReplayScenarioAuto(
     [
       // State 1: Navigate to the test Page 

       // (uses an anonymous function definition)

       [ null, function () { "http://perso.wanadoo.fr/replay.grasse/freeware/WebReplay2/WebReplay2/WebReplaySDK.htm#WebReplay_Navigate" target=_blank>
         WebReplay_Navigate(
          "https:///WebReplay2/WebReplay2Scenario1_step1.asp") }], 

       // State 2: Type in some text in a form field named Text1

       [ "Text1", "NewValue1" ], 

       // State 3: Submit form by clicking on a submit button named "OK"

       [ "OK" ], 

       // State 4: Type in some text in a form field named Text21

       [ "Text1", "NewValue2" ], 

       // State 5: Submit form by clicking on a submit button named "OK"

       [ "OK" ], 

       // State 6: Wait for next page's title: 

       // <h2>Form Submit Debugger</h2>

       // Set state to -1 (end) when the control is found.

       [ null, function () { "http://perso.wanadoo.fr/replay.grasse/freeware/WebReplay2/WebReplay2/WebReplaySDK.htm#WebReplay_WaitForHTMLControl" target=_blank>
            WebReplay_WaitForHTMLControl("h2", "innerText", 
                                         "Form Submit Debugger", -1) } ]

     ]
   );
}

提供了一个完整的 JavaScript SDK 来构建场景文件;当然,您也可以用自己的 JavaScript 代码扩展 SDK...

要构建场景文件,您基本上需要知道 Web 应用程序中 HTML 元素的名称(或 ID)(使用函数 WebReplay_FindHTMLControlWithName)。或者,您可以使用控件的内容(文本)与其进行交互(使用函数 WebReplay_FindAnchorWithTextWebReplay_FindButtonWithTextWebReplay_FindHTMLControlFromText)。

您可以使用以下三个函数与 HTML 控件进行交互

关注点

尽管这是完全重写的(v2.1 与Web Replay v1.0 毫无关系),但待办事项列表仍然很长。

Web Replay 2 待办事项列表

  1. 自动化录制场景文件。
  2. 多次重放场景(甚至无限循环来压力测试您的 Web 应用程序)。
  3. 批量重放场景文件。
  4. 支持身份验证(NTLM、基本身份验证、HTTPS)和多个登录帐户。
  5. 支持 FRAMES(多框架文档)或顶级 FRAME 网站。一些网站,如CodeProject,会使用一段 JavaScript 来确保它们在顶级框架中查看;Web Replay 2 与这些网站不兼容...
  6. 使用事件日志文件(CSV 格式?)进行错误/跟踪/调试。
  7. 支持复杂的对话框(基于方法 window.openwindow.showModalDialog 和/或 window.showModelessDialog)。

历史

  • 2005-08-19, 08:09:13 +0200 (周五, 2005年8月19日) - V2.1。
© . All rights reserved.