Page tree
Skip to end of metadata
Go to start of metadata

By Eynav Cohen and Jacob Komarovsky

With the introduction of iOS 10, Apple has deprecated its legacy UI Automation framework and instructed all developers to start using the XCUITest framework, introduced in iOS 9. Perfecto’s automation solution so far relied on the UI Automation framework for extracting the native object tree. 

Perfecto now supports automation for iOS devices based on the XCUITest framework. While using the XCUITest-based infrastructure is optional for iOS 10, it is mandatory to ensure support for iOS 11, which to date does no longer includes support for UI automation. 

The XCUITest-based infrastructure is integrated with the latest Appium 1.6 server software, which allows your Appium automation scripts to take advantage of the following benefits:

  • XCUITest's enhanced performance.
  • Automating new iOS functionality, like 3D Touch or Siri injection.
  • Provide the latest function updates from Appium IosDriver classes.

Enabling the XCUITest-based automation infrastructure does not affect current automation scripts or general behavior. The current UI Automation-based ios automation infrastructure continues to work seamlessly with the new infrastructure enabled.

 

Supported Frameworks

iOS 10: The infrastructure is available for Appium and Quantum users. In future releases, Perfecto will also enable the XCUITest-based infrastructure for manual testing support, native automation, UFT, and other automation frameworks.

iOS 11: Full automation support across all frameworks: Appium, Quantum, UFT, native automation, interactive an more.

Supported Devices

The XCUITest-based infrastructure is supported on the following Apple models running iOS 10 or later:

iPhones:

  • iPhone 7 Plus
  • iPhone 7
  • iPhone 6s Plus
  • iPhone 6s
  • iPhone SE
  • iPhone 6 Plus
  • iPhone 6
  •  iPhone 5s

iPads:

  • iPad Pro
  • iPad Air 2
  • iPad Air
  • iPad mini 4
  • iPad mini 3
  • iPad mini 2

Other devices, or any device running iOS 9 and below should continue to be automated using the UI automation based infrastructure. 

How to use the XCUITest-based infrastructure

To prepare your Perfecto Lab and automation scripts to use the new automation infrastructure, you need to perform a few simple procedures:

  1. Enable the infrastructure on your Perfecto Lab.
  2. Add the relevant capability to your Appium scripts to use the XCUITest infrastructure.
  3. Adjust your object locators.
  4. Verify that your script does not use any deprecated commands or methods.

The following sections detail these procedures.

Enable the XCUITest-based infrastructure on your Perfecto Lab

Contact your CSM or Perfecto Support to request that the XCUITest-based automation infrastructure be enabled for your CQ Lab.

Changes to Appium Scripts

The migration to the XCUITest-based automation infrastructure requires some adaptations in existing Appium scripts. These are detailed in the sections below. 

Select the XCUITest-based automation infrastructure

Use the automationName capability with the value XCUITest to indicate the XCUITest framework as the target automation infrastrcture.

capabilities.setCapability("automationName", "XCUITest");

Adjust Object Locators

Apple's XCUITest framework introduced several changes to the object tree of native applications which may require changes in some XPath locators. The highlights of the changes include:

  • Xpath locators with XCUITest infrastructure framework support Xpath 1.0

  • Change of object class names: The UIA prefix of the UI element class names are replaced by a XCUIElementType prefix. For example, the Button element whose class-name is UIAButton in UIAutomation is identified as class XCUIElementTypeButton in the XCUITest framework. See Translation table below.

  • Introduction of the XCUIElementTypeOther class: This class is a container object introduced at various points in the Object Tree.

  • Changes to the Object Tree structure: Some objects may be mapped inside new containers that did not exist in the UI Automation tree, and some containers exposed in the UI Automation based tree may no longer be exposed in the XCUITest framework.

Note: When working with instrumented hybrid apps only the native portion of the tree is be affected by the above changes. Web applications are not affected by these changes.

Sample UI Object tree in different frameworks

The following shows a partial object tree for the status bar of an application. On the left is the UIAutomation tree, on the right the same tree in XCUITest.

