Karate Feature文件中无法基于已有定位器查找子定位器的问题
问题描述
我在公共定位器文件locator.json中定义了一些父级定位器,现在需要基于这些父定位器查找对应的子定位器(比如图片)。当前我的定位器文件内容如下(已修正语法错误):
{ "mainPage": { "firstLocator": "//div[text()='a']", "secondLocator": "//div[text()='b']" }, "commonLocators": { "image": "//img" } }
我希望在Feature文件中实现点击firstLocator和secondLocator下的图片,尝试过* click(mainPage.firstLocator.img)但无法生效。现在有多个场景需要给不同父对象关联同一个子定位器,不想在每个父定位器下重复定义子定位器,请问该怎么实现?
解决方案
方法1:直接字符串拼接定位器
利用XPath的层级语法,将父定位器和子定位器直接拼接,Karate支持字符串的直接拼接操作:
# 引入定位器文件 * def locators = read('locator.json') # 拼接父定位器和子定位器,点击对应图片 * click(locators.mainPage.firstLocator + locators.commonLocators.image) * click(locators.mainPage.secondLocator + locators.commonLocators.image)
如果需要更严谨的直接后代层级关联,可以用/拼接:
* click(locators.mainPage.firstLocator + '/' + locators.commonLocators.image)
方法2:封装通用拼接函数
如果有大量这类场景,可以封装一个通用函数简化操作,避免重复写拼接逻辑:
* def locators = read('locator.json') * def getChildLocator = function(parent, child) { return parent + child } # 调用函数获取组合后的定位器并点击 * click(getChildLocator(locators.mainPage.firstLocator, locators.commonLocators.image)) * click(getChildLocator(locators.mainPage.secondLocator, locators.commonLocators.image))
方法3:实现类链式调用的定位器(进阶)
如果你的Karate版本支持,可以通过自定义JS对象实现类似parent.child的调用方式:
* def locators = read('locator.json') * def mainPage = { firstLocator: function() { return { img: locators.mainPage.firstLocator + locators.commonLocators.image } }, secondLocator: function() { return { img: locators.mainPage.secondLocator + locators.commonLocators.image } } } # 此时可使用你最初尝试的语法调用 * click(mainPage.firstLocator().img) * click(mainPage.secondLocator().img)
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

