本主题介绍如何使用 CreatXPath 挂钩创建自定义定位器,以便在录制 web 场景测试时识别元素。然后使用这些自定义定位器来进行验证和提取。
章节目录:
关于挂钩
自定义挂钩可用于记录或修改执行期间在特定点传递的值。
挂钩在脚本中使用自定义方法定义和自定义。同一个文件可以定义多个挂钩。如果向一个挂钩添加多个方法,则在调用该挂钩时将执行该挂钩定义的所有方法。
您可以以在 SOAtest中创建、应用和调用其他脚本相同的方式创建、应用和调用脚本:在启动时(只针对 JavaScript 和 Jython 脚本),通过创建和应用扩展工具,通过向特定路径节点添加脚本来定义挂钩。您可以在不同的时间调用挂钩以引出所需的功能。例如,如果想要将脚本的挂钩功能应用于所有项目和网址,则可以将定义并使用该挂钩的 JavaSCript 或 Jython 脚本添加到 <INSTALL>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/startup
目录中;然后,任何调用该挂钩的时候,都将执行相关联的用户指定方法。将会一直执行该方法,直到调用该挂钩上的 clear()。
关于 CreateXPath 挂钩
当录制 web 场景时,SOAtest 通过这些元素的某些属性标识与之交互的元素。例如,SOAtest 将使用元素的 ID 或元素的文本内容来定位该元素。如果需要扩展属性来识别功能测试期间的元素,则可以使用 CreateXPath 挂钩。
CreateXPath 挂钩接收两个参数。第一个是 org.w3c.dom.Node 的实例,是将构建定位器的节点。第二个参数是 org.w3c.dom.Document 的实例,是节点所在的文档。CreateXPath 功能应返回识别文档中节点的 XPath,或如果不能创建 XPath,则返回 null。
例如,如果希望通过它们的“class”属性来识别元素,则可以使用 CreatXPath 挂钩来创建自定义标识符,检查元素的“calss”属性,如果找到一个,返回一个通过“class”属性的值来标识元素 XPath。
当选择要验证的元素,或在录制期间点击元素时,SOAtest 将使用该自定义挂钩。元素将传递给自定义挂钩,然后该挂钩将检查元素的“class”属性。如果找到一个,则将返回一个 XPath,使用“class”属性值来标识元素。
下面是标识元素的示例脚本,使用“class”属性和索引(当多个节点具有相同“class”时)。
app = Packages.com.parasoft.api.Application; settings = Packages.webtool.browsertest.XPathCreator; // establish the locator builder priority order // we use our custom locator after using the id, name and attribute locators // and before using the position xpath locator settings.locatorBuildersOrder[0] = settings.ID_LOCATOR; settings.locatorBuildersOrder[1] = settings.NAME_LOCATOR; settings.locatorBuildersOrder[2] = settings.ATTRIBUTE_XPATH_LOCATOR; settings.locatorBuildersOrder[3] = settings.HOOK_LOCATOR; settings.locatorBuildersOrder[4] = settings.POSITION_XPATH_LOCATOR; // gets the index of the node out of a list of nodes returned using xpath. function getIndex(xpath, node, doc) { index = -1; if (doc) { try { list = Packages.org.apache.xpath.XPathAPI.selectNodeList(doc, xpath); count = 0; while (index == -1 && count < list.getLength()) { candidate = list.item(count); if (candidate.equals(node)) { index = count; } else { ++count; } } } catch (e) {} } return index; } // the hook function to link to the CreateXPath hook. // looks for the class attribute and uses it (along with an index) to create // a locator for the given node. function createXPathHook(node, doc) { nodeName = node.getNodeName(); attributes = node.getAttributes(); classValue = attributes.getNamedItem("class"); if (classValue) { xpath = "//" + nodeName + "[@"+ classValue + "]"; index = getIndex(xpath, node, doc); if (index != -1) { return xpath + "[" + index + "]"; } } return null; } // sets up the hook function setHook() { hook = app.getHook("CreateXPath"); hook.set(createXPathHook); }