<UIAWindow visible="true" ...>
    <UIAStatusBar visible="true" ...>
        <UIAElement label="No Service" visible="true" name="No Service" .../>
        <UIAElement label="3 of 3 Wi-Fi bars" visible="true" 
		    name="3 of 3 Wi-Fi bars" .../>
        <UIAElement label="1:19 PM" visible="true" 
		    name="1:19 PM" value="" .../>
        <UIAElement visible="true" label="100% battery power, Charging" 
		    name="100% battery power, Charging" .../>
    </UIAStatusBar>
</UIAWindow>
<XCUIElementTypeWindow type="XCUIElementTypeWindow" visible="true" ...>
    <XCUIElementTypeStatusBar type="XCUIElementTypeStatusBar" visible="true" ...>
      <XCUIElementTypeOther type="XCUIElementTypeOther" visible="false" .../>
      <XCUIElementTypeOther type="XCUIElementTypeOther" visible="true" ...>
        <XCUIElementTypeOther type="XCUIElementTypeOther" 
            name="5 of 5 bars, signal strength" visible="true" 
		    label="5 of 5 bars, signal strength" .../>
        <XCUIElementTypeOther type="XCUIElementTypeOther" value="SSID" 
          name="3 of 3 Wi-Fi bars" label="3 of 3 Wi-Fi bars" 
          visible="true" .../>
        <XCUIElementTypeOther type="XCUIElementTypeOther" name="9:41" 
          label="9:41" visible="true" .../>
        <XCUIElementTypeOther type="XCUIElementTypeOther" visible="false" 
          name="88% battery power, Charging" label="88% battery power, Charging"   .../>
        <XCUIElementTypeOther type="XCUIElementTypeOther" 
          name="100% battery power" label="100% battery power" 
          visible="false" .../>
      </XCUIElementTypeOther>
    </XCUIElementTypeStatusBar>
  </XCUIElementTypeWindow>

Tips & Tools for XPath Locators

Since the transition to the XCUITest-based infrastructure requires some effort in identifying object identifiers that need to change, Perfecto is providing several tips and tools to ease this task:

  • Create strong XPath locators by following the Do's and Dont's.
    → Strong locators are unique and easier to maintain across environments. These kind of XPath locators will match an an element on both UIAutomation-based Appium scripts and XCUItest-based Appium scripts in 95%.

  • Refrain from using XPaths that explicitly traverse the object tree.
    → Due to the restructuring of the object tree these locators are most likely to fail with XCUITest-based automation script.
  • It is recommended to verify that the XCUITest class names are used for the UI Elements. See table of translations below.

→ Perfecto added an auto translation mechanism from basic UI Automation locators to XCUITest locators which allows existing strong locators to work with the XCUITest-based infrastructure. For example, the XPath: //UIAButton[contains(@label, '9')] will be automatically translated to //XCUIElementTypeButton[contains(@label, '9')]

→ The translation mechanism also automatically translates the @class field used with UI automation to @type used with XCUITest. For example, the XPath: 

//*[@class='XCUITestElementTypeButton'] will be auto-translated to //*[@type='XCUIElementTypeButton']

The mechanism currently does not work well with compound expressions (when 'and' or 'or' operators are used)
The mechanism will not help when an explicit XPath traversing through the tree structure is used, due to the different layout of the element tree. 

 

  • Use this online tool to validate XPath locators in general and specifically for the XCUITest-based infrastructure to check the strength of your XPath locators and their compliance with XCUITest UI Element specifiers.

  • Try the Analyser to extract all locators from a given test code and validate them or XCUITest-based object tree locators.


  • If an XPath locator still fails after the required modification; use the Appium driver.getPageSource() method to retrieve the object tree from Appium, then 

 

      • Print the tree or save to a file to analyze how the object is identified within the script execution.
      • Update the XPath that the script uses to access the object.
      • Rerun the automation script to verify that the object is now identified.

  • Professional Services: In case the transition seems daunting or customers would like advice or guidance, please contact our customer success managers to coordinate relevant activity.

