您如何在 Robot Framework 中编写具有多个标识符的动态元素?
Posted
技术标签:
【中文标题】您如何在 Robot Framework 中编写具有多个标识符的动态元素?【英文标题】:How do you write in Robot Framework a dynamic element with multiple identifiers? 【发布时间】:2020-11-04 07:38:21 【问题描述】:我是 Robot Framework 以及使用 Pycharm 编写自动化程序的新手,但遇到了一个我找不到答案的问题。我有文本框,每次对页面进行更改时,uid 都会更改。我曾尝试使用 xpath,但所有文本框似乎都具有相同的起始 ID 56$551056--所以我不能使用 xpath=//input[contains(@id='56$551056--')] 而不尝试添加一些额外的东西。 示例文本框1
<input type="text" class="gwt-TextBox WNN2" data-automation-id="textInputBox" tabindex="0" role="textbox" id="56$551056--uid74-input" dir="ltr" aria-invalid="false" xpath="1">
TextBox2 示例
<input type="text" class="gwt-TextBox WNN2" data-automation-id="textInputBox" tabindex="0" role="textbox" id="56$551056--uid75-input" dir="ltr" aria-invalid="false" xpath="1">
我要自动化的每个部分中有 3-5 个框,它们似乎都有完全相同的代码,除了 uid。删除 ID 和类名(因为它们都会在 ChroPath 中引发动态警告,只会给我一个字符串 //div//div//div//div//div//div//div//div//div //div//div//div//div//div//div//div//div//div//div//div//div//div//div//li[2]// div[2]//div[1]//div[1]
非常感谢您对此的任何帮助或指导。 更新 所以我有这些连接 ID 和标签的路径,但我必须删除 uid100 因为这是页面上继续更改的部分。我尝试了几种不同的组合来让它在 RF 中工作,但我似乎无法完全正确。 //label[@id='56$551056--uid100-formLabel'] //div[contains(text(),'First Name')] //*[@id="56$551056--uid100-input"]
<li class="WDSO WOTO" role="presentation" data-automation-id="formLabelRequired"><div class="WFSO WIRO"><label id="56$551056--uid430-formLabel" data-automation-id="formLabel" for="56$551056--uid430-input">First Name</label><div class="WISO wd-74ef43c8-48bb-445c-9b49-1a788d7c4b10" aria-hidden="true">First Name</div></div><div data-automation-id="decorationWrapper" id="56$551056" class="WJSO"><div class="WOAJ"><div class="WHN2 textInput WGN2 WJ5" data-automation-id="textInput" id="56$551056--uid430" data-metadata-id="56$551056" style="visibility: visible;"><input type="text" class="gwt-TextBox WON2" data-automation-id="textInputBox" tabindex="0" role="textbox" id="56$551056--uid430-input" dir="ltr" aria-invalid="false" aria-required="true"></div></div></div></li>
【问题讨论】:
您是否有能力要求开发人员添加更多识别信息,例如自定义类名或其他属性(例如:data-qa
)?那将是最好的解决方案。此外,输入元素只是在空间中浮动,还是与唯一标签、div 或 span 相关联?
我不知道,因为这是 Workday 应用程序的一部分。在输入框上方有一个标签集,我尝试在其中实现,但它与实际文本框完全分开 //label[contains(text(),'First Name')]
@BryanOakley IMO,开发人员帮不上忙,因为该应用程序是基于 gwt
的。
@micheich 使用<input>
标签和<label>
标签更新问题。
@DebanjanB:开发人员应该能够添加他们想要的任何额外属性。
【参考方案1】:
最好的解决方案是与开发人员合作,为每个输入元素提供独特的属性。
如果您无法做到这一点,并且您无法轻松地唯一标识输入元素,则找到您可以唯一标识的最近元素,并将其用作查找输入元素的基础。
例如,如果输入元素与标签相关联——大多数情况下——您可以使用标签元素作为 xpath 的一部分。例如,//label[@text='First Name']//input
。具体如何执行取决于页面的结构 - 输入元素可能是第一个同级元素,或第一个子元素,或 DOM 中其他位置但由标签中的属性指向的某个元素(例如:<label for= "56$551056--uid74-input">
)
这个问题并非机器人框架独有,几乎每个测试自动化框架都很常见。
【讨论】:
【参考方案2】:尝试将item label
插入您的xpath 而不是id
。例如,如果您的文本框有标签 Customer Name,那么会是这样的:
//label[text()='客户名']/../../
input
(黑暗部分是我的假设)
所以,你可以摆脱烦人的动态 ID
请提供完整的 html,以便我给出更好的答案
【讨论】:
我在原始问题中添加了 HTML。感谢您的帮助。 @micheich 这个应该适合你://label[text()='First Name']/../following-sibling::div//input
谢谢!我没有正确的是以下兄弟部分。
@micheich 请了解 Xpath Axes,在这种情况下它会对您有很大帮助【参考方案3】:
使用 xpath 定位器使用对以下元素的父元素的引用来查找元素
<input type="text" class="gwt-TextBox WNN2" data-automation-id="textInputBox" tabindex="0" role="textbox" id="56$551056--uid74-input" dir="ltr" aria-invalid="false" xpath="1">
xpath 示例如下:
xpath of parent//input[contains(@class,'TextBox')]
【讨论】:
以上是关于您如何在 Robot Framework 中编写具有多个标识符的动态元素?的主要内容,如果未能解决你的问题,请参考以下文章