本主题介绍如何提取值,如此便可在另一个场景步骤或工具中使用(对它进行验证或存储)
章节目录:

了解提取物和验证

在浏览器内容查看器工具中,这将自动添加到浏览器记录的每个场景步骤中,您可以点击呈现视图中的页面元素并自动在这些元素上设置功能测试。如果在随后的回放中验证不满足,则关联的场景步骤将失败。

此外,可以“提取”并存储这些元素中的数据,然后在其他工具中使用这些提取的值(比如,填充表单字段或验证数据)。这允许轻松地设置动态数据验证非常重要的场景。提取的数据可以用于 Web 测试和 service/API 测试。

也可以录制路径的同时从 Web 浏览器中提取 path 元素。要做到这一点,右键点击浏览器中的元素并选择配置验证。将打开一个验证选项对话框。此对话框中的选项将与在录制和回放路径至少一次之后出现的浏览器内容查看器工具中的选项相同。

验证或存储值

若要验证或存储呈现页面中表现的值,请完成浏览器内容查看器工具配置面板(可以通过双击工具节点进行访问)或操作后浏览器内容选项卡中的以下内容(仅针对提取物):

  1. 右键点击要验证或存储值的页面元素(比如,右键点击链接),然后选择从 <element> 元素提取值...
  2. 在打开的向导中,请确保选中了属性名框中的所需属性。
  3. 如果希望“放大”要提取的值,请完成隔离部分值向导页面。如果希望验证或存储完整字符串,则可以忽略这点。
    • 有时,您可能只想验证或向数据源发送部分属性值。  如果是这种情况,可以启用使用文本边界隔离局部值来隔离要使用的部分属性值。然后输入左侧右侧文本,以作为输入值的边界值。预览窗格将基于输入的边界值向您显示要使用的值。例如,假设属性值为“Click here to log in”:
      • 若要隔离值“Click”,请保留左侧边界空白并在右侧边界中输入“ here”(包括空格)。
      • 若要隔离值“here”,请在左侧边界中输入“Click ”,在右侧边界中输入“to”(包括空格)。
      • 若要隔离值“in”,请输入“log ”(包括空格)作为左侧边界,并保留右侧边界为空白。
  4. 若要验证值:
    1. 选择验证该值
    2. 从下面预期值选项中进行选择:
      • equals: 验证属性值是否完全匹配预期值。
      • does not equal: 验证属性值是否不匹配特定值。
      • contains: 验证属性值是否包含预期值。
      • starts with: 验证属性值是否以预期值开始。
      • ends with: 验证属性值是否以预期值结尾。
      • is less than: 验证属性值是否小于特定值。
      • is greater than: 验证属性值是否大于特定值。
      • is not present: 验证特定属性是否没有出现在页面上,如果是将报告一个错误。对于 web 应用程序显示不应该显示的错误消息,此选项非常有用。
      • matches color: 验证颜色值是否对应于验证颜色映射文件中指定的颜色名称。详情请参阅验证 Color 元素
    3. 选择固定值、参数化脚本化,然后指定一个值。
      • 如果选择了脚本化选项,则可以从该数据源中指定列名。当回放场景时,预期值将从数据源中的合适行和列中获取。列名只会显示一个数据源,所以如果项目中存在多个数据源,则需要进入链接的浏览器验证工具,然后修改面板顶部使用的数据源。如果因为其他提取的列名是从不同的 HTML 页面中提取的,所以可用,则即使项目没有定义数据源,它们也将出现在可用列名列表中。
  5. 若要将所选定属性的值发送到数据源中(如此便可后续在另一个场景或另一个工具中使用该值):
    1. 选择提取值到数据库
    2. 指定哪个数据源列包含提取的值。
      自定义列名:告诉 SOAtest 存储值的数据源列名。除非指定了其他位置,否则值存储在内部数据源中(例如,如果选择可写数据源列变量)。这是您将在其他地方引用该值时使用的名称。例如,如果该值存储在名为我的值的数据源列中,则应选择我的值作为参数化值。也可以引用其作为字面量相应视图或多响应视图中的 ${My Value}

      可写数据源列:告诉 SOAtest 将值存储在可编写的数据源列中(详情请参阅配置可写数据源)。这允许存储数组形式的值。然后其他工具对存储的值进行遍历。

      写入所有匹配的列:告诉 SOAtest 将值存储在所有列名中包含给定字符串的列中。当提取消息中的多个值时,每个值都将跨匹配的所有列写入。相反,如果选择一个可写数据源列(上面的选项),那么值将跨多行写入列。

      变量:告诉 SOAtest 将值保存在特定值中,以便它可以在跨当前测试套件中重复使用。变量必须已经被添加到当前测试套件中,如定义变量中所述。以这种方式设置的任何值都将覆盖测试套件属性面板中指定的任何局部变量值。

      当执行场景步骤时,属性值将从页面提取,并被放置入指定名称列中的临时数据源。  当场景后部分引用列名时,存储在临时数据源中的值将用于这些场景步骤。如果需要,可以同时验证并发送属性值到数据源中。
  6. 点击完成

