如果有多个具有相同类名且没有资源 ID 的元素,如何检查元素
Posted
技术标签:
【中文标题】如果有多个具有相同类名且没有资源 ID 的元素,如何检查元素【英文标题】:How to inspect element if there are multiple elements with same class name and doesn't have resource-id 【发布时间】:2019-08-27 01:05:23 【问题描述】:<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<hierarchy rotation="0">
-<node bounds="[0,0][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.widget.FrameLayout" resource-id="" text="" index="0">
-<node bounds="[0,0][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.widget.LinearLayout" resource-id="" text="" index="0">
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.widget.FrameLayout" resource-id="android:id/content" text="" index="0">
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.webkit.WebView" resource-id="" text="" index="0">
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="true" focused="true" focusable="true" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.webkit.WebView" resource-id="" text="Ionic App" index="0">
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0"/>
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="1">
-<node bounds="[0,42][720,1280]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
-<node bounds="[0,42][720,80]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
<node bounds="[631,42][720,80]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="true" enabled="true" clickable="true" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.widget.Button" resource-id="" text="V 3.5" index="0"/>
</node>
<node bounds="[190,105][530,229]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.widget.Image" resource-id="" text="Himalaya Image" index="1"/>
<node bounds="[288,262][432,369]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.widget.Image" resource-id="" text="Leap Image" index="2"/>
-<node bounds="[35,483][687,628]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="3">
-<node bounds="[131,483][589,565]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
-<node bounds="[131,483][589,565]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
-<node bounds="[131,483][589,563]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
-<node bounds="[131,483][589,563]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="0">
<node bounds="[145,504][575,539]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="true" enabled="true" clickable="true" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.widget.EditText" resource-id="" text="" index="0" NAF="true"/>
<node bounds="[131,483][589,565]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="true" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="1" NAF="true"/>
</node>
</node>
</node>
</node>
-<node bounds="[35,596][687,628]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="1">
<node bounds="[224,602][390,628]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="true" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="Register" index="0"/>
<node bounds="[388,596][397,628]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text=" " index="1"/>
<node bounds="[393,602][497,628]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="true" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="Forgot PIN" index="2"/>
</node>
</node>
<node bounds="[101,745][619,1106]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.widget.Image" resource-id="" text="Lead 2020" index="4"/>
</node>
</node>
</node>
</node>
</node>
</node>
<node bounds="[0,42][720,45]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="" text="" index="1"/>
</node>
</node>
</node>
</node>
</node>
</node>
<node bounds="[0,0][720,42]" selected="false" password="false" long-clickable="false" scrollable="false" focused="false" focusable="false" enabled="true" clickable="false" checked="false" checkable="false" content-desc="" package="com.talentpace.substk" class="android.view.View" resource-id="android:id/statusBarBackground" text="" index="1"/>
</node>
</hierarchy>
已检查的元素。尝试通过各种方式在代码中查找元素。但没有任何工作。请建议在应用程序中编辑 PIN 码的 xpath 应该是什么
-
android.view.view 类有多个元素,资源id和text为null。
只有 1 个具有类 android.widget.editText 的元素。但这也行不通。
附上我要为其编写代码的树
UIAutomatorTree
下面是我试过的xpath
driver.findElementByXPath("//android.widget.FrameLayout//android.view.View[@index='3']//android.widget.EditText")
【问题讨论】:
XPath 查询 xml 脚本。为了获得更好的帮助,我建议您也发布 xml 页面源。您可以通过调用driver.PageSource
来完成此操作。请参阅this 资源。
附加。在这个我需要点击类 android.widget.EditText 的元素
理想情况下,您应该真正尝试为您的元素获取一些独特的资源 ID。它会让事情变得不那么复杂。当然,您需要访问源代码。
【参考方案1】:
这不是回答问题,但如果您可以访问源代码,可能会有所帮助。 setContentDescription 方法有助于处理此类问题,它必须在 XML 中定义,这不仅有助于可访问性,还有助于任何 UI 测试。即使您有一个 ID/文本,也可能是多个视图具有相似的文本和/或 ID 的情况
在您的情况下 - 在 XPath 中划分元素应该用一个斜杠“/”来完成 这是一个例子
driver.findElement(By.xpath("//android.widget.FrameLayout[1]/android.view.View[3]/android.widget.EditText[0]"));
【讨论】:
【参考方案2】:在您的 XPath 表达式中,您试图获取所有 <android.widget.FrameLayout[1]>
元素。查看您的 xml,您的文档只有一个 <hierarchy>
和多个 <node>
元素。这就是为什么你没有得到任何结果。
假设您使用 C# 进行编码,请尝试以下操作:
driver.findElementByXPath(@"//node[@class = ""android.widget.EditText""]));
使用 @ 告诉编译器使用字符串文字,所以你不需要
需要转义字符。
//node
返回所有 <node>
元素
在当前的 xml 文档中。
[@class = ""android.widget.EditText""]
告诉您的 XPath 表达式您需要具有类属性和值的元素
等于“android.widget.EditText”。
需要双引号
因此 Visual Studio 将“android.widget.EditText”识别为字符串值。
请注意,使用 // 不是查询 xml 的一种非常有效的方式。始终尽量避免它并缩小您的 XPath 表达式。 一个不错的 XPath 示例列表 \ 来自 Microsoft here 的备忘单。它应该可以帮助您完成这项工作。
【讨论】:
感谢您的回复。我不是在编写 C# 代码。正则表达式是否适用于 java 编码。 我对java不是很熟悉,但是XPath表达式的语法应该是差不多的。查找如何在 java 中转义字符应该可以让您到达您想要的位置。 尝试使用 //node[@class='android.widget.EditText'] 但这不起作用。 :( 在online XPath tester 中尝试//node[@class='android.widget.EditText']
,它有效,它是正确的XPath 表达式。只需将您的 xml 粘贴到那里(确保其格式正确)。我能想到2个可能的问题。您的 java 特定语法错误,或者您应用表达式的 xml 不包含该元素。在应用 XPath 表达式之前尝试检查代码中的页面源。
在线 XPath 测试器得到了我预期的正确答案。但它仍然没有在 UI 中找到该元素。代码被挂起,我需要手动终止代码而不是每次都找到元素。以上是关于如果有多个具有相同类名且没有资源 ID 的元素,如何检查元素的主要内容,如果未能解决你的问题,请参考以下文章
多个具有相同 id 且需要选择一个的复选框 - jquery