Skip to main content

Introduction

We are pleased to introduce the first Python library to fully enable GUI testing of Mac applications via the Apple Accessibility API. This library was created out of desperation. Existing tools such as using appscript to send messages to accessibility objects are painful to write and slow to use. ATOMac has direct access to the API. It’s fast and easy to use to write tests.

Getting started

ATOMac requires a system running OS X and Xcode installed. It has been tested extensively on 10.6, 10.7, and 10.8. 10.5 may work. If you experience issues with ATOMac on a particular version of OS X, please open a ticket in the issue tracker.

Systemwide accessibility must be enabled. Check the checkbox: System Preferences > Universal Access > Enable access for assistive devices. Failure to enable this will result in ErrorAPIDisabled exceptions during some module usage.

Installation should be as simple as running the following command line, which will download, build and install ATOMac:

$ sudo easy_install atomac

Usage

Once the atomac module is installed, you should be able to use it to launch an application:

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

This should launch Automator. Next, get a reference to the UI Element for the application itself:

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

Now, we can find objects in the accessibility hierarchy:

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

Note that we retrieved an accessibility attribute from the Window object - AXTitle. ATOMac supports reading and writing of most attributes. Using Xcode’s included accessibility inspector can provide a quick way to find these attributes.

There is a shortcut for getting the sheet object which bypasses accessing it through the Window object - ATOMac can search all objects in the hierarchy:

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

There are search methods for most types of accessibility objects. Each search method, such as windows, has a corresponding recursive search function, such as windowsR. The recursive search finds items that aren’t just direct children, but children of children. These search methods can be given terms to identify specific elements. Note that * and ? can be used as wildcard match characters in all ATOMac search methods:

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

ATOMac has a method to search for UI Elements that match any number of criteria. The criteria are accessibility attributes:

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

FindFirst and FindFirstR return the first item found to match the criteria or None. FindAll and FindAllR return a list of all items that match the criteria or an empty list.

Objects are fairly versatile. You can get a list of supported attributes and actions on an object:

>>> 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']

Performing an action is as natural as:

>>> close.Press()

Any action can be triggered this way.

LDTP

Starting with version 1.0.0, ATOMac now includes compatibility with LDTP, a cross platform automation library. This allows testers to write a single script that will automate test cases on Linux, Windows, and now Mac OS X. Information and documentation on LDTP can be found at the LDTP home page.

LDTP operation is virtually identical to the operation on Linux. The import mechanism is slightly different, since it is shipped with ATOMac. Cross platform scripts executing on the System Under Test should import the LDTP client as follows:

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

In the future, the LDTP client may be broken out into a separate platform independent module to ameliorate this issue.

Like the Linux platform, the LDTP daemon may be run on the SUT, enabling client/server testing by executing ‘ldtp’ at a shell prompt. See the LDTP documentation for more details on client/server operation.

Todo and contributing

Although ATOMac is fully functional and drives hundreds of automated test cases at VMware, we have a to-do list to make the project even better.

  • Formatting - this code is not currently PEP-8 compliant.

  • Better mouse handling - for example, a method to smoothly drag from one UI Element to another.

  • Cleanup the search methods - We could use currying to define all the search methods in AXClasses in a cleaner way.

Feel free to submit pull requests against the project on Github. If you’re interested in developing ATOMac itself, sign up to the pyatom-dev mailing list.

See also

License

ATOMac is released under the GNU General Public License. See COPYING.txt for more details.

Authors

James Tatum <jtatum@gmail.com>, Andrew Wu, Jesse Mendonca, Ken Song, Nagappan Alagappan, Yingjun Li, Alexey Kostyrin

And other contributors listed in the CHANGELOG file. Thank you so much!

Release files for pyatomac 2.0.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyatomac 2.0.7
File Size Uploaded
pyatomac-2.0.7.tar.gz 80.0 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for pyatomac 2.0.7
File Interpreter ABI Platform
pyatomac-2.0.7-cp36-cp36m-macosx_10_6_intel.whl CPython 3.6 CPython 3.6 pymalloc macOS 10.6+ Intel (x86-64, i386) Details
pyatomac-2.0.7-cp27-cp27m-macosx_10_6_intel.whl CPython 2.7 CPython 2.7 pymalloc macOS 10.6+ Intel (x86-64, i386) Details

Total release size: 301.2 kB

Release files / pyatomac-2.0.7.tar.gz

Download URL pyatomac-2.0.7.tar.gz
Size 80.0 kB
Tags Source
SHA-256 checksum
How to use checksums
ac19ae2e1e0e3e6fc2bb04b7c674776343653e9fd45f808246ffa6d745de491a
BLAKE2b-256 checksum
How to use checksums
1a24d6158dec63af575c00ae119f8b1ec856c7e2c55e39282acf2993a09d3418
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / pyatomac-2.0.7-cp36-cp36m-macosx_10_6_intel.whl

Download URL pyatomac-2.0.7-cp36-cp36m-macosx_10_6_intel.whl
Size 110.6 kB
Tags CPython 3.6 CPython 3.6 pymalloc macOS 10.6+ Intel (x86-64, i386)
SHA-256 checksum
How to use checksums
188829f520f71116690c3b8fad7ee67fb3700e42d01070610cb4365c524d2f9f
BLAKE2b-256 checksum
How to use checksums
54fc4dde0d17df32a39cf1b88f2285ff9a3e2ba093c09a753ed34b9385d59d83
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / pyatomac-2.0.7-cp27-cp27m-macosx_10_6_intel.whl

Download URL pyatomac-2.0.7-cp27-cp27m-macosx_10_6_intel.whl
Size 110.5 kB
Tags CPython 2.7 CPython 2.7 pymalloc macOS 10.6+ Intel (x86-64, i386)
SHA-256 checksum
How to use checksums
014270926ec810e4bb937a62001f8c6743b40a560c37b9b2820a577c0ef569b0
BLAKE2b-256 checksum
How to use checksums
1e2d7a5a90aae5e0cc235d9538728900fddada56ef7f581192403ee7b51336d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

2.0.7 This release

3 release files

2.0.6

3 release files

2.0.5

3 release files

2.0.4

3 release files

2.0.3

3 release files

2.0.2

3 release files

2.0.1

3 release files

2.0.0

3 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page