Element Type Translation Table

The following table presents the equivalences between the UIAutomation object class names and the XCUIElementType classes.  

UI Automation

XCUITest Equivalent

UIApplication

XCUIElementTypeApplication

UIAActionSheet

XCUIElementTypeSheet

UIAActivityIndicator

XCUIElementTypeActivityIndicator

UIAAlert

XCUIElementTypeAlert

UIAButton

XCUIElementTypeButton

UIACollectionCell

XCUIElementTypeCell

UIACollectionView

XCUIElementTypeCollectionView

UIAEditingMenu

XCUIElementTypeMenu

UIAElement

XCUIElementTypeAny

UIAImage

XCUIElementTypeImage

UIAKey

XCUIElementTypeKey

UIAKeyboard

XCUIElementTypeKeyboard

UIALink

XCUIElementTypeLink

UIAMapView

XCUIElementTypeMap

UIANavigationBar

XCUIElementTypeNavigationBar

UIAPageIndicator

XCUIElementTypePageIndicator

UIAPicker

XCUIElementTypePicker

UIAPickerWheel

XCUIElementTypePickerWheel

UIAPopover

XCUIElementTypePopover

UIAProgressIndicator

XCUIElementTypeProgressIndicator

UIAScrollView

XCUIElementTypeScrollView

UIASearchBar

XCUIElementTypeSearchField

UIASecureTextField

XCUIElementTypeSecureTextField

UIASegmentedControl

XCUIElementTypeSegmentedControl

UIASlider

XCUIElementTypeSlider

UIAStaticText

XCUIElementTypeStaticText

UIAStatusBar

XCUIElementTypeStatusBar

UIASwitch

XCUIElementTypeSwitch

UIATabBar

XCUIElementTypeTabBar

UIATableCell

XCUIElementTypeTableColumn

XCUIElementTypeTableRow

UIATableGroup

XCUIElementTypeOther

UIATableView

XCUIElementTypeTable

UIATextField

XCUIElementTypeTextField

UIATextView

XCUIElementTypeTextView

UIAToolbar

XCUIElementTypeToolbar

UIAWebView

XCUIElementTypeWebView

UIAWindow

XCUIElementTypeWindow

Samples

The Perfecto Git repository includes different sample scripts that use the XCUITest-based automation infrastructure to automate different applications on devices running iOS 10 or later.

The following code snippet demonstrates the use of the XCUITest-based infrastructure to identify an iOS PickerWheel object and provide a value for the picker:

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
...
driver.findElementByXPath("//*[@label=\"Single\"]").click();
                                
 // locate the "names" picker wheel
WebElement picker = driver.findElementByXPath("//*[@label=\"namesPicker\"]");
picker.sendKeys("Adam");

// switch to different value
picker.sendKeys("Derek");

// test on "food" picker
driver.findElementByXPath("//*[@label=\"Double\"]").click();
picker = driver.findElementByXPath("//*[@label=\"namesPicker\"]");
picker.sendKeys("Vegemite");
picker.sendKeys("Rye");

 

Deprecated Appium methods and classes

Perfecto's XCUITest-based infrastructure is integrated with version 1.6 of Appium. In this server version, Appium has depreciated several methods and APIs.

Appium automation scripts with XCUITest enabled should adjust these automation scripts according to following Appium APIs changes:

  • Deprecation of scrollTo and scrollToExact methods.  

    → use the executeScript("mobile: scroll") script command instead.

    Map<String,Object> params = new HashMap<String,Object>();
    params.put("direction","down");
    params.put("element", ((RemoteWebElement)tbl).getId());
    driver.executeScript("mobile: scroll", params);
  • Deprecation of AppiumDriver touch methods  -  tap, swipe, zoom, pinch, and getMouse
    → Use Appium TouchAction or MultiTouchAction, or Perfecto Touch Extensions

  • findElement using IosUIAutomation not supported – includes findElementByIosUIAutomation() method and driver.findElement(MobileBy.IosUIAutomation(""))

     

