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

Posted

技术标签:

【中文标题】枚举 Appium 的 Selenium Python 绑定中的所有元素【英文标题】:Enumerate all elements in Selenium Python bindings for Appium 【发布时间】:2013-03-16 21:00:12 【问题描述】:

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

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

但我完全是新手,我不清楚如何识别公司应用中的控件。我对 Python 很熟悉,所以我想我会构建一个控制元素列表并对其进行内省。

我被困住了!像driver.find_elements_by_tag_name() 这样的所有方法都需要一个特定的标识符(或者至少我还没有找到任何有效的通配符)。

如何自省表示被测 Android 应用的 Appium 元素树?我怎样才能枚举所有元素以便我可以反省它们?有没有一棵树可以让我找到应用中的所有元素?

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

附:我更喜欢使用 Python,但如果效果更好,我愿意使用其他东西来进行内省。我仍然可以用 Python 编写实际的测试,除非另一种语言在某种程度上更好。

【问题讨论】:

【参考方案1】:

我仍然想要一种从 Python 内省 Selenium 接口的方法。但是我找到了一种可行的方法来清楚地了解应用程序的布局,然后很容易弄清楚如何编写 Selenium 测试。

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

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

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

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

#elem = driver.find_element_by_name('Graphics')
elem = driver.find_elements_by_tag_name('TextView')[5]

注释掉driver.find_element_by_name() 调用,而是在整个应用程序中找到第六个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_element_by_name() 好,但它表明我在正确的轨道上。

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

【讨论】:

【参考方案2】:

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 应用程序还是 Android 应用程序测试的?我敢打赌它适用于 iOS,但我认为它不适用于 Android。

以上是关于枚举 Appium 的 Selenium Python 绑定中的所有元素的主要内容,如果未能解决你的问题,请参考以下文章

有了selenium为啥还有appium

有了selenium为啥还有appium

appium的webdriver和selenium有啥区别?

Appium搭建五:安装selenium+Appium-Python-Client

Selenium 和 Appium 有啥区别?

selenium与appium怎样联系