如何使用 Robot Framework 处理动态元素

Posted

技术标签:

【中文标题】如何使用 Robot Framework 处理动态元素【英文标题】:How to handle dynamic elements using Robot Framework 【发布时间】:2017-04-30 18:59:36 【问题描述】:

我目前正在开发机器人框架并使用 Selenium2Libraries 开发 Web 应用程序。我正在处理一个表单,我正在处理一个动态元素,它是一个可编辑的文本区域和下拉列表..

我真的希望有人能够指导我如何做到这一点。我正在做的一个例子是,

[示例元素代码]

input id="textfield-1237-inputEl" class="x-form-field x-form-text x-form-text-default x-form-focus x-field-form-focus x-field-default-form-focus" 
data-ref="inputEl" size="1" name="textfield-1237-inputEl" 
maxlength="200" role="textbox" aria-hidden="false" aria-disabled="false" 
aria-readonly="false" aria-invalid="false" aria-required="false" autocomplete="off" data-componentid="textfield-1237" type="text"

任何有关这方面的信息将不胜感激。谢谢!

【问题讨论】:

动态怎么样?通常,您可以处理任何元素,无论是动态的还是静态的,都没有关系。你到底想测试什么?只是看看文本区域内是否有数据?看看你能不能输入那个区域?使用下拉列表?你想做什么? 我正在尝试在文本区域(即货币)上输入文本,并且文本区域有一个下拉列表,但它也是可编辑的,我可以在其中输入文本而无需从下拉列表中选择.这里的问题,我通常使用元素id来获取元素定位器(ie//*[@id="textfield-1160-inputEl"],但是对于这种情况,id是动态的。每次重新加载时它都会不断变化页面..@goralight 这是一个例子--> @goralight 我现在明白了,只是回答你的问题:) @Belle 【参考方案1】:

有许多类型的标识符可用。您可以搜索,如果值是动态的,您可以使用 Xpath Identifier 查找定位器。Id 只能用于静态值。 在上述情况下,您可以使用 Xpath 作为

xpath=.//*[包含(type(),'text')]

因为文本是静态的。它不会改变。

【讨论】:

【参考方案2】:

当尝试处理动态 ID 以及没有简单 UID 的元素时,解决此问题的最佳方法是使用 Xpath。

Xpath 基本上是元素在 html 中的位置。这是解决没有现成可用 ID 问题的最佳方法(我的工作在任何我可以使用的地方都没有 ID,因此我别无选择,只能使用 Xpaths)

如果使用得当,Xpath 真的很强大。如果不是,它们真的很脆弱,维护起来可能是一场噩梦。我会给你一个你可能不得不使用的潜在 Xpath 的例子:

Select From List By Label    xpath=(//select)[2]    DropDownItem1

你说你有一个下拉菜单。这是您会看到的潜在“外观”。这里的 Xpath 基本上是说,在整个 HTML 页面的任何位置找到第二个下拉列表。

Xpaths 需要一些时间才能让您熟悉,尤其是如果您有使用 ID 的奢侈体验。我用来定位和调试 Xpath 的工具有:

FireBug

Selenium IDE

我现在主要使用 Selenium IDE,因为它是一个很好的工具,它基本上可以让你在 HTML 中“选择”一个元素,它会喷出它的 ID、CSS 路径、Xpath、DOM 等……不仅如此,当您发现更复杂的 Xpath 时,有一个“查找”工具可以直观地显示您的 Xpath 指向的位置(或者不是,如果它错误)

真正帮助我的是This。它真的很有用,并且有很多示例供您参考。

如果您有任何问题,请回复并尽力提供帮助

更多例子:

Click Element    //span[contains(text(), 'Submit')]
Input Text    xpath=(//textarea)[3]    Some Random Text!

【讨论】:

非常感谢!很多信息!无论如何,我尝试使用 class --> .//div/input[contains(@class, 'x-field-default-form-focus')] 并检查了 firepath.Firepath 可以找到它但是当我使用xpath,他们无法检测到元素.. @goralight 不确定是否是故意的,但删除“。”从一开始就。尝试安装 Selenium IDE。然后使用 FirePath,我得到了更好的结果。 Chrome 的 TruePath 插件非常适合我。 是否有任何选项可以使用 OR 选项检查多个文本?点击元素 //span[contains(text(), 'Submit' | 'Ok' | 'Next' | 'Further')]【参考方案3】:

与其他答案一样,我建议您使用 Xpath。 使用 Xpath 可以通过识别该元素与其周围其他元素的关系来将您指向该元素。所以我的建议是找到一个可以用作起点的静态元素。

例如: 起点有静态ID: xpath=//td[@id='startingPoint']/following-sibling::select[1]

起点没有id但有静态文本(通常是字段的标签): xpath=//td[contains(text(),'Field Label')]/following-sibling::select[1]

如果您能告诉我们元素是什么..我们可以为您提供更好的示例..

【讨论】:

在尝试使用 xpath 进行识别时也只是一个提示。谷歌浏览器控制台允许您通过键入来检查您的 xpath 是否正确:$x("<xpath>") example $x("//td[2]") 创建自己的 xpath 也比依赖某些应用程序更好。使用很棒的 xpath 时,您会发现创建可重用的关键字更容易。示例://td[contains(text(),'$rowValue')]/following-sibling::td[count(//td[contains(text(),'$columnValue')]/preceding-sibling::td)-count(//td[contains(text(),'$rowValueColumnName')]/preceding-sibling::td)] 为您提供 columnValue 下的值,该值与 rowValue 位于同一行(位于 rowValueColumnName 下)【参考方案4】:

例如,我所做的是更改 Xpath:

//*[@id="cec9efb093e14182b361766c26fd1919"]/section/div[1]/ticket/div/div/input

并取出 Id 动态生成的 cec9efb093e14182b361766c26fd1919 以切换为 autoId 我设置为生成 Id 的父元素。这是一个便宜的修复,但如果只生成一个父元素,它就可以工作。

所以父元素添加了属性autoid=container,我在机器人代码中将其引用为[@autoid="container"]/section/div[1]/ticket/div/div/input

【讨论】:

以上是关于如何使用 Robot Framework 处理动态元素的主要内容,如果未能解决你的问题,请参考以下文章

您如何在 Robot Framework 中编写具有多个标识符的动态元素?

Robot Framework XPATH元素的定位(如何获取一个动态或具体的元素)

Robot Framework 资源和变量文件

Robot Framework Regular Expression 正则表达式 处理String

如何使用 Robot Framework 从测试套件运行特定的测试用例

如何使用 Robot Framework 比较两个 csv 文件