该值在执行场景时进行验证或存储。

如果没有看到要验证或提取的值怎么办? 

如果浏览器内容查看器工具没有显示要提取或验证的值,例如,因为关联的场景步骤失败或者因为项目在呈现页面中不可见(例如,一个标题),则可以按照添加测试输出所述手动添加一个浏览器验证工具或浏览器数据库工具。 

需要处理动态属性值?

处理动态属性值的一个方法是使用部分字符串 XPath。若要使用 XPath,请确保将浏览器验证工具的元素定位器设置为使用 XPath,然后指定合适的 XPath。有关使用 Xpath 的详情,请参阅 XPath 参考资料有关使用部分字符串 Xpath 的详情,请参阅支持动态属性值:使用 XPath 匹配部分字符串

想要以字符串的形式访问 HTML 内容吗?

可以使用 input.getHTML() 检索浏览器窗口或区域的 HTML。请参阅 com.parasoft.api.BrowserContentsInput 的 Javadoc。可以通过选择 Parasoft> 帮助帮助 > 帮助内容(取决于您的安装程序),然后找到标题为“Parasoft SOAtest Extensibility API”的手册访问 Javadocs。

例如,下面是搜索 RFC 标题的 JavaScript。

// input: com.parasoft.api.BrowserContentsInput. 
// context: com.parasoft.api.ExtensionToolContext. 
function validateRfcText(input, context) {
  var html = input.getHTML();
  var rfc = context.getValue("ds", "rfc");
  // Extract the numeric part of the RFC.
  // From "RFC5280" extract "5280".
  // From search("\\d") returns the index of the first digit in rfc.   
  // See a reference on JavaScript regular expressions.
  // Alternatively hard-code rfc.substring(3),
  var rfcNumber = rfc.substring(rfc.search("\\d"));
  var title = "Request for Comments: " + rfcNumber;
  if (html.indexOf(title) < 0) {
    context.report("HTML does not contain title: " + title);
  }
}

如果配置了验证...

浏览器验证工具将链接到测试。此工具将执行验证。如果后续希望修改验证,则可以通过修改此工具设置实现。 

验证源的元素在浏览器内容查看器和浏览器验证工具的操作后浏览器内容选项卡中将以实心红色边框突出显示。 

如果配置了提取物...

浏览器数据库工具将链接到浏览器回放工具中。此工具将存储提取的值。在任何允许参数化值的地方都可以使用提取的值,比如要在后续测试步骤或另一个工具中输入的值。如果后续希望修改存储的值,则可以通过修改此工具设置实现。

提取源的元素在浏览器内容查看器和浏览器验证工具的操作后浏览器内容选项卡中将以实心灰色边框突出显示。 

如果既配置了验证,也配置了提取物...

浏览器验证工具和浏览器数据库工具将链接到如上所述的测试中。此外,将使用紫色虚线突出显示源元素。

专门化的提取物/验证

验证或提取文本

