如何使用 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 Regular Expression 正则表达式 处理String