API changes & Known Limitations

Working with Perfecto framework and XCUITest:

Following the transition to the XCUITest-based infrastructure, Perfecto will no longer maintain two different object trees: Appium tree and Perfecto tree (both trees are based on Apple’s deprecated UIAutomation framework).

Any device using XCUITest framework will only be able to retrieve an Appium tree.

There are some differences between Perfecto’s tree and XCUITest’s tree. These differences stem from changes introduced by Apple's automation framework.

In order to maintain backward compatibility, Perfecto backward compatible as much as possible, added a mechanism to translate Perfecto-compatible XPath expressions to XCUITest-compatible ones.
This mechanism translates an XPath capable of locating a certain object in Perfecto’s tree to an XPath that locates the same object in XCUITest’s tree.
However, this mechanism cannot ensure a 100% rate of success. ‘Strong’/’Smart’ XPath expressions should have no issues while ‘weak’ expressions might fail.

The major differences between the two frameworks (and object trees) are:

  • Class type names have changes. For example, ‘button’ -> ‘XCUIElementTypeButton’.
  • There is no @text attribute so it should not be used to create object locators.
  • Using text() function may fail as objects in XCUITest framework don’t have a text node value.
  • The values of @x, @y, @width, @height attributes might be different and should not be relied on when constructing an XPath locator.
  • Absolute XPath expressions (and sometimes relative ones as well) will most likely fail because in XCUITest framework there are container objects of type ‘XCUIElementTypeOther’ added at various point to the objects tree by the OS.

Better alignment with Appium API:

As part of the effort to better align with Appium APIs, the following Perfecto extended functions are no longer supported. Scripts will throw an exception with the message: the command is not supported with capability automationName - XCUITest.

Please use a compatible Appium method instead:

Note: The above is ONLY applicable to iOS automation, and ONLY to scripts running on the XCUITest-based automation infrastructure. Android scripts or scripts running on the UI Automation based infrastructure are NOT affected. 

Improvements over current level of Appium API support

Appium has declared a list of known Issues with some APIs when used with the XCUITest framework.
→ Methods: Perfecto's Appium solution supports the APIs on the list - except for the shake command - in order to minimise the required modifications for Appium XCUITest scripts. 

→ Capabilities :Auto accepting/dismissing alerts funcinlaty is missing with Appium XCUITest driver (see #issue 6864)

                        Use the following methods in run-time instead:

driver.switchTo().alert().accept();  // to accept an alert 
driver.switchTo().alert().dismiss(); // to dismiss an alert 
driver.switchTo().alert().getText(); // to get alert text

 

APIs under development

As part of Perfecto's support of the XCUITest framework, the following features are not fully supported as they are under development and will become available in future releases:

  • The following Appium classes and methods are not supported:
    • io.appium.java_client.FindsByIosNSPredicate class (supported in V10.7)
    • io.appium.java_client.MobileBy.ByIosNsPredicate class (supported in V10.7)
    • io.appium.java_client.pagefactory.iOSXCUITFindBy annotation (supported in V10.7)
    • io.appium.java_client.ios.IOSTouchAction#doubleTap(WebElement, int, int)
    • io.appium.java_client.ios.IOSTouchAction#doubleTap(WebElement)

  • The following Desired Capabilities are currently not supported
    • fullReset (supported in V10.8)
    • noReset
    • useNewWDA
    • Capabilities defined as part of the IOSMobileCapabilityType class:
    • CUSTOM_SSL_CERT
    • TAP_WITH_SHORT_PRESS_DURATION
    • SCALE_FACTOR
    • WDA_LOCAL_PORT
    • SHOW_XCODE_LOG
    • REAL_DEVICE_LOGGER
    • IOS_INSTALL_PAUSE
    • XCODE_CONFIG_FILE
    • KEYCHAIN_PASSWORD
    • KEYCHAIN_PATH
    • USE_PREBUILT_WDA
    • PREVENT_WDAATTACHMENTS
    • WEB_DRIVER_AGENT_URL
    • CLEAR_SYSTEM_FILES