Android 枚举Appium的Selenium Python绑定中的所有元素

Android 枚举Appium的Selenium Python绑定中的所有元素,android,python,selenium,appium,Android,Python,Selenium,Appium,我正在尝试使用Appium开始测试我公司的移动应用程序。我希望使用Python绑定来编写脚本,我需要从Android应用程序开始 我的Appium示例都能正常工作。我可以运行grunt-android,测试正常,我还可以运行android.py示例应用程序 但我是一个完全的新手,我不清楚如何识别公司应用程序中的控件。我对Python很有经验,所以我想我只需要构建一个控制元素列表并对它们进行反思 我卡住了!所有像driver.find\u elements\u by\u tag\u name()这

我正在尝试使用Appium开始测试我公司的移动应用程序。我希望使用Python绑定来编写脚本,我需要从Android应用程序开始

我的Appium示例都能正常工作。我可以运行
grunt-android
,测试正常,我还可以运行
android.py
示例应用程序

但我是一个完全的新手,我不清楚如何识别公司应用程序中的控件。我对Python很有经验,所以我想我只需要构建一个控制元素列表并对它们进行反思

我卡住了!所有像
driver.find\u elements\u by\u tag\u name()
这样的方法都需要一个特定的标识符(或者至少我没有找到任何有效的通配符)

我如何反思代表被测Android应用程序的Appium元素树?我怎样才能列举所有的元素,这样我才能反思它们?是否有一棵树,我可以通过它找到应用程序中的所有元素

我希望我可以在不需要获取应用程序源代码、在Eclipse中构建应用程序等的情况下找出这些元素,但如果必要,我可以这样做


另外,我更喜欢使用Python,但如果效果更好的话,我愿意使用其他工具来进行内省。我仍然可以用Python编写实际的测试,除非另一种语言有明显的改进。

我仍然希望有一种方法可以从Python中反思Selenium接口。但是我已经找到了一种可行的方法来获得应用程序布局的清晰图像,并且很容易找到如何编写Selenium测试的方法

首先,让你的应用程序在连接到Android开发计算机的真实设备上运行,或者在模拟器中运行。基本上,如果您运行
adb设备
,您希望看到一台设备,即运行应用程序的设备。接下来,运行
uiautomatorviewer
工具,然后单击
设备屏幕截图
工具栏图标。(只有两个工具栏图标:第一个是
Open
图标,看起来像一个文件夹,而您想要的图标看起来像一堆手机。)

完成此操作后,将显示应用程序的图像,左侧为屏幕截图,右侧为可浏览的树轮廓。大纲显示了应用程序的所有控件,以及它们的文本标签(如果有的话)和其他信息(例如,对于该控件,
可点击的
属性是
true
还是
false

一个警告:控件显示为编号,但在Selenium绑定中,编号可能不同。在
ApiDemos
示例应用程序中,
Graphics
按钮的索引号为4,因为它是第五个按钮,但要按其位置访问它,我必须使用索引5。索引0是一个不可单击的对象,其中包含文本“API演示”,位于构成屏幕标题的不同
FrameLayout
对象中

因此,我能够对
android.py
脚本进行以下更改:

#elem = driver.find_element_by_name('Graphics')
elem = driver.find_elements_by_tag_name('TextView')[5]
注释掉
驱动程序。通过\u name()
调用查找\u元素,然后在整个应用程序中查找第六个
TextView
。这不是最佳实践,但它表明,
uiautomationviewer
结果确实允许我查看我需要了解的有关控件的信息

现在我有足够的知识来做一点自我反省:

for elem in driver.find_elements_by_tag_name('TextView'):
    if elem.text == "Graphics":
        break
else:
    print("Could not find desired item")
这并不比只调用
driver.find\u element\u by\u name()
要好,但这表明我的思路是正确的


uiautomatorviewer
是解决我问题的实用方法。如果您有纯Python的,请告诉我。

Appium支持WebDriver的“页面源代码”方法。所以你可以这样做:

# assume you have a driver object
import json

source = driver.page_source
source = json.loads(source)
# you can now work with source as a python object

谢谢你的回答。我已经试过了,但对我不起作用。。。测试会话因错误而终止。你是用iOS应用程序还是安卓应用程序测试的?我敢打赌它在iOS上能正常工作,但我认为它在Android上还不能正常工作。