机器人框架:如何将变量添加到声明的变量
Robot framework : how to add variable to your declared variable
如何在机器人框架中向声明的变量添加变量?
我的脚本中有很多 table 个变量。下面是一个示例
*** Variable ***
${Amount1_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[4]/div/table/tbody/tr[3]/td
${Amount2_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[6]/div/table/tbody/tr[3]/td
${CounterParty_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[90]/div/table/tbody/tr[3}]/td
${CurrencyPair_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[76]/div/table/tbody/tr[3}]/td
${SpotRate_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[13]/div/table/tbody/tr[3]/td
然后在我的测试用例中,我使用 get element count
来计算我的 table 行并将其用于我的变量,如下面的示例
${Count} get element count xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table
set suite variable ${New_Count} ${Count}
现在我将 ${New_Count}
变量用于我声明的变量,如下面的示例
*** Variable ***
${Amount1_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[4]/div/table/tbody/tr[${New_Count}]/td
${Amount2_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[6]/div/table/tbody/tr[${New_Count}]/td
在 运行 脚本上,无法识别我的变量。
免责声明:我不会真正推荐您的方法,最后建议了一些替代方法。
由于执行顺序,无法识别该变量;框架首先遍历并定义所有变量,然后执行套件设置关键字,然后是案例设置关键字,然后是案例中的关键字。
您可能看到了它的走向——您在变量部分使用了一个 var,但是此时还没有关键字 运行,并且 Set Suite Variable
还没有被执行;例如您正在使用未定义的变量。
有人可能会说,“好吧,我会为 ${New_Count}
定义一个占位符,这样它就被定义了;然后在我的例子中它会被重新定义,定位器会很好”。是的,不是;定位器将被定义一次 - 当它在变量部分中被评估时,并将使用占位符值。您稍后更改 ${New_Count}
- 但它不会以任何方式更改之前使用的位置 (例如,它不用作指针;字符串变量值为“静态”) .
那么可以做什么呢?
- 如果您确实想使用这种方法,在计算
${New_Count}
的值时,您还需要重新计算您在其中使用它的定位器;并给他们打电话Set Suite Variable
。
- 另一种解决方案 - 仅当定位器位于单独的文件中时 - 可能是对其调用
Reload Library
关键字,迫使框架使用新值 ${New_Count}
重新评估它们的值;但是不知道是否支持.robot文件,我个人没试过
- 您可以在 python 文件中包含变量,该文件调用
BuiltIn().get_variable_value('${New_Count}')
和 returns 一个动态计算的值。
- 我个人喜欢使用 1 和 3 之类的东西,但在 RF 中 - 创建一个关键字“Return Selenium Locator For Element BlahBlah“,它使用占位符定位器 - 从未直接用于其他任何东西,修改它基于 conditions/arguments (比如你的计数变量)和 returns 准备好的定位器。然后调用者可以将它用于 selenium 关键字,或者什么不是。(我想我有一个旧的post 详细说明如何以及为什么,解释其他好处 - 例如 this 关键字如何也可以验证元素是否实际存在等)
如何在机器人框架中向声明的变量添加变量?
我的脚本中有很多 table 个变量。下面是一个示例
*** Variable ***
${Amount1_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[4]/div/table/tbody/tr[3]/td
${Amount2_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[6]/div/table/tbody/tr[3]/td
${CounterParty_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[90]/div/table/tbody/tr[3}]/td
${CurrencyPair_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[76]/div/table/tbody/tr[3}]/td
${SpotRate_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[13]/div/table/tbody/tr[3]/td
然后在我的测试用例中,我使用 get element count
来计算我的 table 行并将其用于我的变量,如下面的示例
${Count} get element count xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table
set suite variable ${New_Count} ${Count}
现在我将 ${New_Count}
变量用于我声明的变量,如下面的示例
*** Variable ***
${Amount1_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[4]/div/table/tbody/tr[${New_Count}]/td
${Amount2_Column} xpath=//div[@id='*GFtable***0***EventDealDataValidationMask***report***unfixedData']/table/tbody/tr[1]/td[6]/div/table/tbody/tr[${New_Count}]/td
在 运行 脚本上,无法识别我的变量。
免责声明:我不会真正推荐您的方法,最后建议了一些替代方法。
由于执行顺序,无法识别该变量;框架首先遍历并定义所有变量,然后执行套件设置关键字,然后是案例设置关键字,然后是案例中的关键字。
您可能看到了它的走向——您在变量部分使用了一个 var,但是此时还没有关键字 运行,并且 Set Suite Variable
还没有被执行;例如您正在使用未定义的变量。
有人可能会说,“好吧,我会为 ${New_Count}
定义一个占位符,这样它就被定义了;然后在我的例子中它会被重新定义,定位器会很好”。是的,不是;定位器将被定义一次 - 当它在变量部分中被评估时,并将使用占位符值。您稍后更改 ${New_Count}
- 但它不会以任何方式更改之前使用的位置 (例如,它不用作指针;字符串变量值为“静态”) .
那么可以做什么呢?
- 如果您确实想使用这种方法,在计算
${New_Count}
的值时,您还需要重新计算您在其中使用它的定位器;并给他们打电话Set Suite Variable
。 - 另一种解决方案 - 仅当定位器位于单独的文件中时 - 可能是对其调用
Reload Library
关键字,迫使框架使用新值${New_Count}
重新评估它们的值;但是不知道是否支持.robot文件,我个人没试过 - 您可以在 python 文件中包含变量,该文件调用
BuiltIn().get_variable_value('${New_Count}')
和 returns 一个动态计算的值。 - 我个人喜欢使用 1 和 3 之类的东西,但在 RF 中 - 创建一个关键字“Return Selenium Locator For Element BlahBlah“,它使用占位符定位器 - 从未直接用于其他任何东西,修改它基于 conditions/arguments (比如你的计数变量)和 returns 准备好的定位器。然后调用者可以将它用于 selenium 关键字,或者什么不是。(我想我有一个旧的post 详细说明如何以及为什么,解释其他好处 - 例如 this 关键字如何也可以验证元素是否实际存在等)