Decoding codeless Appium test automation with HeadSpin
Tags: devops, testing
Published: 2023-10-10 17:31:02

With the growing complexities of software applications, the need for test automation has risen significantly. Additionally, the dynamic consumer demands make it crucial for app-developing brands to deliver exceptional user experiences to ensure good customer loyalty and brand reputation. Of the major automation tools, several enterprises choose Appium as their primary for their [mobile app automation](https://www.headspin.io/blog/mobile-application-testing-guide) owing to multiple competitive advantages. It's open-source and cost-effective, which helps not only large enterprises but also growing businesses adopt this tool. However, gaining expertise in using the tool is often time-consuming and complex. Codeless or no-code automated testing has emerged as a game-changing approach that addresses this challenge. 

Codeless test automation offers unprecedented efficiency, accessibility, and collaboration. By eliminating the need for extensive programming knowledge, it empowers testers of all technical backgrounds to actively participate in the automation journey.

Today, codeless automation testing tools have gained significant popularity in the industry. The demand for these tools has increased as organizations strive to accelerate their testing processes and involve non-technical team members in test automation.

**Test automation with Appium**

Appium is often the top choice for enterprises as it is cross-platform and allows you to write UI tests for different Android, iOS, and Windows platforms with the same API. Therefore, it allows code reuse between Android, iOS, and Windows test scripts or suites.

The Appium architecture — how does codeless test automation work?
The architecture of the Appium framework consists of three key components: the Appium client, the Appium server, and the end device.

**1. Appium client:**

The Appium Client is a crucial component of the Appium framework that enables interaction with the Appium Server. It consists of software libraries and tools developers and testers use to write test scripts and send commands to the server. The Appium Client provides seamless integration with various programming languages, allowing testers to choose their preferred language for test script development. The client libraries provide APIs and methods that abstract the complexities of interacting with the Appium Server, making it easier to automate mobile application testing.

**2. Appium server:**

The Appium Server acts as a bridge between the Appium client and the end device, facilitating communication and control during the testing process. It receives commands from the Appium client and translates them into actions the end device can execute. The server manages device management tasks, such as device connection, installation of the application under test, and handling device-specific automation capabilities. It also provides the necessary drivers and interfaces to interact with platforms (iOS, Android) and automation frameworks (Selenium, XCUITest, UI Automator). The Appium server ensures a seamless and standardized approach to mobile app automation testing, abstracting the complexities of device management and allowing testers to focus on creating effective test scripts.

**3. End device:**

The end device refers to the actual mobile device or emulator on which the application under test is installed and executed. Depending on the targeted platform, it can be an iOS or Android device. The Appium server interacts with the end device to perform various actions, such as tapping, swiping, entering text, and validating responses. Through the Appium Server, testers can control the end device and simulate user interactions to automate the testing process. The end device plays a critical role in executing the test scripts and providing feedback to the Appium server, enabling testers to verify the functionality and performance of their mobile applications.

Overall, the Appium framework architecture ensures a seamless flow of commands and responses between the Appium client, Appium server, and end device. It empowers testers to write test scripts in their preferred programming language, interact with the Appium server for test execution, and leverage the capabilities of the end device to validate the functionality and user experience of their mobile applications.

**How does Appium work on iOS and Android platforms?**

Appium is a powerful tool that allows you to automate testing for both iOS and Android platforms. Here's how Appium works on iOS and Android:

Appium on iOS:

**1. XCUITest framework:** Appium leverages the XCUITest framework, Apple's official testing framework for iOS applications. XCUITest provides a set of APIs that allow Appium to interact with iOS applications, simulate user interactions, and retrieve information about the application's elements.

**2. WebDriverAgent:** Appium uses WebDriverAgent (WDA) to facilitate communication between the Appium server and the iOS device. The WDA is a lightweight server running on the iOS device that receives commands from the Appium server, executes them on the device, and sends back the responses.

**3. UIAutomation backend:** In earlier versions of iOS, Appium used the UIAutomation framework for automation. However, since iOS 9, Apple deprecated UIAutomation, and Appium switched to the XCUITest framework as the default automation backend for iOS.

**4. Xcode tools:** Appium relies on various Xcode tools, such as instruments and simctl, to install the application on the iOS simulator or physical device, manage device simulators, and perform other device-related operations.

Appium on Android:

**1. UIAutomator2 Framework:** Appium utilizes the UIAutomator2 framework as the automation backend for Android applications. UIAutomator2 provides APIs for interacting with the user interface elements of an Android application, capturing screenshots, and managing device-related operations.

**2. ADB (Android debug bridge):** Appium uses the ADB command-line tool to communicate with Android devices. ADB allows Appium to install the application under test, start and stop activities, interact with UI elements, and retrieve device information.

**3. Selendroid and Espresso:** Appium supports alternative automation backends like Selendroid and Espresso for specific scenarios. Selendroid is used for automating older Android versions, while Espresso is suitable for UI testing within an application.

**4. Device farms and cloud providers:** Appium integrates with various device farms and cloud providers, such as HeadSpin, AWS Device Farm, and Sauce Labs. These services provide access to a vast range of real devices for testing, allowing you to run Appium tests on multiple devices and configurations simultaneously.

**Significance of codeless Appium automatio**n

Codeless Appium automation is a game-changer for both technical and non-technical testers. It eliminates the need for extensive programming knowledge, enabling testers to create and execute automated tests using intuitive visual interfaces or drag-and-drop tools. The significance of codeless Appium automation lies in the following:

**- Enhanced efficiency:**Codeless testing streamlines the test creation process, allowing testers to design tests quickly and effortlessly. This approach saves time and effort, enabling faster test execution and quicker feedback on app quality.

**- Improved collaboration:**Codeless test automation fosters collaboration among testers, developers, and stakeholders. Its visual interfaces enable clear communication of test requirements, facilitating better collaboration and understanding among team members.

**- Accessible testing:**Codeless test automation democratizes testing by enabling non-technical testers to participate actively. Testers with limited programming skills can contribute effectively to automation efforts, enhancing overall codeless testing capabilities. Codeless test automation tools facilitate collaboration between team members by providing a common platform for test development. Test cases and components can be easily shared and reused across projects, promoting efficiency and consistency in test automation efforts.

**How does this architecture help in codeless automation?**

The Appium architecture provides a solid foundation for supporting codeless test automation and simplifying the process for testers. Here's how the Appium architecture helps in codeless automation testing:

**- Abstraction of complexities:**Appium abstracts the complexities of interacting with mobile devices and emulators, providing a simplified interface for testers. With codeless testing, testers can leverage visual interfaces, drag-and-drop tools, or intuitive frameworks that build upon the Appium architecture. These tools hide the underlying complexities of writing code and allow testers to create automated tests using a more user-friendly approach.

**- Standardized automation framework:**Appium follows the WebDriver protocol, a standardized protocol for automating web browsers and mobile devices. This standardization enables codeless automation testing platforms to integrate seamlessly with Appium. By adhering to the WebDriver protocol, codeless automation platforms can leverage the underlying capabilities of Appium and provide a consistent and reliable automation experience.

**- Device interaction and control:**The Appium architecture allows codeless automation platforms to interact with the underlying mobile devices and emulators. Testers can define actions, such as tapping, swiping, entering text, and validating responses, through visual interfaces or intuitive tools provided by the codeless automation platform. These platforms translate these actions into commands that Appium understands, enabling the automation of test scenarios without manual coding.

**- Integration flexibility:**Appium's flexibility in integration allows codeless automation platforms to seamlessly integrate with it. Depending on the platform and application type, the Appium architecture supports various automation frameworks, such as Selenium, XCUITest, and UI Automator. Codeless automation platforms can leverage these automation frameworks to enhance their visual interface or drag-and-drop capabilities, further simplifying the codeless automation process.

**- Test execution and reporting:**The Appium architecture handles the execution of codeless automated tests on mobile devices and emulators. It captures the interactions defined by testers through the codeless automation platform and translates them into device-specific actions. Appium also provides mechanisms for reporting test results, allowing testers to analyze the outcomes of their codeless automated tests and identify any issues or areas for improvement.

Following are a few examples of automating with Appium with corresponding code snippets:

**1. Launching an App:**

```java
// Java Example
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("platformName", "Android");
caps.setCapability("deviceName", "deviceName");
caps.setCapability("app", "/path/to/app.apk");

AppiumDriver<MobileElement> driver = new AndroidDriver<MobileElement>(new URL("http://localhost:4723/wd/hub"), caps);
```
**2. Interacting with Elements:**

```python
# Python Example
element = driver.find_element_by_id("elementId")
element.click()
# or
element = driver.find_element_by_xpath("//android.widget.Button[@text='Submit']")
element.sendKeys("Hello")
```
**3. Handling Alerts:**

```ruby
# Ruby Example
alert = driver.switch_to.alert
alert.accept()
```
**4. Scrolling and Swiping:**

```javascript
// JavaScript Example
const { press, moveTo, release } = require("webdriverio").TouchAction;
const element = driver.$("~elementId");
driver.touchAction([
  press({ element }),
  moveTo({ x: 0, y: -200 }),
  release(),
]);
```
**5. Taking Screenshots:**

```csharp
// C# Example
driver.GetScreenshot().SaveAsFile("path/to/screenshot.png", ScreenshotImageFormat.Png);
```
**How does HeadSpin integrate with Appium to ease coding complexities for test automation?**

Enterprises having existing Appium tests can seamlessly integrate them with HeadSpin and run on any HeadSpin device they have access to. With the Appium desktop, testers and QA teams can easily inspect the view hierarchy of an app, determine the selectors and directly generate Appium codes.

**● Automation Configuration API**

HeadSpin provides the Automation Configuration API, which offers optimal Desired Capabilities for specific devices and the WebDriver URL. Desired Capabilities are key-value pairs that define how you want your tests to run. The Automation Configuration API provides the necessary capabilities to configure and fine-tune your Appium tests for HeadSpin devices. By using the API, you can ensure compatibility and optimal performance for your automation scripts.

**● Launching Your Application **

HeadSpin simplifies the process of launching your application for codeless testing with Appium. For Android applications, you can specify the appPackage and appActivity values, which represent the Android app and the specific activity within the app that you want to launch. For iOS applications, you can specify the bundleId of the app. HeadSpin provides guidance on determining these values based on your app's source code or through other methods like using adb commands.

Here's an example:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.headspin.exampleapp">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".AppSuccess"
            android:label="@string/activity_success"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.headspin.exampleapp.MainActivity" />
        </activity>
    </application>
</manifest>

If you don't have access to the project source, you can still determine the appPackage and appActivity of your Android app using adb. Here's how: Install your app on a HeadSpin Device, launch it, and then use adb shell through the HeadSpin Remote ADB or REST API. Run the following command:

dumpsys window windows | grep -E ‘mCurrentFocus’

This command will provide you with the appPackage and appActivity information, which you can use for your Appium tests.

To automate testing on iOS using Appium, you need to specify the bundle identifier (bundleId) of the application. If you have the .xcodeproj or .xcworkspace source of the application, you can find the bundleId in the general section of the project information in Xcode.

Here's an example code snippet in Python that demonstrates how to set the bundleId for iOS automation in Appium:

from appium import webdriver

desired_caps = {
    'platformName': 'iOS',
    'platformVersion': '12.0',
    'deviceName': 'iPhone X',
    'bundleId': 'com.example.myapp'  # Replace with the actual bundleId of your app
}

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# Perform your test actions here

driver.quit()

**● Performing HeadSpin-Appium tests in different client languages** 

Following are some code snippets demonstrating how to configure the desired capabilities and specify the remote WebDriver URL in each language. You can refer to these examples for visual reference and guidance when implementing your Appium tests with HeadSpin.

**1. Java (Appium Java client):**

import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.net.URL;

public class HeadSpinAppiumTest {
    public static void main(String[] args) {
        try {
            DesiredCapabilities caps = new DesiredCapabilities();
            caps.setCapability("platformName", "Android");
            caps.setCapability("deviceName", "your_device_name");
            caps.setCapability("appPackage", "your_app_package");
            caps.setCapability("appActivity", "your_app_activity");
            caps.setCapability("headspin:appiumVersion", "1.20.2"); // Set HeadSpin Appium version
            
            URL serverUrl = new URL("http://localhost:4723/wd/hub");
            AndroidDriver<MobileElement> driver = new AndroidDriver<>(serverUrl, caps);

            // Write your test code here
            
            driver.quit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

**2. Python (Appium Python client):**


from appium import webdriver

desired_caps = {
    'platformName': 'Android',
    'deviceName': 'your_device_name',
    'appPackage': 'your_app_package',
    'appActivity': 'your_app_activity',
    'headspin:appiumVersion': '1.20.2'  # Set HeadSpin Appium version
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# Write your test code here

driver.quit()

**3. JavaScript (WebdriverIO with Appium):**


const { remote } = require('webdriverio');
async function runTest() {
    const opts = {
        path: '/wd/hub',
        port: 4723,
        capabilities: {
            platformName: 'Android',
            deviceName: 'your_device_name',
            appPackage: 'your_app_package',
            appActivity: 'your_app_activity',
            'headspin:appiumVersion': '1.20.2' // Set HeadSpin Appium version
        }
    };
    const client = await remote(opts);    
    // Write your test code here    
    await client.deleteSession();
}

runTest();

These code snippets demonstrate how to initialize the Appium driver with the HeadSpin-specific capabilities such as headspin:appiumVersion. You can customize the desired capabilities according to your codeless testing requirements and write your test logic within the appropriate sections.

**HeadSpin Appium capabilities **

The Appium HeadSpin capabilities include additional features and enhancements provided by HeadSpin for running Appium tests on the HeadSpin Platform. These capabilities are designed to enhance your codeless testing experience and provide valuable insights into both functional and non-functional aspects of your mobile app.

In addition to the standard capabilities offered by Appium and the W3C WebDriver specifications, the HeadSpin Appium server running on each HeadSpin host supports custom capabilities specific to HeadSpin. These capabilities extend the functionality of Appium and allow you to leverage the features provided by HeadSpin's platform.

One notable capability is the HeadSpin Appium Inspector Integration. This integration enables you to identify UI elements of your mobile app while developing Appium automation scripts directly in the HeadSpin Device Remote Control UI. It eliminates the need for setting up simulators/emulators and downloading apps separately, streamlining the development environment for Appium.

**HeadSpin’s support for Appium 2.0**

HeadSpin completely supports the latest version of Appium that provides additional support for new platforms through the creation of custom drivers. Appium 2.0 introduces the concept of plugins, allowing third-party developers to extend or modify Appium's functionalities and share their contributions with the community.

At HeadSpin, we have embraced this new capability by developing and offering several free and open-source media platform drivers, including drivers for Roku, Samsung Tizen TV, and LG webOS TV. Additionally, we have created the Appium AltUnity Plugin, enabling compatibility with Unity games. 

If you are an Appium user, rest assured that we have prepared a comprehensive migration guide to assist you in transitioning to Appium 2.0 on the HeadSpin Platform. Upgrading on HeadSpin is made even easier as the HeadSpin team handles the management of Appium servers, drivers, and plugins on your behalf.

**Bottom line**

HeadSpin has made advancements in the field of mobile codeless testing and performance monitoring. They support running tests on the open-source version of Appium, ensuring compatibility and avoiding vendor lock-in. The HeadSpin Platform helps accelerate test cycles by at least 30% and provides the ability to capture performance data for actionable insights. Parallel test execution is supported to save time, and reliable testing is available on both iOS and Android devices. The Platform also allows audio and video performance testing and ensures compatibility with two-way audio and biometric testing. Additionally, HeadSpin enables you to seamlessly run your existing test scripts without requiring any modifications.

These advancements provided by HeadSpin aim to improve the efficiency and effectiveness of mobile codeless testing, empowering teams to confidently deliver high-quality apps.

_**Originally Published At:** https://www.headspin.io/blog/codeless-appium-test-automation-with-headspin_