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

问题描述:

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

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

但我是一个新手,我没有清晰的图片来说明如何识别我公司的应用程序中的控件。我对Python很有经验,所以我想我只是建立一个控制元素列表并反思它们。

我被卡住了!所有的方法,如driver.find_elements_by_tag_name()需要一个特定的标识符(或者至少我没有找到任何通配符工作)。

如何反思代表被测试Android应用程序的元素的Appium树?我如何列举所有元素,以便我可以反思它们?有没有一棵树,我可以走,找到应用程序中的所有元素?

我希望能够弄清楚这些元素,而无需获取应用程序的源代码,在Eclipse中构建应用程序等,但如果有必要,我可以这样做。

P.S.我宁愿使用Python,但如果这种方法效果更好,则可以使用其他方法来进行内省。我仍然可以用Python编写实际的测试,除非其他语言以某种方式明显更好。

我仍然想从Python中反思Selenium接口。但是我已经找到了一种可行的方法来清晰地展示应用程序的布局,然后很容易就可以知道如何编写Selenium测试。

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

一旦完成该操作,应用程序的图像出现了,左边是截图,右边是可浏览的树大纲。大纲显示应用程序的所有控件以及其文本标签(如果有)以及其他信息(例如clickable属性是否为该控件的truefalse)。

一个警告:控件显示编号,但在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的,请让我知道它。

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 
+0

谢谢你的答案。我已经尝试过了,并且它不适用于我......测试会话因错误而终止。你是用iOS应用程序还是Android应用程序测试它的?我敢打赌它适用于iOS,但我认为它不适用于Android。 – steveha 2013-03-29 02:35:08