Android 如何在appium中使用UIAutomator查找元素

Android 如何在appium中使用UIAutomator查找元素,android,appium,android-uiautomator,Android,Appium,Android Uiautomator,我正在使用appium测试android混合应用程序。谁能告诉我如何使用UIAutomator查找元素,因为appium提供的xpath在我的情况下不起作用 非常感谢 我在真实设备上测试我的应用程序(但也可以在Emulator上),连接到我的桌面并运行它,打开一些屏幕/页面。然后我以管理员身份运行uiautomatorviewer.bat(奇怪,但我必须以管理员身份运行它)。然后单击UI Automator Viewer左上角的设备截图图标,我可以在右窗格中看到截图和Android类。我可以导航

我正在使用appium测试android混合应用程序。谁能告诉我如何使用UIAutomator查找元素,因为appium提供的xpath在我的情况下不起作用


非常感谢

我在真实设备上测试我的应用程序(但也可以在Emulator上),连接到我的桌面并运行它,打开一些屏幕/页面。然后我以管理员身份运行uiautomatorviewer.bat(奇怪,但我必须以管理员身份运行它)。然后单击UI Automator Viewer左上角的设备截图图标,我可以在右窗格中看到截图和Android类。我可以导航、单击不同的元素并观察它们的层次结构。

我在真实设备上测试了我的应用程序(但也可以在Emulator上),并将其连接到我的桌面上运行,打开一些屏幕/页面。然后我以管理员身份运行uiautomatorviewer.bat(奇怪,但我必须以管理员身份运行它)。然后单击UI Automator Viewer左上角的设备截图图标,我可以在右窗格中看到截图和Android类。我可以导航、单击不同的元素并观察它们的层次结构。

术语链接上方的视图和列表视图是否具有资源id或文本属性

我认为您可以尝试以下方法:

xpath="(//android.widget.ListView[contains(@resource-id,'some_id')]//android.widget.View)[2]/android.widget.View"
尝试查找节点,然后创建到子节点的相对路径

// - means any after (any child)
/ - goes immediate after
[2] - the second item that corresponds the criteria

如果您知道文本属性的值,您可以使用类似以下内容:
[contains(@text,'some part of text')]

术语链接上方的视图和ListView是否具有资源id或文本属性

我认为您可以尝试以下方法:

xpath="(//android.widget.ListView[contains(@resource-id,'some_id')]//android.widget.View)[2]/android.widget.View"
尝试查找节点,然后创建到子节点的相对路径

// - means any after (any child)
/ - goes immediate after
[2] - the second item that corresponds the criteria
如果您知道文本属性的值,您可以使用类似以下内容:
[contains(@text,'some part of text')]

尝试以下操作:

driver.findElementsByXPath("//*[@class='android.view.View' and @index='0']");
试试这个:

driver.findElementsByXPath("//*[@class='android.view.View' and @index='0']");

按照此方法使用UIautomator-

self.driver.find_element_by_accessibility_id('SomeAccessibilityID').get_attribute('contentDescription')

按照此方法使用UIautomator-

self.driver.find_element_by_accessibility_id('SomeAccessibilityID').get_attribute('contentDescription')

不,它没有资源id或文本属性。但是术语链接视图有content-desc。所以我使用了driver.findElement(By.xpath(“//android.view.view[@content-desc='Terms-link']);现在,我的测试用例通过了,但在设备上并没有执行单击。我应该使用android.widget.View而不是android.View.View吗?不,因为我看到android.View.View的属性clickable=true。尝试计算屏幕上符合条件的元素数<代码>列表元素=driver.findElements(By.xpath(“//android.view.view[@content desc='Terms Link']);System.out.println(elements.size())另外,我建议您在Android设备设置(开发者)上设置触摸和点击,以便查看Appium脚本在哪里准确点击。它适用于屏幕上显示的元素,但不适用于滚动后显示的元素。是的,您可以看到您所看到的,与Appium的方式相同。它无法计算看不到的内容。不,它没有资源id或文本属性。但是术语链接视图有content-desc。所以我使用了driver.findElement(By.xpath(“//android.view.view[@content-desc='Terms-link']);现在,我的测试用例通过了,但在设备上并没有执行单击。我应该使用android.widget.View而不是android.View.View吗?不,因为我看到android.View.View的属性clickable=true。尝试计算屏幕上符合条件的元素数<代码>列表元素=driver.findElements(By.xpath(“//android.view.view[@content desc='Terms Link']);System.out.println(elements.size())另外,我建议您在Android设备设置(开发者)上设置触摸和点击,以便查看Appium脚本在哪里准确点击。它适用于屏幕上显示的元素,但不适用于滚动后显示的元素。是的,您可以看到您所看到的,与Appium的方式相同。它无法计算看不到的内容。请确保根据需要更改类名和索引。谢谢,这适用于设备屏幕上当前显示的元素,但适用于滚动后显示的元素,虽然我的测试用例在没有看到设备屏幕上的实际点击的情况下仍然通过,但对他们来说不起作用。@Suman它应该很简单。只需找到x和y坐标并滚动到它。然后使用我上面提到的相同方法单击元素确保根据需要更改类名和索引。谢谢,这适用于设备屏幕上当前显示的元素,但适用于滚动后显示的元素,虽然我的测试用例在没有看到设备屏幕上的实际点击的情况下仍然通过,但对他们来说不起作用。@Suman它应该很简单。只需找到x和y坐标并滚动到它。然后使用我上面提到的方法单击元素