【问题标题】:Robot Framework - Change variables depending on inputRobot Framework - 根据输入更改变量
【发布时间】:2018-10-20 19:13:17
【问题描述】:

我有以下 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)

【问题讨论】:

  • 为什么不创建一个接受行号作为参数的关键字呢?然后你可以做get row 32。计算定位器的逻辑可以在关键字中。
  • @BryanOakley 这实际上是我现在正在做的,但我只是想知道是否有更简单的内联方法。

标签: python selenium robotframework


【解决方案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 元素。

在我看来满足内联标准但在我看来不是更具可读性的替代方法(留给读者)是使用字符串对象函数。它们在机器人框架指南的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 对象具有方法 replace,它将提供一种替换相同变量的稳定方法,并使用它的替换输出来进一步分配关键字。

它将产生以下结果:

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 函数返回结果,并且不更新原始字符串。这使得它可以用作可重用模板。

【讨论】:

  • 这是正确的,但它与我现在正在做的类似。我想知道是否有一个选项可以在不使用关键字的情况下内联。
  • 好吧@BeniKeyserman,这与您的要求非常接近 - 值 动态的,基于您提供的数字,并且您没有创建任何自定义关键字获取定位器 - 您只需提供数字即可使用标准 SeleniumLibrary 的定位器。
  • @BeniKeyserman 我已经用一个内联示例更新了答案。在我看来,内联替换功能的简洁性被降低的可读性所抵消。
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 2019-06-04
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多