wd-android icon indicating copy to clipboard operation
wd-android copied to clipboard

A wrapper for wd node package optimized for Android.

wd-android

NPM version

A wrapper for wd node package optimized for Android to work with appium.io.

Install

npm install wd-android

Prerequisites

You need to install Appium.

You can install with npm:

npm install -g appium

or download it from appium website.

and then check if your ANDROID_HOME and JAVA_HOME are correctly.

You can achieve this by running:

$ appium-doctor --android
	Running Android Checks
	✔ ANDROID_HOME is set to "/path/to/android/sdk"
	✔ JAVA_HOME is set to "/path/to/java/sdk"
	✔ ADB exists at /sdk/platform-tools/adb
	✔ Android exists at /sdk/tools/android
	✔ Emulator exists at /sdk/tools/emulator
	✔ Android Checks were successful.

	✔ All Checks were successful

If you're usigin Android Studio and you have installed the sdk in Android Studio folder, may you need to run:

$ ln -s /path/to/Android Studio.app /path/to/AndroidStudioApp
$ export ANDROID_HOME=/path/to/AndroidStudioApp/sdk

Cause Appium doesn't work with spaces in ANDROID_HOME or JAVA_HOME paths.

Before start

Before launch your script with wd-android you need to run the appium server. It's quite simple:

$ appium

Usage

How to instantiate:

var wd = require('wd'),	
	WdAndroid = require('wd-android');

var wdAndroid = new WdAndroid(wd);

var driver = wdAndroid.promiseChainRemote();

driver.init().setImplicitWaitTimeout(10000);
driver
	.viewPagerElement()
	.swipe({
		startX: 0.9,
		startY: 0.5,
		endX: 0.1,
		endY: 0.5,
		duration: 800
	})
   .waitForLinearLayout()
   .click();

Api

More friendly methods to referer to Android Elements than by XPath.

// driver.elementByXPath('//android.widget.FrameLayout')
driver.frameLayoutElement();

// driver.elementByXPath('//android.widget.LinearLayout')
driver.linearLayoutElement();

// driver.elementByXPath('//android.widget.ListView')
driver.listViewElement();

// driver.elementByXPath('//android.view.support.v4.ViewPager)
driver.viewPagerElement();

// driver.elementByXPath('//android.webkit.WebView)
driver.webViewElement();

Simple Id

Pass the default package as secondo arguments in wd-android constructor to find element by their simple ids.

// wd way
driver.elementById('com.example.app:id/productsList');

// wd-android way
var wdAndroid = new WdAndroid(wd, 'com.example.app');
...
...
driver.elementBySimpleId('productsList')

Sub-elements Reference

Access the sub-elements by passing parent element id.

N.B.: The original wd module hasn't this feature.

And yes, you can use the simple elements ids.

driver
	.frameLayoutChildren('com.example.app:id/viewPager')
	.then(function(els) {
		return els[1].click();
	})
	// with simple id
	.linearLayoutChildren('productList')
	.then(function(els) {
		return els[1].click();
	});

Alerts

Access the alert dialog showed without pain.

driver.elementBySimpleId('takeButtonBox')
	.click()
   .shouldAppearAlertElement()
   .positiveAlertButton()
   .text()
   		.should.become.eql("Ok")
   .negativeAlertButton()
   .text()
   		.should.become.eql("Cancel");

Mobile Gestures

Built in methods to perform mobile gestures.

// perform swipe from 90% of the screen width to 10%

driver.swipe({
	startX: 0.9,
	startY: 0.5,
	endX: 0.1,
	endY: 0.5,
	duration: 800
});
Mobile Gestures for specific element

// swipe element
driver
	.elementById('com.example.app:id/loginButton')
	.swipeElement({
		startX: 0.9,
		startY: 0.5,
		endX: 0.1,
		endY: 0.5,
		duration: 800
});

// tap element

driver
	.elementById('com.example.app:id/loginButton')
	.tapElement({
		x: 0.9,
		y: 0.5
});


Should integration


// wd way
driver.
	.elementById('com.example.app:id/loginButton')
	.then(function(el) {
		return el.getTagName(function(err, name) {
			return name;
		});
	}).then(function(name){
		return name.should.be.eql('android.widget.Button')
	});

// wd-android way
driver
	.elementById('com.example.app:id/loginButton')
	.shouldBeButtonElement()

Mocha Integration


var path = require('path'),
	wd = require('wd'),
	WdAndroid = require('wd-android');

var appiumServer = {
    host: 'localhost',
    port: 4723
};

var android19 = {
    browserName: '',
    'appium-version': '1.2.2',
    platformName: 'Android',
    platformVersion: '4.4.2',
    deviceName: 'Android Emulator',
    app: undefined
};

var androidDebugApp = '../path/to/your/apk';

describe("Using Appium and WdAndroid to test Android App.", function(){
	this.timeout(300000);
    var driver,
   		allPassed = true;

    before(function() {

        var wdAndroid = new WdAndroid(wd);

        driver = wdAndroid.promiseChainRemote(appiumServer);
        
        var desired = android19;
        
        desired.app = path.resolve(__dirname, androidDebugApp);

        return driver
        			.init(desired)
        			.setImplicitWaitTimeout(10000);
    });


    after(function() {
        return driver.quit();
    });


    afterEach(function() {
        allPassed = allPassed && this.currentTest.state === 'passed';
    });


    it("shoul find an element", function() {
        return driver
            .viewPagerElement()
            .swipe({
                startX: 0.9,
                startY: 0.5,
                endX: 0.1,
                endY: 0.5,
                duration: 800
            })
            .waitForLinearLayout()
            .click();

    });
});