在我的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'
所有这些都在Resources文件中,而$ {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}"]
所以我怀疑我的占位符xpath存在问题,存储在$ {LANG}变量中:xpath = //select[@id="language-switch"]/option[@value="?hl=placeholder"]
这是带有语言选择下拉列表的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
那么......我在这里做错了什么?
答案 0 :(得分:2)
您无法从Element should be disabled
和Wait Until Page Contains Element
拨打第二个关键字。发生的事情是Element should be disabled
认为定位器是字符串GET LOCATOR
(显然不存在),自定义错误消息是es
。
您需要将其分解为两个步骤:
${locator}= GET LOCATOR ${current}
Element should be disabled ${locator}