本主题介绍如何提示 SOAtest 扫描 web 应用程序。然后可以对访问的页面执行静态分析,如执行静态分析中所述。
章节目录:
对扫描进行配置
扫描测试是执行测试用例时抓取指定 web UI 的测试。若要配置 SOAtest 扫描 web UI,则如下添加扫描测试:
- 请执行以下任一操作:
- 在新的 .tst 文件中添加“扫描测试”:右键点击想将要添加 .tst 文件的项目节点并选择新建测试( .tst)文件。为新的 .tst 文件输入名称,点击下一步,然后选择 Web> 扫描 web 应用程序。
- 在现有项目中添加“扫描测试”:选择要添加新测试的测试套件节点,并点击工具栏中的添加测试或输出。
在打开的“添加测试”向导中,选择左侧的标准测试,然后选择右侧的扫描工具,点击完成。
- 指定是否要从 HTTP、FTP 或本地源进行扫描。
如果选择 FTP 或本地,请填写可用字段,然后才能完成配置。可以跳过以下选项。
- 如果选择 HTTP,则按照下面的详细步骤继续指定设置。
- 点击 HTTP 工具设置的要求基本设置选项卡,并完成以下内容:
- 开始 URL:在字段中指定 URL 或 .urls 文件。
如果一个 URL 的用户名和密码都输入为 '*',那么 SOAtest 将首先尝试使用紧靠该 URL 之前、属于相同域的最近的 URL 所使用的相同凭据进行登录。如果该凭据没有用于此 URL,则 SOAtest 将打开域密码对话框,要求您输入正确的凭据。
- 限定加载深度:如果不想要 SOAtest 尝试加载整个站点,使用此控件限制加载深度。深度设置决定加载站点点击深度(链接)的数量。加载深度为 0 意味着只加载初始页面。如果希望只测试站点中所选定路径,或者如果希望 SOAtest 根据日志文件项中记录的通讯报文自动构建站点结构和路径,那么该选项尤其有用。
- 限制扫描到开始 URL 的最底层子文件夹:如果希望 SOAtest 只加载最初开始 URL 的子文件夹,请选择此选项。更多详情,请参阅限制扫描到开始 URL 的最底层子文件夹 。
- 遵循表中未指定为限制的重定向:如果希望 SOAtest 遵循重定向未指定为允许 URL 的站点,请选择此选项。有关重定向处理的详情,请参阅 Understanding and Configuring Redirect Handling。
- 允许/限制 URL:如果访问某些页面(例如,日志输出页面)可能防止 SOAtest 正确地和/或完整地加载站点,通过在表中将它们标记为受限制的 URL 来提示 SOAtest 避免这些页面;有关详细说明,请参阅Preparing SOAtest to Load Sites that Use JavaScript。
- 表单选项:可选择以下选项:
- 使用默认输入扫描表单:默认关闭。
- 手动填充活动的输入:默认开启。
- 开始 URL:在字段中指定 URL 或 .urls 文件。
- 如果想要输入连接密码,则选择域密码选项卡并点击添加来指定密码。
- 如果想要指定高级扫描选项,则选择高级设置选项卡,然后完成以下内容:
- 默认页:* (这是默认的设置)
- 遵守 Robot 规范:关闭(前提条件是站点的 Wedmaster 授权您忽略 robot 规范)
- 传递 Cookies:开启
- 启动所有参数的 CGI:开启
- 不区分大小写服务器:取决于您的服务器
- 别名:取决于您的站点。如果您的站点使用别名,则通过点击添加在此处进行输入。别名是希望 SOAtest 考虑的一个域,相当于项目中其中一个站点的域。例如,
http://www.parasoft.com
可能拥有别名parasoft.com
和www.parasoft.com
。
- 点击保存。
现在可以在测试套件或单个扫描工具上运行任何可用的测试配置。执行测试时,SOAtest 会快速浏览静态和动态页面,并至少加载它遇到的每个页面的一个实例。
如果选择了推荐的 HTTP 配置选项,并且您的站点包含表格,则 SOAtest 允许您使用表单输入对话框填充表单。如果在 SOAtest 加载您的站点时打开表单输入对话框,则请按照Populating Forms中所述将其完成。
对特殊加载问题进行处理
本节介绍如何处理以下特殊的加载问题:
- 准备 SOAtest 在扫描期间限制和/或允许 URL
- Preparing SOAtest to Load Sites that Use JavaScript
- Populating Forms
- Managing Authentication During Loading
准备 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 表中:
- 点击添加。将添加新的一行到允许的/限定的 URL 表中。
- 在新添加行的文本字段中,输入想要限制或允许的 URL。
- 通配符星号(*)可以在 URL 中的任何位置使用,以匹配 0 个或更多字符。“
*
”意味着任何字符组合。它适用于构造允许/限制 URL 表条目的任何组合方式。有关示例,请参阅通配符示例 。 - 如果 URL 以斜杠‘/’结尾,则在比较之前删除斜杠。
- 通配符星号(*)可以在 URL 中的任何位置使用,以匹配 0 个或更多字符。“
- 如果需要,可切换 +/- 符号以指明允许或是限制指定的 URL。
- + 号用于标记允许的 URL。
- - 号用于标记限制的 URL。
注意“不允许的”JavaScript 和 CSS 文件
与允许的 URL 模式不匹配的 JavaScript 和 CSS 文件将不会在项目树中显示。然而,如果 SOAtest 需要访问这些文件来正确处理 Web 页面,则它将访问这些文件(即使它们不会被添加到该项目中)。
若要更改允许的/限定的 URL 表条目的位置,请选择要移动的条目,点击紧挨着允许的/限定的 URL 表的向上和向下箭头按钮,直到条目处于所需位置。
如需删除允许的/限定的 URL 表项,请选择要删除的表项并点击删除。
URL 限制示例
下面的例子解释了关于 http(s)://... 限制的一些细节:
- 默认的 http(s)://... 限制允许 URL 匹配 http:// 或 https://。例如,使用默认的限制:
http(s)://www.google.com/*
可匹配http://www.google.com/amazing_page.html
和https://www.google.com/amazing_page.html
- 字符串“
http(s)://
”在 URL 限制中除了在开头外没有意义。例如,不可能有以下的限制:http(s)://www.google.com/*
,并让其匹配http://www.google.com/amazing_page.html
字符串“http(s)://
”区分大小写。因此,不可能有:HTTP(S)://www.google.com/*
,并让其匹配http://www.google.com/amazing_page.html
- 特殊字符是“
http(s)://
”,而不是字符串的其他部分。例如,不可能有以下的限制:http://www.para(s)oft.com/*
,并让其匹配http://www.parasoft.com/*
或http://www.paraoft.com/*
通配符示例
下表显示了如何使用通配符来实现不同的目标:
若要匹配这个... | 使用类似这样的条目... |
---|---|
任何协议 | *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.com
和 articles.parasoft.com
。
*Parasoft*
将匹配 www.parasoft.com
、www.parasoft.net
、parasoft.com 等。
direc*ry/*
将匹配 directory/dir2
、direcHELLOry/dir2/dir3
和 direc12345fry/images
。
了解 SOAtest 启发式扫描
项目扫描和更新期间,每个可能的 URL 都与允许的/限定的 URL 表匹配,以确定是否应该访问 URL。确定 URL 是否应该访问的过程如下:
- 在允许的/限定的 URL 表中找到最后一个匹配的 URL。
- 如果最后一个匹配的 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
目录中的两个文件夹 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 扫描选项时,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 并加载相关链接。
若要验证该选项是否启用:
- 前往 Parasoft > 首选项。
- 选择 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 Alert | JavaScript Alert: “消息” | 点击确认按钮 |
JavaScript Prompt | JavaScript Prompt: “消息” | 点击取消按钮 |
JavaScript Confirm | JavaScript Confirm: “消息” | 点击取消按钮 |
如果希望 SOAtest 以不同方式处理这些信息,您可以使用脚本定义自定义行为。详情请参阅使用脚本挂钩自定义扫描。
对表单进行填充
如果选择了手动填充活动的输入 HTTP 配置面板复选框(默认启用),则 SOAtest 会在每次检测要求用户输入的表单打开一个表单输入对话框。如果希望 SOAtest 分析表单提交后返回的页面,则需要告诉 SOAtest 如何填充表单不同的输入元素(文本字段、复选框、单选框等)。可以通过在加载过程中在这些对话框中指定固定输入来实现这一点。
不需要为每个表单添加测试输入。我们推荐您只添加需要访问站点所有主要区域的输入;可以根据需求跳过对话框。而且,如果 SOAtest 可以在不需要提交特定表单输入时访问所有站点区域,则不需要在加载过程中输入任何表单输入。
如果不想添加任何表格的输入信息,请点击第一个对话框中的忽略所有。
如果要为部分或所有表格添加输入,请利用下表确定针对每个打开的对话框应采取的操作。
目的... | 操作... |
---|---|
标记输入提交。 | 在表单测试名称字段中输入新名称。 |
输入当前表的信息。 |
添加输入后,SOAtest 会重新打开相同的表单对话框,以便可以输入其他的信息。 |
指明您不希望输入当前表单的任何其他信息。 | 点击忽略。 |
指明您不希望输入当前表单或任何该表单的其他实例的任何其他信息。 | 点击忽略表单。 |
指明您不希望在该站点中输入表单的任何其他信息。 | 点击忽略所有。 |
浏览到与当前表单相关联的页面。 | 点击查看。 |
了解表单输入目的和选项
如果您的站点使用表单,并且您希望 SOAtest 加载并测试这些表单提交后返回的页面,则需要告诉 SOAtest 如何填充表单不同的输入元素(文本字段、复选框、单选按钮等)。要测试的页面实例越多,则需要填充表单的信息就越多。
填充表单有两种方法:
- 通过输入将在每次 SOAtest 遇到相关表单时使用的固定值。(我们将引用这些作为固定输入)。
- 通过配置 SOAtest 使用默认的输入(如代码中所指定)。(我们将引用这些作为默认输入)。
- 通过配置 SOAtest 从表单出现的页面中提取值。例如,如果正确的表单是由 JavaScript 动态设置的。(我们将引用这些作为提取输入)。
- 通过完全禁用输入。
- 通过配置 SOAtest 来使用自定义方法的返回值。(我们将引用这些作为脚本输入)。
完成表单输入面板
若要添加或更改 SOAtest 打开的表单输入面板中的固定输入:
- (可选项)更改表单测试名称字段中的输入标签名。
- (可选项)更改表单动作字段中的表单动作。
- 如果希望使用默认的表单操作(如代码中所指定),则启用默认。注意,如果默认值更改,SOAtest 将会自动更新表单操作;您将不需要手动更新表单测试。
- 如果希望指定固定值,则启用固定值,然后在文本字段中指定需要的表单操作。
- 使用表单输入控件来为每个表单输入元素添加或更改输入。
- 如果希望使用默认输入(如代码中所指定),则启用默认。注意,如果默认值更改,SOAtest 将会自动更新表单测试值;您将不需要手动更新表单测试。
- 如果希望指定固定值,则启用固定值,然后使用可用的控件指定需要的值。
- 复选框、单选框和选择输入有一个用户自定义选项,它允许指定字符串作为该输入的值发送。
- 单选按钮和选择输入还有一个索引选项,它允许指定单选按钮或选择选项的索引。如果指定了一个索引,则无论该选项进行了怎样的更改,都将发送单选按钮或选项的值。索引从 0 开始。例如,如果希望一直选择第二个选项,则您可以选择索引选项并选择所以“1”。对于单选按钮,每个索引都显示该索引处单选按钮的当前值。对于选择输入,选项的当前显示值与每个索引一起显示。
- 选择输入存储显示值,该值用于选择,而不是发送给服务器。因此,当提交值更改时,您将不需要更改测试。
- 如果希望 SOAtest 从表单出现的页面上提取表单输入值。例如,如果正确的表单值是通过 JavaScript 动态设置的,选择提取的,使用经常出现在要提取的值左侧的文本字符串填充左侧文本字段,然后使用通常出现在希望提取的值右侧的文本字符串填充右侧文本字段。例如,若要从文本
pre123post
中提取值123
,则可以在左侧文本字段中输入pre
,在右侧文本中输入post
。 - 如果希望禁用一个启用的输入,则选择禁用。如果希望启用一个禁用的输入,则选择启用。
- 如果希望使用自定义方法的返回值,则启用脚本。点击编辑来创建或编辑方法,然后选择需要的方法以便在弹出对话框的方法下拉菜单中使用。如果存在两个或多个方法,您还可以选择不同的方法,以便在表单面板中下拉菜单中使用。
- (如果表单有一个 OnSubmit 处理程序)根据是否希望在测试期间使用处理程序来启用或禁用提交表单时处理 OnSubmit 句柄。
- 如果表单有一个 OnSubmit 处理程序,则该选项默认设置为 true。除非该表单测试在使用浏览器记录路径时已经创建。在这种情况下,它被设置为 false,因为在 SOAtest 记录仪浏览器中的路径时,SOAtest 会以这样的方式来配置表单测试,该方式为 OnSubmit 不需要被处理(并且,事实上,以这种方式处理这个处理程可能会导致路径执行期间发生问题)。
- (可选项)更改默认的表单提交方法。
- 如果希望模拟一个简单的 JavaScript 提交,或者是模拟用户通过按 Enter 键提交表单,则启用隐含提交。
- 如果希望模拟用户通过点击提交按钮进行表单提交,可以选择代表提交按钮(例如,Image: "Anonymous”)的选项,也可以点击提交图像特定区域(如果在表单输入面板中可用)。
对加载期间的身份验证进行管理
如果 SOAtest 访问了需要身份验证的页面,则将打开一个密码对话框,需要您输入有效用户名和密码。
在合适的字段中输入有效的用户名和密码,请指定是否希望 SOAtest 在该项目文件中保存密保,然后点击 OK。
关于加载和站点扫描的常见问题
使用脚本挂钩自定义扫描
可以通过在 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 消息窗口中。然后,实现测试套件,该套件检查使用以下测试用例检查消息窗口的内容:
- 清除消息窗口的扩展工具。
- 执行应该引起警告消息的点击路径的测试路径工具。
- 带有脚本的扩展工具(如下所示)返回消息窗口的文本,带有附加回归控制的扩展工具验证在消息窗口出现的警告消息是否正确。
#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 将打印以下消息(取决于确认操作)到脚本中指定的位置或控制台视图中(如果没有指定替换的位置):
根据脚本,SOAtest 点击了“OK”按钮
根据脚本,SOAtest 点击了“CANCEL”按钮
提示
通过自定义 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 将打印以下消息之一(取决于提示响应)到脚本中指定的位置或控制台视图中(如果没有指定替换的位置):
根据脚本,SOAtest 输入了 "[message- string that the script returns]"
根据脚本,SOAtest 点击了“CANCEL”按钮
返回不同情况下的不同值
可以通过将合适的逻辑添加到为 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 挂钩:
- SOAtesr 发起服务端请求。
- 服务器响应一个挑战,要求输入域密码或 NTLM 密码(两者 SOAtest 都是以相同方式处理)。
- 尚未输入域密码或 NTLM 密码。
如果在满足上述条件之前定义了自定义 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()