集中资源文件中的 XPath,如何从机器人文件传递参数?

Centralizing XPath in resource file, how to pass arguement from robot file?

我将所有特定的 XPath 字符串集中到一个资源文件中,并在我的测试套件(机器人框架)中导入该资源文件中的变量。这样,它们就可以在一个地方维护,我可以使用使机器人文件可读的变量名。这是好的做法吗?

有时我想给变量传递一个参数,让它更动态。但是,变量的值包含和 XPath,有时有 //div[path...etc][text()='MyString'].

问题:在机器人文件中,如何将参数('MyString')传递给使用变量的Click Element方法?

将 UI 对象技术参考与测试逻辑分开当然是一个好习惯。通常,此模式称为对象存储,但也使用其他名称。

至于分离方法,我建议对静态值使用 YAML variable file over a resource file 并使用命令行参数 robot --variablefile MyVariables.yaml MyRobotFile.robot 包含它们,而不是在测试脚本中包含资源文件。这有一个额外的好处,如果你想因为不同的软件版本而切换你的对象存储,那么这不需要更改测试脚本。

如果您的变量内容根据启动机器人时已知的某些值而变化,那么 Python 变量 Class 是一个很好的方法。这是一个带参数的 Python function or Python class,您可以使用 Python 转到数据库、文件,或使用内部逻辑来确定需要返回哪些变量以及它们应该保存什么值。

至于向 xpath 添加变量片段而不以大量特定的专用关键字结束,我使用了 SeleniumLibrary 库中的 Custom Locator Strategy 功能。这允许我在测试逻辑本身中使用普通关键字而无需任何其他关键字。

在下面的示例中,创建了一个自定义定位器 abc=,并且可以代替 xpath= 用于任何标准的 SeleniumLibrary 关键字。在这种情况下,我使用字典作为定位器对象存储来保存 ID 并使用唯一名称引用它们。请注意,abc= 已从 ${criteria} 参数中的值中删除。

*** Variables ***
&{locators}
...    myCustomId1=//*[@id='12234']
...    myCustomId2=//*[@id='23455']

*** Test Cases ***
Test Case
    Add Location Strategy          abc  Custom Locator Strategy
    Page Should Contain Element    abc=myCustomId1

*** Keywords ***
Custom Locator Strategy 
    [Arguments]    ${browser}    ${criteria}    ${tag}    ${constraints}
    ${WebElement}=     Get Webelement     xpath=${locators['${criteria}']}
    [Return]    ${WebElement}