如果有多个具有相同类名且没有资源 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 表达式中,您试图获取所有 &lt;android.widget.FrameLayout[1]&gt; 元素。查看您的 xml,您的文档只有一个 &lt;hierarchy&gt; 和多个 &lt;node&gt; 元素。这就是为什么你没有得到任何结果。

假设您使用 C# 进行编码,请尝试以下操作:

driver.findElementByXPath(@"//node[@class = ""android.widget.EditText""]));
使用 @ 告诉编译器使用字符串文字,所以你不需要 需要转义字符。 //node 返回所有 &lt;node&gt; 元素 在当前的 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

隐藏所有具有数值范围的 CSS 类

如何获取具有多个类但只知道其中一个的元素的类名

有多个具有相同名称且需要滑动打开的面板的页面

jQuery:当我有多个具有相同名称但唯一 id 的元素时,我可以按名称选择一个元素并读取它的 id 吗?

如何在表中选择Record的链接包含多个不同类的行,每列具有相同的类名