本主题介绍如何提示 SOAtest 扫描 web 应用程序。然后可以对访问的页面执行静态分析,如执行静态分析中所述。
章节目录:

对扫描进行配置

扫描测试是执行测试用例时抓取指定 web UI 的测试。若要配置 SOAtest 扫描 web UI,则如下添加扫描测试:

  1. 请执行以下任一操作:
  2. 指定是否要从 HTTP、FTP 或本地源进行扫描。
  3. 点击 HTTP 工具设置要求基本设置选项卡,并完成以下内容:
  4. 如果想要输入连接密码,则选择域密码选项卡并点击添加来指定密码。
  5. 如果想要指定高级扫描选项,则选择高级设置选项卡,然后完成以下内容:
  6. 点击保存

现在可以在测试套件或单个扫描工具上运行任何可用的测试配置。执行测试时,SOAtest 会快速浏览静态和动态页面,并至少加载它遇到的每个页面的一个实例。

如果选择了推荐的 HTTP 配置选项,并且您的站点包含表格,则 SOAtest 允许您使用表单输入对话框填充表单。如果在 SOAtest 加载您的站点时打开表单输入对话框,则请按照Populating Forms中所述将其完成。

对特殊加载问题进行处理

本节介绍如何处理以下特殊的加载问题:

准备 SOAtest 在扫描期间限制和/或允许 URL 

可以通过在允许的/限定的 URL 表中添加限制项和/或允许项来控制 SOAtest 可以加载哪些站点 URL 和忽略哪些站点 URL。

如果 URL 标记为受限制,则 SOAtest 将不会加载在扫描期间遇到的 URL。如果不希望 SOAtest 访问某些目录或文件,您可以将它们标记为受限制 URL。例如,如果您有一个输出页面,则您可能希望将其标记为受限制,以便它不会阻止加载其他页面或导致其他页面无效。SOAtest 在创建路径、使用虚拟用户使用站点等时,避免了受限制的 URL。如果站点有一个 Web 服务器资源,则可以在加载该站点之前指定受限制的 URL(如本节所述)。

如果 URL 标记为允许,则 SOAtest 将加载在扫描期间遇到的 URL。对于启用 URL 字段中指定的 URL,最底层文件夹 URL 模式自动添加为允许的 URL;该 URL 被称为允许的子文件夹 URL。此处使用的 http(s)://...用于允许或限制指定 URL 的 HTTP 和 HTTPS 版本。更多信息,请参阅URL Restriction Examples

还可以指定其他允许的 URL。这对于配置 SOAtest 来加载相关站点而言十分有用。相关站点是链接到其中一个项目站点的任何站点,但没有与项目站点相同的主机名。例如,您的主要项目来源是 http://www.parasoft.com,并且该站点链接到 http://forums.parasoft.com http://www2.parasoft.com,这两个站点都是当前项目的相关站点。如果希望 SOAtest 在当前项目上下文中遇到相关站点时自动加载,则需要将其指明为允许的 URL。

限制项和允许项都是在扫描工具的允许的/限定的 URL 表中指定的。在表中,使用符号 + 来标记允许项,使用符号 - 来表示限制项。允许项/限制项都区分大小写。

可以将限制项和允许项结合起来创建一个复杂的扫描方案。允许项/限制项按顺序处理,从表格顶部的条目开始,到表格底部的条目结束。

若要将条目添加到允许的/限定的 URL 表中:

  1. 点击添加。将添加新的一行到允许的/限定的 URL 表中。
  2. 在新添加行的文本字段中,输入想要限制或允许的 URL。
  3. 如果需要,可切换 +/- 符号以指明允许或是限制指定的 URL。

与允许的 URL 模式不匹配的 JavaScript 和 CSS 文件将不会在项目树中显示。然而,如果 SOAtest 需要访问这些文件来正确处理 Web 页面,则它将访问这些文件(即使它们不会被添加到该项目中)。

若要更改允许的/限定的 URL 表条目的位置,请选择要移动的条目,点击紧挨着允许的/限定的 URL 表的向上和向下箭头按钮,直到条目处于所需位置。

如需删除允许的/限定的 URL 表项,请选择要删除的表项并点击删除

URL 限制示例

下面的例子解释了关于 http(s)://... 限制的一些细节:

通配符示例

下表显示了如何使用通配符来实现不同的目标:

