机器人框架 - 根据输入更改变量

时间:2018-05-10 13:35:03

标签: python selenium robotframework

我有以下css选择器

${Table_Row}      css=.tr > td:nth-child(2)

这个选择器将为我提供表格中的第一个实例。问题是该表可能包含数百个实例,并且我不想拥有数百个变量。如何使变量更具动态性,我可以传递另一个变量来确定第n个孩子'算,而不是关键词?

这是我的意思的一个python例子:

table_row = ".tr > td:nth-child(%s)"

然后我调用这个变量

table_row % 5

结果将是

.tr > td:nth-child(5)

1 个答案:

答案 0 :(得分:1)

如果这是经常重复的事情,并且您想要集中逻辑而不必处理变量,那么Custom Locator Strategy

受您问题启发的示例:

*** Test Cases ***
Test Case
    Add Location Strategy   table   Custom Locator Strategy
    Page Should Contain Element table=3

*** Keywords ***
Custom Locator Strategy 
    [Arguments]    ${browser}    ${criteria}    ${tag}    ${constraints}
    ${element}=    Get Webelement   css=.tr > td:nth-child(${criteria}) 
    [Return]    ${element}

这将适用于将定位器作为输入参数的所有关键字。自定义定位器策略只需要返回一个Web元素。

在我的视图中实现内联标准的替代方案,但在我看来是不可读的(留给读者)是使用字符串对象函数。它们在Robot Framework Guide的Advanced Variable Syntax部分及其周围进行了描述:

*** Variables ***
${locator_template}    css=.tr > td:nth-child(%) 

*** Test Cases ***
TC
    Log    Locator Template: "${locator_template}"
    ${locator}    Set Variable    ${locator_template.replace("%", "9")}

    Log    Locator Variable: "${locator}"
    Log    Inline Variable: "${locator_template.replace("%", "9")}"
    Log    Locator Template: "${locator_template}"

此示例显示如何使用内联对象函数。由于Python String对象具有替换方法,因此它将提供一种替换相同变量的稳定方法,并使用它替换输出以便在关键字中进一步分配。

它将产生以下结果:

Starting test: Robot.String Replace.TC
20180513 12:25:21.057 : INFO : Locator Template: "css=.tr > td:nth-child(%)
20180513 12:25:21.058 : INFO : ${locator} = css=.tr > td:nth-child(9)
20180513 12:25:21.059 : INFO : Locator Variable: "css=.tr > td:nth-child(9)"
20180513 12:25:21.060 : INFO : Inline Variable: "css=.tr > td:nth-child(9)"
20180513 12:25:21.061 : INFO : Locator Template: "css=.tr > td:nth-child(%)"
Ending test: Robot.String Replace.TC

您可以告诉replace函数返回结果,并且不会更新原始字符串。这使得它可以用作可重用模板。