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

对扫描进行配置

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

  1. 请进行下列其中一项操作:
  2. 指定是否要从 HTTP、FTP 或本地源进行扫描。
  3. 选择 HTTP Tool SettingsRequired Basic Settings 选项卡,并完成以下内容:
  4. 如果想要输入连接密码,则选择 Realm Passwords 选项卡并单击 Add 来指定密码。
  5. 如果想要指定高级扫描选项,则选择 Advanced Settings 选项卡,然后完成以下内容:
  6. 单击 Save

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

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

对特殊加载问题进行处理

本章节解释了如何处理以下特殊的加载问题:

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

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

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

如果 URL 标记为受允许,则 SOAtest 将加载在扫描期间遇到的 URL。对于Start URL 字段中指定的 URL,最深目录 URL 模式自动添加为受允许的 URL;此处使用的 URL 被称为 Allowed Subdirectories 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。

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

可以将限制和允许结合起来创建一个复杂的扫描方案。按照顺序对允许/限制进行处理,在表顶部启用条目,在表底部停止条目。

若要将条目添加到 Allowed/Restricted URLs 表中:

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

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

若要更改 Allowed/Restricted URLs 表条目的位置:

若要删除 Allowed/Restricted URLs 表条目:

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 都与 Allowed/Restricted URLs 表匹配,以确定是否应该访问 URL。确定 URL 是否应该访问的过程如下:

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

Allowed/Restricted URLs 表(如 Preparing SOAtest to Restrict and/or Allow URLs During Scanning中所述)允许控制站点的哪些部分被扫描。例如,它允许在允许扫描的部分站点内将某些 URL 指定为“禁区(off-limits)”。或者,允许在不应被扫描的站点区域内对特定 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进行扫描,请在 Start URL 字段输入该 URL。

将自动添加受允许的 URL 到 Allowed/Restricted URLs 表中:

