我将所有特定XPath字符串集中到资源文件,并在我的测试套件(机器人框架)中导入该资源文件中的变量。这样,它们可以在一个地方维护,我可以使用使机器人文件可读的变量名称。那是一种很好的做法吗?
有时我想将变量传递给变量,以使其更具动态性。但是,变量的值包含XPath,有时候// div [path ... etc] [text()='MyString']。
问题:在机器人文件中,如何将参数('MyString')传递给使用变量的Click Element方法?
答案 0 :(得分:1)
将UI对象技术参考与测试逻辑分开当然是一种很好的做法。通常,此模式称为对象存储,但也使用其他名称。
至于分离方法,我建议使用YAML variable file而不是resource file来获取静态值,并使用命令行参数robot --variablefile MyVariables.yaml MyRobotFile.robot
包含它们来包含资源您的测试脚本中的文件。这具有额外的优势,如果您因为不同的软件版本而想要切换对象存储库,那么这不需要更改测试脚本。
如果您的变量内容根据启动机器人时已知的某个值而变化,那么Python变量类是一种很好的方法。这是一个带有参数的Python function或Python class,您可以使用Python转到数据库,文件或使用内部逻辑来确定需要返回哪些变量以及它们应该保留哪些值。
至于将变量片段添加到xpath而没有结束许多特定的专用关键字,我使用SeleniumLibrary库中的Custom Locator Strategy功能。这允许我在测试逻辑本身中使用普通关键字而不需要任何其他关键字。
在下面的示例中,创建了自定义定位器abc=
,可以使用xpath=
代替任何标准SeleniumLibrary关键字。在这种情况下,我使用Dictionary作为Locator对象存储来保存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}