在我的 RF-Selenium 项目中,我有一个语言选择,有几个不同的选项可供选择,我通过 xpath 找到这些选项。我通常将高级关键字、定位器/全局变量和测试分开在 3 个不同的文件中,因此我需要在一个文件中获取 xpath,在其他文件中获取关键字。
我测试并在硬编码时工作的 xpath 如下所示: //select[@id="language"]/option[@value="?hl=es"]
(然后将“es”更改为任何其他语言标识符以查找其他选项)。因此,遵循建议here我构建了一个“GET LOCATOR”关键字来将语言标识符作为参数并返回正确的 xpath:
GET LOCATOR
[Arguments] ${language}
${option locator} Replace String ${LANG} placeholder ${language}
[Return] ${option locator}
我有两个不同的关键字,它们将使用 GET LOCATOR 关键字的返回值:在其中一个关键字中,我验证当前选择的语言在选择列表中已禁用:
${current} Get Element Attribute html@lang
Element Should Be Disabled GET LOCATOR ${current}
然后我实际上选择了一种不同的语言并检查页面是否已切换到该语言:
Select From List By Value ${LANGUAGE SWITCH} es
Wait Until Page Contains Element GET LOCATOR 'es'
所有这些都位于资源文件中,而 ${LANGUAGE SWITCH} 和 ${LANG} 变量位于不同的文件中(并且 Replace String 关键字位于 String RF 标准库中)。
${LANGUAGE SWITCH} 变量包含一个 css 选择器,可成功找到语言下拉列表。我已经在没有 GET LOCATOR 关键字的情况下进行了一些测试,并且它们通过了,例如:
${current} Get Element Attribute html@lang
Element Should Be Selected xpath=//select[@id="language"]/option[@value="?hl=${current}"]
所以我怀疑存储在 ${LANG} 变量中的占位符 xpath 有问题: xpath =//select[@id="language-switch"]/option[@value="?hl =占位符"]
这是带有语言选择下拉列表的 DOM 部分:
<select id="language">
<option value="?hl=ar">Arabic</option>
<option value="?hl=zh-TW">Chinese (Traditional)</option>
<option value="?hl=nl">Dutch - Nederlands</option>
<option value="?hl=en" selected="" disabled="">English</option>
<option value="?hl=el">Greek</option>
<option value="?hl=es">Spanish</option>
</select>
更糟糕的是,使用此关键字的测试失败,没有错误消息,因为我只得到:
| FAIL |
en
那么...我在这里做错了什么?
最佳答案
您不能从应禁用元素
和等待页面包含元素
调用第二个关键字。发生的情况是 Element should be disabled
认为定位器是字符串 GET LOCATOR
(显然不存在),并且自定义错误消息是 es
.
您需要将其分为两个步骤:
${locator}= GET LOCATOR ${current}
Element should be disabled ${locator}
关于selenium - 机器人框架: passing argument to a keyword that returns an XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48423603/