使用苹果的可访问性api在mac上自动测试用cocoa编写的gui应用程序

atomac的Python项目详细描述


简介

我们很高兴介绍第一个python库,通过apple accessibility api对mac应用程序进行gui测试。这个图书馆是出于绝望而建立的。现有的工具,例如使用AppScript将消息发送到Access对象是痛苦的,写起来慢用。atomac可以直接访问api。编写测试既快捷又容易。

开始

Atomac需要安装运行OSX和Xcode的系统。它已经在10.6、10.7和10.8上进行了广泛的测试。10.5可以工作。如果您在特定版本的os x上遇到atomac问题,请在问题跟踪程序中打开问题单。

必须启用系统范围的可访问性。选中复选框:系统首选项>;通用访问>;启用辅助设备访问。在某些模块使用期间,如果不启用此选项,将导致errorapidisabled异常。

安装应该像运行以下命令行一样简单,该命令行将下载、构建和安装atomac:

$ sudo easy_install atomac

用法

一旦安装了Atomac模块,您就可以使用它启动应用程序:

>>> import atomac
>>> atomac.launchAppByBundleId('com.apple.Automator')

这将启动自动机。接下来,获取应用程序本身的ui元素的引用:

>>> automator = atomac.getAppRefByBundleId('com.apple.Automator')
>>> automator
<pyatom.AXClasses.NativeUIElement AXApplication u'Automator'>

现在,我们可以在辅助功能层次结构中找到对象:

>>> window = automator.windows()[0]
>>> window.AXTitle
u'Untitled'
>>> sheet = window.sheets()[0]

注意,我们从窗口对象axtitle中检索了一个可访问性属性。atomac支持大多数属性的读写。使用xcode附带的辅助功能检查器可以提供一种快速查找这些属性的方法。

有一个获取工作表对象的快捷方式,它绕过了通过窗口对象访问它-Atomac可以搜索层次结构中的所有对象:

>>> sheet = automator.sheetsR()[0]

大多数类型的可访问性对象都有搜索方法。每个搜索方法,比如windows,都有相应的递归搜索函数,比如windowsR。递归搜索查找的项不只是直接子项,而是子项的子项。这些搜索方法可以被赋予识别特定元素的术语。注意到了吗?可在所有Atomac搜索方法中用作通配符匹配字符:

>>> close = sheet.buttons('Close')[0]

atomac有一个方法来搜索符合任意数量条件的ui元素。条件是辅助功能属性:

>>> close = sheet.findFirst(AXRole='AXButton', AXTitle='Close')

FindFirstFindFirstR返回找到的与条件匹配的第一个项或无。FindAllFindAllR返回所有符合条件的项的列表或空列表。

对象相当多用。您可以获取对象上支持的属性和操作的列表:

>>> close.getAttributes()
[u'AXRole', u'AXRoleDescription', u'AXHelp', u'AXEnabled', u'AXFocused',
u'AXParent', u'AXWindow', u'AXTopLevelUIElement', u'AXPosition', u'AXSize',
u'AXTitle']
>>> close.AXTitle
u'Close'
>>> close.getActions()
[u'Press']

执行一个动作是很自然的:

>>> close.Press()

任何动作都可以这样触发。

ldtp

从1.0.0版开始,atomac现在包括了与ldtp的兼容性,ldtp是一个跨平台的自动化库。这允许测试人员编写一个脚本,在linux、windows和现在的mac os x上自动化测试用例。有关ldtp的信息和文档可以在LDTP home page上找到。

ldtp操作实际上与linux上的操作相同。导入机制略有不同,因为它与atomac一起提供。在被测系统上执行的跨平台脚本应导入ldtp客户端,如下所示:

try:
    import ldtp
except ImportError:
    import atomac.ldtp as ldtp

在未来,ldtp客户端可能会被分解成一个独立于平台的模块来解决这个问题。

与linux平台一样,ldtp守护进程可以在sut上运行,通过在shell提示符下执行ldtp来启用客户机/服务器测试。有关客户机/服务器操作的详细信息,请参阅ldtp文档。

待办事项和贡献

尽管atomac功能齐全,在vmware上驱动了数百个自动化测试用例,但我们有一个任务清单,可以使项目变得更好。

  • 格式化-此代码当前不符合PEP-8。
  • 更好的鼠标操作-例如,一种从一个ui元素平滑地拖动到另一个ui元素的方法。
  • 清理搜索方法-我们可以使用curring以更干净的方式定义axclasses中的所有搜索方法。

请随意提交针对github上项目的pull请求。如果您对开发atomac本身感兴趣,请注册pyatom dev邮件列表。

许可证

atomac是在gnu通用公共许可下发布的。有关详细信息,请参见copying.txt。

作者

詹姆斯·塔图姆,jtatum@gmail.com>;, 安德鲁·吴, 杰西门多卡, 肯宋, 纳加潘阿拉加潘, 李英军,

以及变更日志文件中列出的其他贡献者。非常感谢!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Play Framework 2.1中的简单搜索?   java:Springbeans的真正工作原理   java不能从字符串中提取数字   不同管道中的java共享ExecutionHandler   在Java中,如何为扩展comparator的类实现多个comparator方法?   通用混沌Java   java问题:从自定义类获取要添加到驱动程序类的形状   java如何利用HikariCP和Hibernate?   eclipse如何执行Java应用程序?   用户界面Java Swing:如何将JLabel的文本绑定到JTable选定行中的列?   java替换JPanel元素而不添加到面板的末尾?   java Sets根据action命令在按钮组中选择了特定的jradiobutton   在java中如何将从控制台添加的字符串中的元素添加到列表中   处理未在浏览器上运行的Java签名小程序   java如何在我的安卓应用程序中单击任意按钮时禁用音频音调?   编码如何在Java中将十六进制转换为utf8编码的字符串   java JSF Spring安全集成问题   java如何更正Oracle for Windows中的字符?   java Spark结构化流媒体:当前批次落后   java Hibernate根据最匹配的条件排序结果