+  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/*

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

限制扫描到Start URL 的最深子目录

当选中 Restrict scanning to deepest subdirectory of Start URL Http 扫描选项时,SOAtest 将自动启用 URL,为最深子目录创建一个允许访问的 URL,并将其添加到 Allowed/Restricted URLs 表中第一行。如果清除了该选项,SOAtest 将自动将默认允许的子目录 URL 添加到 Allowed/Restricted URLs 表中第一行。在第一重定向到具有相同完全限定域名的 URL 时,SOAtest 也会这样做。

例如:

开始路径子目录限制
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/*

了解配置并重定向处理

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

如果希望 SOAtest 遵循未添加为“允许 URL”的重定向,则选择 Follow redirects not specified as restrictions in the table 选项。当选中此选项时,如果 SOAtest 在扫描期间遇到了重定向,并且该重定向未在 Allowed/Restricted URLs 表中指定,则它将被加载。SOAtest 将为重定向到 Allowed/Restricted URLs 表添加一个允许的子目录 URL。

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

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

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

  1. 选择 Parasoft> Preferences
  2. 选择 Parasoft> Scanning

自定义 JavaScript 事件模拟

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

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

使用警告、确认和提示信息

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

JavaScript 消息SOAtest 消息默认的 SOAtest 操作
JavaScript 警告JavaScript 警告:"message"单击 OK 按钮
JavaScript 提示JavaScript 提示:"message"单击 Cancel 按钮
JavaScript 确认JavaScript 确认:"message"单击 Cancel 按钮

如果希望 SOAtest 以不同方式处理这些信息,您可以使用脚本定义自定义行为。有关更多详情,请查阅 Customizing Scanning with Scripting Hooks

对表单进行填充

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

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

若要指明您不希望输入任何表单的信息:

若要输入某个或所有表单的输入:

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

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

指明不希望输入当前表单的任何其他信息:单击 Skip
指明您不希望输入当前表单或任何该表单的其他实例的任何其他信息:单击 Skip Form
指明您不希望在该站点中输入表单的任何其他信息:单击 Skip All
浏览到与当前表单相关联的页面。单击 View

了解表单输入目的和选项

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

填充表单有两种方法:

完成表单输入面板

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

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

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

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

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

关于加载和站点扫描的 FAQ


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

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

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

注意:Allowed/Restricted URLs 表条目区分大小写。

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

使用星号(*)的例子:

  • 若要匹配任何协议:
    *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

当输入Start URL 时,允许域 URL 将自动添加到 Allowed/Restricted URLs 表中。

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

例如:

  • 如果希望启用扫描 URL http://www.dev.parasoft.com/index.html
    • 将 tp://www.dev.parasoft.com/index.html 输入到 Start URL 字段。这个允许 URL 将自动添加到 Allowed/Restricted URLs 表中:+  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 之后, Allowed/Restricted URLs 表应包含以下内容:

  • +  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 

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

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

使用 http(s)://... ,以便指定 URL 的 http 和 https 都被允许或都被限制。

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

 根据 Allowed/Restricted URLs 表检查重定向,以确定是否遵循它们。

URL 自动添加到 Allowed/Restricted URLs 表有两种情况:

  • 如果 Start URL 是重定向(请查阅 我的 Start URL 是重定向。My Start URL is a redirect将会怎么样?),URL 自动添加到表中。
  • 如果选中了表选项中未指定为限制的遵循重定向,则会自动将 URL 添加到表中。当选中此选项时,如果 SOAtest 在扫描期间遇到了重定向,并且该重定向未在 Allowed/Restricted URLs 表中指定,则它将被加载。SOAtest 还将为重定向到 Allowed/Restricted URLs 表自动添加一个受允许的 URL。

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

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

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

可以将用于包含注销事件的页面的 URL 限制添加到 Allowed/Restricted URLs 表中。例如,如果注销页面是 http://www.parasoft.com/logout.html ,则您可以添加其作为受限制的 URL,以使得不可对其进行加载。

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

有关更多详情,请查阅 填充表格 

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

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

使用脚本挂钩(Hooks)自定义扫描

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

了解挂钩概念

自定义的 hooks 可用来记录或更改扫描工具执行(例如,警示对话框打开时、提示用户进行响应时、提示用户输入密码时等)过程中特定点上传递的值。

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

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

您可以以在 SOAtest中创建、应用和调用其他脚本相同的方式创建、应用和调用脚本:在启动时(只针对 JavaScript 和 Jython 脚本),通过创建和应用扩展工具,通过向特定路径节点添加脚本来定义挂钩。您可以在不同的时间调用挂钩以引出所需的功能。例如,如果想要将脚本的挂钩功能应用于所有项目和网址,则可以将定义并使用该挂钩的 JavaSCript 或 Jython 脚本添加到 <soatest_install_dir>/plugins/com.parasoft.xtest.libs.web_<soatest_version>/root/startup directory目录;然后,任何调用该挂钩的时候,都将执行相关联的用户指定方法。将会一直执行该方法,直到调用该挂钩上的 clear()。

有关常用挂钩选项的完整说明,请查阅 SOAtest 扩展 API。选择 Parasoft> 帮助,然后查询标题为 "Parasoft SOAtest Extensibility API” 的书。

了解可用挂钩

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

警告

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

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

该挂钩通常用来将警告信息结果打印到特定的 SOAtest 消息窗口。例如,如果希望 SOAtest 在 SOAtest 消息窗口(名称为 Alert Messages)中打印所有警告消息,则可以创建以下 Jython 脚本并将其添加到  <soatest_install_dir>/plugins/com.parasoft.xtest.libs.web_<soatest_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() 方法时,其默认的行为是单击 Cancel 按钮,返回 false,然后打印 JavaScript Confirm:"message” 到 SOAtest 控制台视图中。当 SOAtest 遇到 JavaScript prompt() 方法时,其默认的行为是单击 Cancel 按钮,返回 null,然后打印 JavaScript Prompt:"message” 到控制台视图中。可以通过使用脚本更改这些行为来定义并自定义 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)

接着,将该文件添加到 <soatest_install_dir>/plugins/com.parasoft.xtest.libs.web_<soatest_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 返回提示“Enter a URL”的 http://www.parasoft.com ,但返回的却是提示“Enter your name” 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。

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

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

例如,如果希望 SOAtest 将每个访问的 URL 打印到控制台视图中,则可以创建以下 Jython 脚本并将其添加到 <soatest_install_dir>/plugins/com.parasoft.xtest.libs.web_<soatest_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()