使用 XPath 匹配部分字符串有助于支持动态属性值。
针对大多数定位器,使用等号进行匹配:查找“id”属性为“foo”或文本(可忽略空白字符)为“hello world”的元素。
在某些情况下,你可能只希望匹配属性值或文本内容的一部分。
示例
例如,一些 web 框架经常以“constant_dynamic”的形式生成“id”或“name”属性值,类似“transid_2010”。属性值一般以“transid_”开头,而“2010”是一个动态值,在加载页面时可能就变成了“1984”。
假定常量“transid_”前缀足以允许你独立识别页面上的元素。在这种情况下,可以创建一个匹配“transid_”的简单 XPath 定位器,但忽略属性值的动态部分。
考虑使用“constant_dynamic”形式的“name”属性的输入元素,如下所述:/descendant::input[starts-with(@name, 'transid_')]
XPath 在文档的任何地方都可以看到,并且找到以字符串“transid_”开始的“name”属性的第一个 <input> 元素。它忽略“transid_”后的任何字符。“starts-with”和其他所有 XPath 1.0 函数都记录在 http://www.w3.org/TR/xpath/ 的 W3C Recommendation 中(浏览器 — SOAtest 浏览器测试 — 使用 XPath 1.0 版本)。
这些字符串函数对匹配属性值或某些文本内容的一部分具有特定的兴趣;在 http://www.w3.org/TR/xpath/#section-String-Functions中有所描述。
例如,“contains”函数类似(但不比)“starts-with”函数:它匹配字符串中任何位置的子字符串。以下 Xpath 将找到所需的输入元素,假定没有像“something.transid_xyz”这样的 name 属性的输入:/descendant::input[contains(@name, 'transid_')]
有关更多 XPath 示例,你可以检测 SOAtest 为 Element Properties 定位器生成的 XPath。一旦保存了 Element Properties 定位器,将该定位器更改为 Use Xpath.
随后 SOAtest 将显示一个 XPath,其功能性等价于所保存的 Element Properties 定位器。
脚本化还是 XPaths?
如果不熟悉 Xpath,则当没有明显的 Element Properties 定位器时,你的第一意向可能是使用脚本化来访问 DOM:Element Properties 定位器的脚本化“属性值”或“使用脚本”定位器。
当你想到脚本化的任何时候,首先考虑是否可以创建一个 XPath 定位器。各种搜索策略都很适合 XPath,而且 XPath 表达式通常更容易比脚本更容易创建并维护。
防止使用特定的动态属性
注意,如果只想避免使用定位器中动态的“name”属性(或其他属性),则可以配置 SOAtest 在录制期间生成定位器时不使用“name”属性。有关如何实现这一点的更多详情,请查阅 自定义录制选项。
例如,一些 web 框架生成“id”值,这些值本质上是 SOAtest 点视图的随机值(例如,“gwt-123”)。在这些情况下,你可能希望忽略用于定位器创建的“id”。