若要验证页面上出现的文本(或将文本提取到浏览器数据库),请完成以下内容:

  1. 选择要验证或提取的文本。
  2. 右键点击选择项,然后选择其中一项以下内容:
    • 若要配置该文本的验证,选择验证所选文本
    • 若要配置该文本的提取物,选择提取所选文本到数据库
  3. 请确保打开的对话框中出现所需的验证/提取物设置。
  4. 点击完成

验证 color 元素

若要创建验证页面颜色的测试,请完成以下内容:

  1. 右键点击要创建测试的页面元素(比如,右键点击链接),然后选择从 <element> 元素提取值...
  2. 在打开的向导中,请确保选中了属性名框中的 style_color 属性,然后双击下一步
  3. 在验证或存储值向导页面中,从预期值下拉菜单中选择匹配颜色,并在文本字段中输入颜色(例如,“红色”)。匹配颜色选项验证颜色值是否对应于验证颜色映射文件中指定的颜色名称。这些映射可以用十六进制表示,也可以用 RGB 表示 -- rgb(0, 255, 0)。更多信息,请参阅Validation Colors Mapping File
  4. 点击完成

执行测试时,执行颜色验证。

验证颜色映射文件

位于 <INSTALL>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/validation/ 目录中的 validationColors.txt 文件定义了 SOAtest 如何按名称验证颜色。

文件的每一行都按名称定义一种颜色,以及 RGB 颜色模型的每个组件的范围。指定的范围告诉 SOAtest,如果颜色已验证并且在 RGB 颜色模型的每个组件的范围内,则验证的颜色与这些范围内定义的颜色匹配。例如,此文件中的行可能如下所示:

red, b0-ff, 00-30, 00-30

该行定义“红色”的有效范围。范围使用十六进制符号指定。在上列中,红色的有效 R 范围介于十六进制值 b0 和 ff 之间。其中,红色的有效 G 和 B 范围介于十六进制值 00 和 30 之间。换句话说,如果有一个元素的十六进制值为 #c80000,则它将被视为红色,因为 c8 属于 R 值,介于 b0 和 ff 之间,而且 00 属于 G 和 B 值,介于 00 和 30 之间。然而,如果验证设置在希望为红色的元素上,但是元素颜色的十六进制为 #909090,则 SOAtest 将显示元素存在错误颜色的消息。

映射文件中已经定义了一些标准颜色。然而,如果希望指定额外的颜色,则可以简单地修改文件。每行只能定义一种颜色。同时,如果希望修改定义颜色的有效 RGB 范围,也可以修改映射文件。范围可以用连接符(b0-ff,正如前面所描述的)指定,也可以是单个值(ff)。如果它们是单个值,则有效值的范围只包含一个值。如前面所提及到的,范围必须使用十六进制符号。

为了该文件上的更改生效,必须重启 SOAtest。

验证样式属性

若要验证样式属性,请打开浏览器验证工具的配置面板,然后将验证的元素属性设置为值 "style_" + <the JavaScript name of the property>。例如,若要验证 text-decoration 样式元素,则在元素属性字段中指定 style_textDecoration(其中 textDecoration 是指定样式元素 text-decoration 的 JavaScript 方法),并使用预期值控件指定属性所需值。在 text-decoration 情况中,预期值可能等于 line-throughunderline

验证风格列表文件

如果希望在验证向导中将某个风格属性作为可用属性显示,则可以将该风格添加至验证风格列表中。

位于 <INSTALL>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/validation/ 目录中的 validationStylesList.txt 文件指定了可以验证的运行时样式属性。 

该文件格式是每行有一个属性。默认情况下,color 属性在此文件中指定;不过,可以添加要验证的任何验证风格属性。为了该文件上的更改生效,必须重启 SOAtest。一旦重启,在右键点击一个元素时,将在打开的验证对话框中看到该文件中指定的属性。属性将“style_”追加到每个属性后面,以告诉您(和 SOAtest)这些属性引用运行时值单个样式属性。

