如何使用JavaScript查找具有相同属性的两个web对象以实现测试自动化

如何使用JavaScript查找具有相同属性的两个web对象以实现测试自动化,javascript,html,selenium,testcomplete,Javascript,Html,Selenium,Testcomplete,我有这段HTML代码 我需要使用JavaScript找到这两个对象,以便单击()并编写一些文本(测试自动化) 问题是id是动态生成的,因此无法使用,因为每次加载页面时它都会不断更改。现在,由于无法使用id,这两个对象看起来是相同的,没有任何唯一标识符 如果我用这个 document.querySelector(“input.value还原[type='text']”)试试这种方法 完成xpath后使用索引。xpath[2]下面的内部表示第二个输入webelement。如果有多个输入标记可用,

我有这段HTML代码

我需要使用JavaScript找到这两个对象,以便单击()并编写一些文本(测试自动化)

问题是id是动态生成的,因此无法使用,因为每次加载页面时它都会不断更改。现在,由于无法使用id,这两个对象看起来是相同的,没有任何唯一标识符

如果我用这个

document.querySelector(“input.value还原[type='text']”)试试这种方法

完成xpath后使用索引。xpath
[2]
下面的内部表示第二个
输入
webelement。如果有多个输入标记可用,则应使用索引

//input[@class='ui-calendar-display widget has-change-tracker value-restored'][2]
如果要定位第一个webelement,请使用下面的xpath

//input[@class='ui-calendar-display widget has-change-tracker value-restored'][1]
这样试试

完成xpath后使用索引。xpath
[2]
下面的内部表示第二个
输入
webelement。如果有多个输入标记可用,则应使用索引

//input[@class='ui-calendar-display widget has-change-tracker value-restored'][2]
如果要定位第一个webelement,请使用下面的xpath

//input[@class='ui-calendar-display widget has-change-tracker value-restored'][1]

您可以使用
[contains()]
为这些元素构造xpath。正如我所看到的,父级
span
有一个稳定的类名,您可以使用它

在JAVA中

WebElement firstElement = driver.findelements(By.xpath("//span[contains(@class,'form-row-ui-calender-row')]/input[@type='text']")).get(0);
WebElement secondElement = driver.findelements(By.xpath("//span[contains(@class,'form-row-ui-calender-row')]/input[@type='text']")).get(1);
或者对xpath使用索引

WebElement firstElement = driver.findelements(By.xpath("//span[contains(@class,'form-row-ui-calender-row')]/input[@type='text'][1]"));
WebElement secondElement = driver.findelements(By.xpath("//span[contains(@class,'form-row-ui-calender-row')]/input[@type='text'][2]"));

希望这有帮助。

您可以使用
[contains()]
为这些元素构造xpath。正如我所看到的,父级
span
有一个稳定的类名,您可以使用它

在JAVA中

WebElement firstElement = driver.findelements(By.xpath("//span[contains(@class,'form-row-ui-calender-row')]/input[@type='text']")).get(0);
WebElement secondElement = driver.findelements(By.xpath("//span[contains(@class,'form-row-ui-calender-row')]/input[@type='text']")).get(1);
或者对xpath使用索引

WebElement firstElement = driver.findelements(By.xpath("//span[contains(@class,'form-row-ui-calender-row')]/input[@type='text'][1]"));
WebElement secondElement = driver.findelements(By.xpath("//span[contains(@class,'form-row-ui-calender-row')]/input[@type='text'][2]"));

希望这有帮助。

在TestComplete中,您可以通过以下方式(在脚本中)执行此操作:


如果使用名称映射,则可以使用必需的子功能非常可靠地映射此对象,并通过映射树中的名称直接访问该对象。如果您需要有关如何创建此类映射的更多详细信息,请告诉我

在TestComplete中,您可以通过以下方式(在脚本中)执行此操作:


如果使用名称映射,则可以使用必需的子功能非常可靠地映射此对象,并通过映射树中的名称直接访问该对象。如果您需要有关如何创建此类映射的更多详细信息,请告诉我

@keylogger说:“问题是id是动态生成的,因此无法使用,因为每次加载页面时它都会不断变化。”因此,不幸的是,这对他没有帮助。然后,不要使用
id
属性,而是使用
class
属性和
索引编号
。我也更新了我的答案。感谢您的回复。:)谢谢@jainishkapadia,我们如何在Chrome控制台中尝试它?它是
文档.evaluate(//input[@ui-calendar-display小部件已恢复更改跟踪器值'][2]”,文档)
?@keylogger,我在这里使用了
relative
xpath。而且这与浏览器无关。但是,如果您想在chrome上试用,只需打开chrome浏览器,
Elements
选项卡打开并将要查找的元素悬停,然后右键单击element
copy->copy Xpath
,并将其粘贴到记事本上。如果您的查询已解决,请将此答案标记为
已接受谢谢。@keylogger说:“问题是id是动态生成的,因此无法使用,因为每次加载页面时它都会不断变化。”所以不幸的是,这对他没有帮助。然后用
id
属性代替
class
属性和
索引编号一起使用。我也更新了我的答案。感谢您的回复。:)谢谢@jainishkapadia,我们如何在Chrome控制台中尝试它?它是
文档.evaluate(//input[@ui-calendar-display小部件已恢复更改跟踪器值'][2]”,文档)
?@keylogger,我在这里使用了
relative
xpath。而且这与浏览器无关。但是,如果您想在chrome上试用,只需打开chrome浏览器,
Elements
选项卡打开并将要查找的元素悬停,然后右键单击element
copy->copy Xpath
,并将其粘贴到记事本上。如果您的查询已解决,请将此答案标记为
已接受谢谢。当您想使用JS查找DOM中的所有对象时,您必须使用
querySelectorAll
例如:
document.querySelectorAll(“input.value restored[type='text'])”
,然后您可以通过添加
[0]
(或根据元素数量的任何其他数字)来搜索特定元素。或
$$(选择器)
。正确的解决方法是告诉创建HTML的人不要使用任何ID两次,因为它们应该是唯一的。如果你不能做到这一点,@Arghajit Bhattacharya解决方案可能是最好的。当你想用JS查找DOM中的所有对象时,你必须使用
queryselectoral
比如:
document.querySelectorAll(“input.value restored[type='text'])
,然后你可以通过添加
[0]
来搜索某个元素(或根据元素数量的任何其他数字)。或
$$(选择器)
。解决您的问题的正确方法是告诉创建HTML的人不要使用任何ID两次,因为它们应该是唯一的。如果您不能这样做,@Arghajit Bhattacharya解决方案可能是最好的。谢谢@DmitryNikolaev。我可能错了,但我认为必需的子对象意味着找到具有唯一c的非唯一对象Children。但在这种情况下,非唯一对象本身就是最新的子对象。最新的子对象可以使用必需的子对象吗?谢谢。@keylogger:事实上,你是对的。在这种情况下,有一个技巧可能会有所帮助,但在更好地查看HTML代码之后,我认为它在这种特定情况下不起作用。但是,
FindChildByXPath
方法应该可以毫无问题地为您工作。它允许通过标签(D)选择对象