本主题解释了如何提示 SOAtest 扫描 web 应用程序。然后可以对访问的页面执行静态分析,如 执行静态分析中所述。
本章节包括:
对扫描进行配置
扫描测试是执行测试用例时抓取指定 web UI 的测试。若要配置 SOAtest 扫描 web UI,则如下添加扫描测试:
- 请进行下列其中一项操作:
- 若要添加 "Scanning Test” 到新的 .tst 文件:右键单击想将要添加 .tst 文件的项目节点,然后选择 New Test ( .tst) file。为新的 .tst 文件输入名称,单击 Next,然后选择 Web> Scan web application。
- 若要添加 "Scanning Test” 到现有项目:选择要添加新测试的测试套件节点,并单击 Add Test 或 Output.
在打开的 Add Test 向导中,选择左侧的 Standard Test ,右侧的 Scanning Tool ,然后单击 Finish。
- 指定是否要从 HTTP、FTP 或本地源进行扫描。
如果选择 FTP 或 Local,请填写可用字段,然后才能完成配置。可以跳过以下选项:
- 如果选择 HTTP,则按照下面的详细步骤继续指定设置。
- 选择 HTTP Tool Settings 的 Required Basic Settings 选项卡,并完成以下内容:
- Start URL:在字段中指定 URL 或 .urls 文件。
如果 URL 的用户名和密码作为‘*’输入,则 SOAtest 将首先尝试使用最近 URL 的相同凭证,最近 URL 与此 URL 前面并属于同一个域的。如果该凭证没有用于此 URL,则 SOAtest 将打开域密码对话框,询问您输入的凭证是否正确?
- Limit loading depth:如果不想要 SOAtest 尝试加载整个站点,使用此控件限制加载深度。深度设置决定加载站点点击深度(链接)的数量。加载深度为 0 意味着只加载初始页面。如果希望只测试站点中所选定路径,或者如果希望 SOAtest 根据日志文件项中记录的流量自动构建站点结构和路径,那么该选项尤其有用。
- Restrict scanning to deepest subdirectory of start URL:如果希望 SOAtest 只加载初始启动 URL 的子目录,请选择此选项。有关更多详情,请查阅 限制扫描到Start URL 的最深子目录 。
- Follow redirects not specified as restrictions in the table: 如果希望 SOAtest 遵循重定向未指定为允许 URL 的站点,请选择此选项。有关重定向处理的更多详情,请查阅 Understanding and Configuring Redirect Handling。
- Allowable/Restricted URLs: 如果访问某些页面(例如,日志输出页面)可能防止 SOAtest 正确地和/或完整地加载站点,通过在表中将它们标记为受限制的 URL 来提示 SOAtest 避免这些页面;有关详细说明,请查阅 Preparing SOAtest to Load Sites that Use JavaScript 。
- Form Options:可使用以下选项:
- Scan Forms With Default Input:默认关闭
- Fill Active Inputs Manually:默认开启
- Start URL:在字段中指定 URL 或 .urls 文件。
- 如果想要输入连接密码,则选择 Realm Passwords 选项卡并单击 Add 来指定密码。
- 如果想要指定高级扫描选项,则选择 Advanced Settings 选项卡,然后完成以下内容:
- Default Pages:* (这是默认的设置)
- Obey Robot Restrictions:关闭(前提条件是站点的 Wedmaster 授权您忽略机器人限制)
- Pass Cookies:开启
- Invoke CGI For All Arguments:开启
- Case Insensitive Server:取决于您的服务器
- Aliases:取决于您的站点。如果您的站点使用别名,则通过单击 Add 按钮在此书进行输入。Alias 是希望 SOAtest 要考虑的一个域,相当于项目中其中一个站点的域。例如,
http://www.parasoft.com
可能拥有别名parasoft.com
和www.parasoft.com
。
- 单击 Save。
现在可以在测试套件或单个扫描工具上运行任何可用的测试配置。执行测试时,SOAtest 会快速浏览静态和动态页面,并至少加载它遇到的每个页面的一个实例。
如果选择了推荐的 HTTP 配置选项,并且您的站点包含表格,则 SOAtest 允许您使用表单输入对话框填充表单。如果在 SOAtest 加载您的站点时打开表单输入对话框,则请按照 Populating Forms中所述将其完成。
对特殊加载问题进行处理
本章节解释了如何处理以下特殊的加载问题:
- 准备 SOAtest 在扫描期间限制和/或允许 URL
- Preparing SOAtest to Load Sites that Use JavaScript
- Populating Forms
- Managing Authentication During Loading
准备 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 表中:
- 单击 Add。将添加新的一行到 Allowed/Restricted URLs 表中。
- 在新添加行的文本字段中,输入想要限制或允许的 URL。
- 通配符星号(*)可以在 URL 中的任何位置使用,以匹配 0 个或更多字符。“
*
” 意味着任何字符组合。它适用于构造 Allowed/Restricted URLs 表条目的任何组合方式。有关示例,请查阅 Wildcard Examples 。 - 如果 URL 以斜杠‘/’结尾,则在比较之前删除斜杠。
- 通配符星号(*)可以在 URL 中的任何位置使用,以匹配 0 个或更多字符。“
- 如果需要,可切换 +/- 符号以指明应该允许指定的 URL,还是限制它。
- + 号用于标记受允许的 URL。
- - 号用于标记受限制的 URL。
注意“不受允许的”JavaScript 和 CSS 文件
不匹配受允许 URL 模式的 JavaScript 和 CSS 文件将不会在项目树中显示。然而,如果 SOAtest 需要访问这些文件来正确处理 Web 页面,则它将访问这些文件(即使它们不会被添加到该项目中)。
若要更改 Allowed/Restricted URLs 表条目的位置:
- 选择要删除的条目,单击紧挨着 Allowed/Restricted URLs 表的向上和向下箭头按钮,直到条目处于需要的位置。
若要删除 Allowed/Restricted URLs 表条目:
- 选择要删除的条目,单击 Remove。
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 都与 Allowed/Restricted URLs 表匹配,以确定是否应该访问 URL。确定 URL 是否应该访问的过程如下:
- 在 Allowed/Restricted URLs 表中找到最后一个匹配的 URL。
- 如果最后一个匹配的 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
目录中的两个文件夹 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/*
这就是完成操作后表格的样子。
限制扫描到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 并加载相关链接、
若要验证该选项是否启用:
- 选择 Parasoft> Preferences。
- 选择 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 可以在不需要提交特定表单输入时访问所有站点区域,则不需要在加载过程中输入任何表单输入。
若要指明您不希望输入任何表单的信息:
- 在第一个对话框中单击 Skip All 。
若要输入某个或所有表单的输入:
- 使用下表来确定每个打开的对话框要执行哪些操作。
为此... | 执行该操作... |
---|---|
标记输入提交。 | 在 Form Test Name 字段中输入新名称。 |
输入当前表的信息。 |
添加输入后,SOAtest 会重新打开相同的表单对话框,以便可以输入其他的信息。 |
指明不希望输入当前表单的任何其他信息: | 单击 Skip。 |
指明您不希望输入当前表单或任何该表单的其他实例的任何其他信息: | 单击 Skip Form。 |
指明您不希望在该站点中输入表单的任何其他信息: | 单击 Skip All。 |
浏览到与当前表单相关联的页面。 | 单击 View。 |
了解表单输入目的和选项
如果您的站点使用表单,并且您希望 SOAtest 加载并测试这些表单提交后返回的页面,则需要告诉 SOAtest 如何填充表单不同的输入元素(文本字段、多选框、单选框等)。要测试的页面实例越多,则需要填充表单的信息就越多。
填充表单有两种方法:
- 通过输入将在每次 SOAtest 遇到相关表单时使用的固定值。(我们将引用这些作为 fixed inputs)。
- 通过配置 SOAtest 使用默认的输入(如代码中所指定)。(我们将引用这些作为 default inputs)。
- 通过配置 SOAtest 从表单出现的页面中提取值。例如,如果正确的表单是由 JavaScript 动态设置的。(我们将引用这些作为 extracted inputs)。
- 通过完全禁用输入。
- 通过配置 SOAtest 来使用自定义方法的返回值。(我们将引用这些作为 script inputs)。
完成表单输入面板
若要添加或更改 SOAtest 打开的表单输入面板中的固定输入:
- (可选项)更改 Form Test Name 字段中的输入标签名。
- (可选项)更改 Form Action 字段中的表单操作。
- 如果希望使用默认的表单操作(如代码中所指定),则选择 Default 选项。注意,如果默认值更改,SOAtest 将会自动更新表单操作;您将不需要手动更新表单测试。
- 如果您希望指定固定值,请选择 Fixed 选项,然后在文本字段中指定需要的表单操作。
- 使用表单输入控件来为每个表单输入元素添加或更改输入。
- 如果希望使用默认输入(如代码中所指定),则选择 Default 选项。注意,如果默认值更改,SOAtest 将会自动更新表单测试值;您将不需要手动更新表单测试。
- 如果您希望指定固定值,请选择 Fixed 选项,然后使用可用的控件指定需要的值。
- 多选框、单选框和选择输入有一个 User-Defined 选项,它允许指定字符串作为该输入的值发送。
- 单选按钮和选择输入还有一个 Index 选项,它允许指定单选按钮或选择选项的索引。如果指定了一个索引,则无论该选项进行了怎样的更改,都将发送单选按钮或选项的值。索引从 0 开始。例如,如果希望一直选择第二个选项,则您可以选择索引选项并选择所以“1”。对于单选按钮,每个索引都显示该索引处单选按钮的当前值。对于选择输入,选项的当前显示值与每个索引一起显示。
- 选择输入存储显示值,该值用于选择,而不是发送给服务器。因此,当提交值更改时,您将不需要更改测试。
- 如果希望 SOAtest 从表单出现的页面上提取表单输入值。例如,如果正确的表单值是通过 JavaScript 动态设置的,选择 Extracted,使用经常出现在要提取的值左侧的文本字符串填充 Left-hand text 字段,然后使用通常出现在希望提取的值右侧的文本字符串填充 Right-hand text 字段。例如,若要从文本
pre123post
中提取值123
,则可以在 左侧的 text 字段中输入 pre,在 右侧的 text 输入post
。 - 如果希望禁用一个启用的输入,请选择 Disable 选项。如果希望启用一个禁用的输入,请选择 Enable 选项。
- 如果希望使用自定义方法的返回值,请选择 Script 选项。单击 Edit 按钮来创建或编辑方法,然后选择需要的方法以便在弹出对话框的 Method 下拉菜单中使用。如果存在两个或多个方法,您还可以选择不同的方法,以便在表单面板中下拉菜单中使用。
- (如果表单有一个 OnSubmit 处理程序)根据是否希望在测试期间使用处理程序来启用或禁用 Process OnSubmit Handler When Submitting Form 选项。
- 如果表单有个一 OnSubmit 处理程序,则该选项默认设置为 true。除非该表单测试在使用浏览器记录路径时已经创建。在这种情况下,它被设置为 false,因为在 SOAtest 记录仪浏览器中的路径时,SOAtest 会以这样的方式来配置表单测试,该方式为 OnSubmit 不需要被处理(并且,事实上,以这种方式处理这个处理程可能会导致路径执行期间发生问题)
- (可选项)更改默认的表单提交方法。
- 如果希望模拟一个简单的 JavaScript 提交,或者是模拟用户通过按 Enter 键提交表单,则选择 Implied Submit 选项。
- 如果希望模拟用户通过单击提交按钮进行表单提交,可以选择代表提交按钮(例如,Image: "Anonymous”)的选项,也可以点击提交图像特定区域(如果在表单输入面板中可用)。
对加载期间的身份验证进行管理
如果 SOAtest 访问了需要身份验证的页面,则将打开一个密码对话框,需要您输入有效用户名和密码。
在合适的字段中输入有效的用户名和密码,请指定是否希望 SOAtest 在该项目文件中保存密保,然后单击 OK。
关于加载和站点扫描的 FAQ
使用脚本挂钩(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 消息窗口中。然后,实现测试套件,该套件检查使用以下测试用例检查消息窗口的内容。
- 清除消息窗口的扩展工具。
- 执行应该引起警告消息的点击路径的测试路径工具。
- 带有脚本的扩展工具(如下所示)返回消息窗口的文本,带有附加回归控制的扩展工具验证在消息窗口出现的警告消息是否正确。
#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 将打印以下消息(取决于确认操作)到脚本中指定的位置或控制台视图中(如果没有指定替换的位置):
根据脚本,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 返回提示“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 挂钩:
- 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。
附加到该挂钩的方法接收 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()