使用其中一个这些属性的验证设置将验证该样式属性的运行时值。这是在应用了所有内联样式和 CSS 文件中定义的样式之后属性的运行时值。为此,该值可能与元素中内联定义的值不同。例如,这些运行时样式验证允许定义用户在浏览器处理所有样式之后看见的实际颜色。

自定义验证失败时显示的消息

关于每个验证,如果验证失败,SOAtest 将会自动配置要在质量任务视图(和报告)中显示的消息。此消息通常类似于 "Validation failed for property [property_name]: Actual value found on the page [actual value]" must be equal to expected value [expected value]."

您可以轻松地在应用程序上下文中配置更有意义的自定义消息。例如,假设正在使用网上银行应用程序,并且添加一个验证以检查该账户余额是否为零。在这种情况下,您可能希望指定自定义验证消息为 "Account should not be zero" 而不是使用默认的可能为 "//span[text() = "account" was not found" 的内置消息。

若要配置自定义验证:

  1. 打开要配置的浏览器验证工具的配置面板。
  2. 清除使用默认消息选项。
  3. 在文本字段中指定所需消息。可以使用您喜欢的任何文本,也可以使用两个关键字:
    • ${ActualValue} - 将被 HTML 页面上发现的实际值代替。
    • ${ExpectedValue} - 将被预期值(可以是固定的、参数化的或脚本化的)代替。

查看测试执行期间使用的存储变量

可以配置控制台视图(Window> 显示视图> 控制台),显示测试执行期间使用的存储的数据库变量。详情请参阅控制台视图

使用 XPath 配置自定义验证

XPath 可以用于指定复杂的验证。若要使用 XPath,请确保将浏览器验证工具的元素定位器设置为使用 XPath,然后指定合适的 XPath。有关使用 XPath 的详情,请参阅 XPath 参考资料

使用脚本配置自定义验证

如果希望执行 GUI 空不能正确表示的复杂验证,则可以使用脚本来表示它们。为此,将浏览器验证工具的元素定位器更改为使用脚本,然后指定合适脚本。

例如,假设希望验证表中所有行。该表的长度可以是可变的。可以附加一个扩展工具到浏览器功能测试中,并从 input.getDocument() 提供的文档中获取值。下面是实现此目的的示例 JavaScript 脚本。

var Application = Packages.com.parasoft.api.Application;
var WebBrowserTableUtil = Packages.webking.api.browser2.WebBrowserTableUtil; 
var WebKingUtil = Packages.webking.api.WebKingUtil;
// Verify that all values in a table column are equal to a previously 
// extracted value.  For example, we searched for all places in which 
// widget 11 is sold, and we want to make sure that all results are // for widget 11.
// input: com.parasoft.api.BrowserContentsInput.
// context: com.parasoft.api.ExtensionToolContext.
function validateTable(input, context) {
  // For the column we want to validate.   var widgetColumnIndex = 0;
  // We extracted through a Browser Data Bank in a previous test   
  // the expected value to data bank column "widgetName".
  // The value was extracted, not from a data source, so use "" or
  // null (None in Python) as the name of the data source.
  var expectedWidgetName = context.getValue("", "widgetName");
 
  var document = input.getDocument();
  // Table should have some unique identifying attribute (e.g., id).  
 var table = WebBrowserTableUtil.getTable("id", "mytable", document);
  // If the first row of the table contained column headers, we could
  // use getCellValuesForColumn(String, Element).  For example if the
  // widget name column was named "Widget Name", then we could use
  // getCellValuesForColumn("Widget Name", table).  In either case,
  // getCellValuesForColumn returns an array of String objects.  See
  // the JavaDocs for more information.
  var values = WebBrowserTableUtil.getCellValuesForColumn(widgetColumnIndex, table);
 
  if (values.length == 0) {
    context.report("No rows found!");
}
  for (var i = 0; i < values.length; ++i) {
    if (values[i] != expectedWidgetName) {
	 var errorMessage = "Widget name (column " + widgetColumnIndex + "): "
      + "Expected value '" + expectedValue
	  + "', but found '" + values[i] + "'."; 
     context.report(errorMessage);
   }
}
  • No labels