若要匹配这个...使用类似这样的条目...
任何协议*www.parasoft.com/dir1/dir2/index.html
HTTP 或 HTTPS 协议http(s)://www.parasoft.com/dir1/dir2/index.html
域中任何页面http://www.parasoft.com/*
最深子目录中的任何页面http://www.parasoft.com/dir1/dir2/*
域中任何协议和页面*www.parasoft.com/*
任何 index.html 的页面名称*index.html
任何与‘dir’一词相关的链接*dir*
任何链接*

*.parasoft.com 将匹配 www.parasoft.comarticles.parasoft.com

*Parasoft*  将匹配 www.parasoft.comwww.parasoft.net、parasoft.com 等。

direc*ry/*  将匹配 directory/dir2direcHELLOry/dir2/dir3direc12345fry/images

了解 SOAtest 启发式扫描

项目扫描和更新期间,每个可能的 URL 都与允许的/限定的 URL 表匹配,以确定是否应该访问 URL。确定 URL 是否应该访问的过程如下:

  1. 在允许的/限定的 URL 表中找到最后一个匹配的 URL。
  2. 如果最后一个匹配的 URL 的符号为正(+),则表示允许访问该 URL。如果符号为负(-),表示该 URL 将受到限制。

允许的/限制的 URL 表(如准备 SOAtest 在扫描期间限制和/或允许 URL 中所述)允许控制站点的哪些部分被扫描。例如,它允许在允许扫描的部分站点内将某些 URL 指定为“禁区”。或者,允许在不应被扫描的站点区域内对特定 URL 进行扫描。

示例 1

URL http://www.dev.parasoft.com/products/dir/page.html 将匹配来自上表的以下 URL:

+ http(s)://www.dev.parasoft.com/*
- http(s)://www.dev.parasoft.com/products/*
+ http(s)://www.*.com/products/dir/*

最后一个匹配的 URL 是 http(s)://www.*.com/products/dir/*。因为该 URL 的符号为正(+,表示允许访问该 URL),将允许URL http://www.dev.parasoft.com/products/dir/page.html

URL http://www.dev.parasoft.com/products/soap.html 将匹配来自上表的以下 URL:

+ http(s)://www.dev.parasoft.com/*
- http(s)://www.dev.parasoft.com/products/*

最后一个匹配的 URL 是 http(s)://www.dev.parasoft.com/products/*。因为该 URL 的符号为负(-,表示该 URL 受到限制),将限制 URL http://www.dev.parasoft.com/products/soap.html

示例 2

站点 http://www.dev.parasoft.com 有关于几千种类型的硬件。希望将站点扫描限制为两种类型的硬件:路由器和磁盘。除了站点的旧部分,还希望处理站点的所有其他部分。

若要对 URL http://www.dev.parasoft.com/index.html 进行扫描,请在开始 URL 字段输入该 URL。

将自动添加允许的 URL 到允许的/限定的 URL 表中:

+  http(s)://www.dev.parasoft.com/*

若只扫描 hardware 目录中的两个文件夹 RoutersDisks,则需要将以下条目按照下面的顺序添加到表中:

-  http(s)://www.dev.parasoft.com/newdir/hardware/*
+  http(s)://www.dev.parasoft.com/newdir/hardware/Routers/*
+  http(s)://www.dev.parasoft.com/newdir/hardware/Disks/*

 若要限制对旧目录的扫描,则需要添加以下条目。

-  http(s)://www.dev.parasoft.com/olddir/*

这就是完成操作后表格的样子。

限制扫描到开始 URL 的最底层子文件夹

当选中限制扫描到开始 URL 的最底层子文件夹 Http 扫描选项时,SOAtest 将自动启用 URL,为最底层子文件夹创建一个允许访问的 URL,并将其添加到允许的/限定的 URL 表中第一行。如果清除了该选项,SOAtest 将自动将默认允许的子文件夹 URL 添加到允许的/限定的 URL 表中第一行。当第一次重定向指向具有相同完全限定域名的 URL 时,SOAtest 也会这样做。

例如:

启用 URL子目录限制
http://www.parasoft.com/dir1/dir2/+ http(s)://www.parasoft.com/dir1/dir2/*
http://www.parasoft.com/dir1/dir2+ http(s)://www.parasoft.com/dir1/*
http://www.parasoft.com/dir1/page.html+ http(s)://www.parasoft.com/dir1/*
http://www.parasoft.com/dir1/page.html?count=1+ http(s)://www.parasoft.com/dir1/*

了解并配置并重定向处理

如果特定的开始 URL 为重定向,则 SOAtest 将加载其重定向和任何连续的后续重定向。此外,SOAtest 将自动为每个重定向添加一个允许的子文件夹 URL。重定向的所有添加条目都将被添加到允许的/限定的 URL 表的顶部。

如果希望 SOAtest 遵循没有添加为允许 URL 的重定向,则选择遵循表格中未指定为限定的重定向选项。当选中此选项时,如果 SOAtest 在扫描期间发现重定向,并且该重定向未在允许的/限定的 URL 表中指定,那么它将被加载。SOAtest 将为重定向到允许的/限定的 URL 表添加一个允许的子文件夹 URL。

准备 SOAtest 以加载使用 JavaScript 的站点

加载包含 JavaScript 的站点之前,请验证是否启用加载 JavaScript 选项。(该选项默认启用。)当启用该选项时,SOAtest 将执行 JavaScript 并加载相关链接。

若要验证该选项是否启用:

  1. 前往 Parasoft > 首选项
  2. 选择 Parasoft> 扫描

自定义 JavaScript 事件模拟

如果希望自定义 SOAtest 如何模拟 JavaScript 事件(如打开和关闭其他窗口、运行计时器等),可以通过在选项卡中更改 JavaScript 选项实现这一点。使用以下表来确定选择哪些选项。

目的...使用这些设置...
使用默认参数提示 SOAtest 触发每个处理程序一次。在模拟 JavaScript 事件框中选择一次
在加载站点(以便发现新链接)时提示 SOAtest 创建多种类型的事件。在模拟 JavaScript 事件框中选择多次
防止 SOAtest 模拟 JavaScript 事件。在模拟 JavaScript 事件框中选择从不

与 Alert、Confirm 和 Prompt 消息一起使用

每次在 SOAtest 扫描站点时遇到 JavaScript Alert、Confirm 和 Prompt 消息时,它都会将消息打印到结果区域(在右侧 GUI 面板),并执行默认操作。SOAtest 默认打印以下消息并执行下面的操作:

JavaScript 消息SOAtest 消息默认的 SOAtest 操作
JavaScript AlertJavaScript Alert: “消息”点击确认按钮
JavaScript PromptJavaScript Prompt: “消息”点击取消按钮
JavaScript ConfirmJavaScript Confirm: “消息”点击取消按钮

如果希望 SOAtest 以不同方式处理这些信息,您可以使用脚本定义自定义行为。详情请参阅使用脚本挂钩自定义扫描

对表单进行填充

如果选择了手动填充活动的输入 HTTP 配置面板复选框(默认启用),则 SOAtest 会在每次检测要求用户输入的表单打开一个表单输入对话框。如果希望 SOAtest 分析表单提交后返回的页面,则需要告诉 SOAtest 如何填充表单不同的输入元素(文本字段、复选框、单选框等)。可以通过在加载过程中在这些对话框中指定固定输入来实现这一点。

不需要为每个表单添加测试输入。我们推荐您只添加需要访问站点所有主要区域的输入;可以根据需求跳过对话框。而且,如果 SOAtest 可以在不需要提交特定表单输入时访问所有站点区域,则不需要在加载过程中输入任何表单输入。

如果不想添加任何表格的输入信息,请点击第一个对话框中的忽略所有

如果要为部分或所有表格添加输入,请利用下表确定针对每个打开的对话框应采取的操作。

目的...操作...
标记输入提交。表单测试名称字段中输入新名称。
输入当前表的信息。
  1. 使用配置表单输入控件来为每个表单输入元素添加或更改输入。如果不为特定元素添加输入,则将提交默认输入(如代码中所指定)。
  2. (可选项)更改默认的表单提交方法。
    • 若要模拟一个简单的 JavaScript 提交或者是模拟用户通过按 Enter 键提交表单,则选择隐含提交选项。
    • 若要模拟用户通过点击提交按钮进行表单提交,可以选择代表提交按钮(例如,Image: "Anonymous”)的选项,也可以点击提交图像特定区域(如果在表单输入面板中可用)。
  3. 准备添加输入时,点击添加

添加输入后,SOAtest 会重新打开相同的表单对话框,以便可以输入其他的信息。

指明您不希望输入当前表单的任何其他信息。点击忽略
指明您不希望输入当前表单或任何该表单的其他实例的任何其他信息。点击忽略表单
指明您不希望在该站点中输入表单的任何其他信息。点击忽略所有
浏览到与当前表单相关联的页面。点击查看

了解表单输入目的和选项

如果您的站点使用表单,并且您希望 SOAtest 加载并测试这些表单提交后返回的页面,则需要告诉 SOAtest 如何填充表单不同的输入元素(文本字段、复选框、单选按钮等)。要测试的页面实例越多,则需要填充表单的信息就越多。

填充表单有两种方法:

完成表单输入面板

若要添加或更改 SOAtest 打开的表单输入面板中的固定输入:

  1. (可选项)更改表单测试名称字段中的输入标签名。
  2. (可选项)更改表单动作字段中的表单动作。
  3. 使用表单输入控件来为每个表单输入元素添加或更改输入。
  4. (如果表单有一个 OnSubmit 处理程序)根据是否希望在测试期间使用处理程序来启用或禁用提交表单时处理 OnSubmit 句柄
  5. (可选项)更改默认的表单提交方法。

对加载期间的身份验证进行管理

如果 SOAtest 访问了需要身份验证的页面,则将打开一个密码对话框,需要您输入有效用户名和密码。

在合适的字段中输入有效的用户名和密码,请指定是否希望 SOAtest 在该项目文件中保存密保,然后点击 OK

关于加载和站点扫描的常见问题


使用允许的/限定的 URL 表决定了应该扫描网页的哪个部分。在自动 web 项目扫描期间,每个潜在 URL 都与允许的/限定的 URL 表匹配,以确定是否应该访问 URL。确定 URL 是否应该访问的过程如下:

1.在允许的/限定的 URL 表中找到最后一个匹配的 URL。
2.如果最后一个匹配的 URL 的符号为正(+),则表示允许访问该 URL。
3.如果符号为负(-),表示该 URL 受到限制。

该机制允许控件决定要扫描网页的哪个部分。例如,它允许在允许扫描的部分站点内将某些 URL 指定为“禁区”。或者,它允许在不应该扫描的部分网站内扫描其他 URL。

注意:允许的/限定的 URL 表条目区分大小写。

可以,通配符星号(*)可以在 URL 中的任何位置使用,以匹配 0 个或更多字符。星号(*)适用于构造允许的/限定的 URL 表条目的任何组合方式。

使用星号(*)的例子:

  • 若要匹配任何协议:
    *www.parasoft.com/dir1/dir2/index.html
  • 若要匹配 http 或 https 协议:http():
    //www.parasoft.com/dir1/dir2/index.html
  • 若要匹配域中任何页面:
    http://www.parasoft.com/*
  • 若要匹配最深子目录中的任何页面:
    http://www.parasoft.com/dir1/dir2/*
  • 若要匹配域中任何协议和页面:
    *www.parasoft.com/*
  • 若要匹配任何 index.html 的页面名:
    *index.html
  • 若要匹配任何与‘dir’一词相关:
    *dir*
  • 若要匹配任何链接:
    *

允许域 URL 告诉 SOAtest 加载域中所有页面。例如,如果您的站点为 http://www.parasoft.com,则允许域 URL 将是 http(s)://www.parasoft.com/*,其中通配符型号代表该域中任何链接。

将加载扫描期间域中任何链接,如 http://www.parasoft.com/dir1/dir2/page2/html 或 https://www.parasoft.com/dir/page1.html

当输入启用 URL 时,允许域 URL 将自动添加到允许的/限定的 URL 表中。

您将需要将条目添加到允许的/限定的 URL 表中来控制该内容是否扫描。如果您的 web 站点有几千种类型硬件的信息,则您可能希望限制扫描该站点两种类型的硬件:路由器和硬盘。除了旧的站点部分,还希望处理站点的所有其他部分。

例如:

  • 如果希望启用扫描 URL http://www.dev.parasoft.com/index.html
    • 开始 URL 字段输入 tp://www.dev.parasoft.com/index.html。允许的 URL 将自动添加到允许的/限定的 URL 表中:+  http(s)://www.dev.parasoft.com/*
  • 若只扫描 hardware 目录中的两个文件夹 Routers 和 Disks,则需要将以下条目按照下面的顺序添加到表中:
    • - http(s)://www.dev.parasoft.com/newdir/hardware/*
    • + http(s)://www.dev.parasoft.com/newdir/hardware/Routers/*
    • + http(s)://www.dev.parasoft.com/newdir/hardware/Disks/*
  • 若要限制对旧目录的扫描,则需要添加以下条目。
    • - http(s)://www.dev.parasoft.com/olddir/*

添加上述 URL 之后,允许的/限定的 URL 表应包含以下内容:

  • +  http(s)://www.dev.parasoft.com/*
  • - http(s)://www.dev.parasoft.com/newdir/hardware/*
  • + http(s)://www.dev.parasoft.com/newdir/hardware/Routers/*
  • + http(s)://www.dev.parasoft.com/newdir/hardware/Disks/*
  • -  http(s)://www.dev.parasoft.com/olddir/*

更多详情,请参阅准备 SOAtest 在扫描期间限制和/或允许 URL

 若要允许在扫描站点期间加载其他网站,则需要将外部站点添加到允许的/限定的 URL 表中。可以添加一个星号(*)作为允许的 URL 以允许要加载的所有站点。

当您启用 URL 时,SOAtest 将自动将允许域限制(如 http(s)://www.parasoft.com/*)添加到允许的/限定的 URL 表中。

使用 http(s)://... 是为了允许或限制指定 URL 的 http 和 https 版本。

如何希望将扫描限制为站点的非加密版本或加密版本,则可以将删除星号,或者使用‘s’来代替。

 根据允许的/限定的 URL 表检查重定向,以确定是否遵循它们。

URL 自动添加到允许的/限定的 URL 表有两种情况:

  • 如果开始 URL 为重定向(请参阅我的开始 URL 为重定向。将会怎么样?),URL 自动添加到表中。
  • 如果选中了表选项中未指定为限制的遵循重定向,则会自动将 URL 添加到表中。当选中此选项时,如果 SOAtest 在扫描期间遇到了重定向,并且该重定向未在允许的/限定的 URL 表中指定,那么它将被加载。SOAtest 还会自动将该重定向的允许 URL 添加到允许的/限定的 URL 表。

如果特定的开始 URL 为重定向,则 SOAtest 将加载其重定向和任何连续的后续重定向。此外,SOAtest 将自动为每个重定向添加一个允许的 URL。这些允许的 URL 将添加到允许的/限定的 URL 表中。

详情请参阅准备 SOAtest 在扫描期间限制和/或允许 URL

如果您的站点包含注销页面,它可能导致 SOAtest 停止扫描。如果 SOAtest 遇到这种类型的页面,SOAtest 将注销该用户。由于用户不存在,这将造成其他页面不可访问。可以通过限制注销页面的加载来防止扫描期间发生这种情况。

可以将用于包含注销事件的页面的 URL 限制添加到允许的/限定的 URL 表中。例如,如果注销页面是 http://www.parasoft.com/logout.html,那么您可以将它添加为受限制的 URL,这样就不会进行加载。

每次 SOAtest 检测要求用户输入的表单时都会打开一个表单输入对话框。

详情请参阅对表单进行填充

在扫描期间,SOAtest 会模拟以下技术的执行:

注意,上表主要关注支持扫描的技术。它与支持静态分析的技术有所不同。

使用脚本挂钩自定义扫描

可以通过在 SOAtest 项目中发生与“挂钩”相关联的事件时执行自定义脚本,进而自定义 SOAtest 的扫描行为。

了解挂钩概念

自定义挂钩可用于记录或修改扫描工具执行过程中特定点(例如,打开警报对话框时、提示用户作出响应时、提示用户输入密码时等)所传递的值。

例如,其中一个 SOAtest 的挂钩是“Alert”挂钩。在 SOAtest 的扫描工具遇到 JavaScript Alert 的任何时候都会调用该挂钩。如果希望 SOAtest 记录这个警告信息并在 SOAtest 消息窗口中报告它,则可以通过创建脚本实现这一点。该脚本定义该挂钩,然后说明了在 SOAtest 遇到该挂钩时希望它如何表现。调用此脚本后,在每次 SOAtest 遇到 JavaScript Alert 时,它都将访问它,并且执行特定操作(记录和报告警示信息)。

挂钩在脚本中使用自定义方法定义和自定义。同一个文件可以定义多个挂钩。如果向一个挂钩添加多个方法,则在调用该挂钩时将执行该挂钩定义的所有方法。

您可以以在 SOAtest中创建、应用和调用其他脚本相同的方式创建、应用和调用脚本:在启动时(只针对 JavaScript 和 Jython 脚本),通过创建和应用扩展工具,通过向特定路径节点添加脚本来定义挂钩。您可以在不同的时间调用挂钩以引出所需的功能。例如,如果要在所有 SOAtest 项目和站点中使用某个脚本的挂钩功能,可以将定义和使用该挂钩的 JavaScript 或 Jython 脚本添加到 <INSTALL>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/startup 目录中。只要程序调用挂钩,就会执行相关的用户自定义方法。将会一直执行该方法,直到调用该挂钩上的 clear()。

有关常用挂钩选项的完整说明,请参阅 SOAtest Extensibility API。前往 Parasoft > 帮助帮助 > 帮助内容(取决于您的安装程序),查找标题为“Parasoft SOAtest Extensibility API”的手册。

了解可用挂钩

SOAtest 允许在脚本中定义和操作以下特定挂钩:

警告

当 SOAtest 遇到 JavaScript alert() 方法时,其默认的行为是点击 OK 按钮,然后打印 JavaScript Alert: “消息”到 SOAtest 控制台视图中。可以通过 Alert 挂钩更改此行为。

在 SOAtest 遇到 JavaSrcipt Alert 时,默认调用 Alert 挂钩。通过将方法添加到该挂钩,可以确定在 SOAtest 遇到 JavaScript Alert 时会如何表现。调用 Alert 挂钩时,SOAtest 将打印消息 JavaScript Alert: “消息”到脚本中指定的位置汇总,或者到 SOAtest 控制台视图中(如果没有指定替换位置)。

该挂钩通常用来将警告信息结果打印到特定的 SOAtest 消息窗口。例如,如果您想让 SOAtest 在名为“Alert Messages”的 SOAtest 消息窗口中报告所有警告消息,您可以创建以下 Jython 脚本并将其添加到 <INSTALL>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/startup 目录中:

from com.parasoft.api import Application
def myAlertHook(msg):
   # Print the alert message to SOAtest Messages
   Application.showMessage("    JavaScript Alert: %s" % str(msg))    
   # Add the contents of the alert message to a Result Window named
   # "Alert Messages".  This ResultWindow can later be used
   # as part of a test suite in a regression test, to make sure the 
   # contents of the window, which contains the alert message,
   # are what you expect them to be.
   Application.report("Alert Messages", str(msg))
# Add your method to the Alert Hook Application.getHook("Alert").set(myAlertHook)

传递到方法 myAlertHook 的参数将是警告消息。它是一个字符串,是警告包含的消息。

也可以在用户(SOAtest)提交某个无效的表单值时使用 Alert 挂钩对它进行验证,应用程序会打开一个警告框,警告输入的数据无效。若要实现该测试,则首先创建并调用一个脚本(就像上面这个),改脚本将警告消息记录到 SOAtest 消息窗口中。然后,实现测试套件,该套件检查使用以下测试用例检查消息窗口的内容:

  1. 清除消息窗口的扩展工具。
  2. 执行应该引起警告消息的点击路径的测试路径工具。
  3. 带有脚本的扩展工具(如下所示)返回消息窗口的文本,带有附加回归控制的扩展工具验证在消息窗口出现的警告消息是否正确。
#Script to return text of result window named "Alert Messages" from soaptest.api import *
def return(): 
    return SOAPUtil.getResultWindowText("Alert Messages")
#Script to clear text of result window named "Alert Messages" from soaptest.api import *
def clear(): 
    SOAPUtil.clearResultWindow("Alert Messages")

确认和提示

当 SOAtest 遇到 JavaScript confirm() 方法时,其默认的行为是点击取消按钮,返回 false,然后打印 JavaScript Confirm: “消息”到 SOAtest 控制台视图中。当 SOAtest 遇到 JavaScript prompt() 方法时,其默认的行为是点击取消按钮,返回 null,然后打印 JavaScript Prompt: “消息”到控制台视图中。可以通过使用脚本更改这些行为来定义并自定义 Confirm 挂钩或 Prompt 挂钩(具体使用的挂钩取决于要更改哪个 JavaScript 方法的返回值)。

确认

通过自定义 Confirm 挂钩,可以确定在 SOAtest 遇到 confirm() 方法时会如何表现。

例如,在 SOAtest 遇到 confirm() 方法执行以下步骤的任何时候,提示它返回一个自定义(非默认)响应的一个方法:

首先,创建 Jython 文件(命名为 startup.py),它定义只接受一个参数的方法。该参数的值与 JavaScript 中传递给 confirm() 方法的值相同。根据您所需的逻辑,确定希望 confirm() 返回“true”还是“false”,然后从定义的方法返回该值。若要让 SOAtest 使用您刚刚定义的方法,则通过以下方法将其添加到 Confirm 挂钩,其中传递给 set 的参数是您定义的方法的名称。在这个例子中,定义的方法命名为 myConfirmHook。

from com.parasoft.api import Application
# msg will have the same value that gets passed to confirm() def myConfirmHook(msg):
    if msg == "Yes or no?":
        return 1
    return 0
Application.getHook("Confirm").set(myConfirmHook)

然后,将此文件添加到 <INSTALL>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/startup 目录中。下次启动 SOAtest 时,它将在遇到 confirm() 方法时执行上述脚本。

调用 Confirm 挂钩时,SOAtest 将打印以下消息(取决于确认操作)到脚本中指定的位置或控制台视图中(如果没有指定替换的位置):

提示

通过自定义 Prompt 挂钩,可以确定在 SOAtest 遇到 prompt() 方法时会如何表现。

Prompt 挂钩和 Confirm 挂钩具有非常相似的工作原理。两者的其中一个区别是,Prompt 接收两个参数,并将其传递给 prompt() JavaScript 方法。另一个区别是,为 Confirm 定义的方法返回布尔值,而为 Prompt 定义的方法必须返回字符串或“null”(Jython 中为“None”)。

可以定义逻辑来确定返回值是否基于传递给 prompt() 方法的参数。调用 prompt() 方法时返回“null”等价于在浏览器打开的提示框中点击 Cancel 按钮。使用与您为 confirm() 添加自定义方法相同的方式将该方法添加到合适的挂钩中,但此时挂钩命名为“Prompt”。下面是一个例子,返回“http://www.parasoft.com”的脚本作为 prompt() 的值:

from com.parasoft.api import Application
def myPromptHook(msg, defaultMsg):
    return "http://www.parasoft.com"
Application.getHook("Prompt").set(myPromptHook)

调用 Prompt 挂钩时,SOAtest 将打印以下消息之一(取决于提示响应)到脚本中指定的位置或控制台视图中(如果没有指定替换的位置):

返回不同情况下的不同值

可以通过将合适的逻辑添加到为 Confirm 或 Prompt 挂钩定义的方法中,以使 SOAtest 返回不同情况下的不同 confirm() 或 prompt() 值。通过使用要添加到 Confirm 或 Prompt 挂钩的方法的第一个参数文本来确定返回的值。例如,您可能希望 SOAtest 返回提示“输入 URL”的 http://www.parasoft.com,但返回的却是提示“输入名字”的 John。该功能可以如下实现:

def myPromptHook(msg, defaultMsg):
  if msg == "Enter a URL":
    return "http://www.parasoft.com"
elif msg == "Enter your name":
  return "John"
else:
  return None

域密码

当以下所有条件都满足时,调用 Realm Password 挂钩:

如果在满足上述条件之前定义了自定义 Realm Password 挂钩,则 SOAtest 将在提示您手动输入密码之前会执行自定义挂钩。如果该方法添加了密码(到项目中的站点,或者是到负载测试虚拟用户),则 SOAtest 将使用该密码,并不会在提示您提供密码。如果您或其他 SOAtest 用户以前输入过密码,则将不会执行该挂钩。如果要确保 SOAtest 使用您为钩子定义的密码,则应该在让 SOAtest 从钩子中添加新密码之前清除站点密码。

如果您想根据所处的特定环境(例如,根据您使用的特定路径,或者您想在虚拟用户负载测试中使用不同的用户名/密码)来更改用户名/密码,则此挂钩尤其有用。

下面的示例 Java 文件时 Realm Password 挂钩的一个非常基本的示例实现。无论上下文如何,该脚本都添加相同的密码。

import com.parasoft.api.*;
import java.lang.reflect.*;
import java.net.*;
import soaptest.api.*;
public class RealmPasswordHook {
    static public void returnPassword(String realm, String url, boolean ntlm, Context context)
throws MalformedURLException {
         SOAPUtil.addSitePassword(realm, "user1", "password1", url, ntlm);
    }
    public void setHook() throws UserMethodException, NoSuchMethodException
{
        Hook hook = Application.getHook("RealmPassword");
        Method userMethod = getClass().getMethod("returnPassword", new Class[] {String.class,
String.class, boolean.class, Context.class});
        hook.set(userMethod);
    }
}

以下 Jython 示例文件类似于以前的 Java 文件,不同的是它在访问 Realm Password 挂钩时会清除所有现有密码。

from com.parasoft.api import *
from soaptest.api import *
def returnPassword(realm, url, ntlm, context):
  SOAPUtil.addSitePassword(realm, "user1", "password1", url, ntlm)
def setHook():
  hook = Application.getHook("RealmPassword")
  hook.set(returnPassword)
  // Remove all previous passwords to the new one being added above is the one that gets used.
  SOAPUtil.removeSitePasswords()

以下示例说的是,在访问该挂钩时,JavaScript 文件删除现有域密码,然后在执行虚拟用户负载测试时,根据当前访问的 URL 提交密码。

// This method uses a different password based on the URL.
var Application = Packages.com.parasoft.api.Application
function returnPassword(realm, url, ntlm, context) {
  Packages.soaptest.api.SOAPUtil.removeSitePasswords()
  // Adds password to a virtual user in load test
   if (url.indexOf("http://toad.parasoft.com:90" == 0) {
     Packages.soaptest.api.SOAPUtil.addSessionPassword(realm, "user1", "password1", url, ntlm, context)
  } else {
     Packages.soaptest.api.SOAPUtil.addSessionPassword(realm, "user2", "password2", url, ntlm, context)
  }
}
function setHook() {
  var hook = Application.getHook("RealmPassword")
  hook.set(returnPassword)
  Packages.soaptest.api.SOAPUtil.removeSitePasswords()
}
  • 在使用 addSitePassword() 和 addSessionPassword() 时,应该将 ntlm 和定义的方法中的上下文传递给要调用的密码添加方法中。我们推荐您尽量避免更改这些值,除非您可以轻松地操作 SOAtest 可扩展性 API。同时,我们推荐您不要更改域值;服务器将该域值提供给 SOAtest,该域值是 SOAtest 使用来决定给特定 URL 发送哪个密码的其中一个因素。如果您传递的 URL 不存在于项目树汇总,则将不会添加该密码。
  • 在 Jython 中定义挂钩和在应用程序启用时应该设置的 JavaScript 时,需要在脚本中调用示例中定义挂钩的方法。如果将任何 JavaScript 或 Jython 脚本放在启动目录中,则脚本也需要实际调用设置挂钩的方法,而不只是定义方法。

URL 日志

每次 SOAtest 访问 URL 时,调用 URL Logging 挂钩。它可以用来提示 SOAtest 打印访问的每个 URL。

附加到此挂钩的方法需要有三个或四个参数。第一个参数应该是一个字符串类型,指定访问的 URL。第二个参数应该是使用 URL 提交的任何 POST 数据(它可能是 NULL)。第三个参数是包含其他请求发送的 HTTP 属性的 java.util.Hashtable(例如,referer)。第四个参数(可选项),如果添加到方法签名中,则它是 com.parasoft.api.Context

此外,需要将 SiteUtil.enableLogging 设置为 true,并将 UrlLogging 传递给 Application.getHook()

例如,如果您想让 SOAtest 将访问的每个 URL 都打印到控制台视图中,可以创建以下 Jython 脚本并将其添加到 <INSTALL>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/startup 目录中:

from com.parasoft.api import *
from webtool.site import SiteUtil

count = 1

def setHook():
    SiteUtil.enableLogging = 1
    hook = Application.getHook("UrlLogging")
    hook.set(loggingHook)
def loggingHook(url, post, props):
    global count
    if post:
        Application.showMessage(str(count) + ". " + url + " [POST=" + post + "]")
    else:
        Application.showMessage(str(count) + ". " + url)
   count = count + 1
setHook()