Skip to main content

Appium Examples

Setup

This page contains complete NodeJS example scripts for running Appium tests on different devices available on the TV Labs platform.

To run these examples, first setup your environment:

mkdir tvlabs-appium-examples && cd tvlabs-appium-examples
npm init -y
npm install --save webdriverio

echo "TVLABS_API_KEY=<tvlabs_api_key>" >> .env
echo "TVLABS_BUILD_ID=$(tvlabs upload -i <path to your application package here>)" >> .env

touch index.js

To run the script after you populate index.js with one of the below examples, run node --env-file=.env index.js.

Roku

import { remote } from 'webdriverio';
import fs from 'fs';

const capabilities = {
'tvlabs:build': process.env.TVLABS_BUILD_ID,
'tvlabs:constraints': {
platform_key: 'roku',
},
};

const wdOpts = {
hostname: process.env.APPIUM_HOST || 'appium.tvlabs.ai',
port: parseInt(process.env.APPIUM_PORT, 10) || 4723,
protocol: 'https',
logLevel: 'info',
capabilities,
headers: {
Authorization: `Bearer ${process.env.TVLABS_API_KEY}`,
},
connectionRetryTimeout: 60_000,
};

async function runTest() {
const driver = await remote(wdOpts);

try {
await driver.executeScript('roku: deviceInfo', []);

await driver.executeScript('roku: pressKey', [{ key: 'Right' }]);

await driver.pause(1000);

await driver.executeScript('roku: pressKey', [{ key: 'Left' }]);

const screenshot = await driver.takeScreenshot();

fs.writeFileSync('./screenshot.png', screenshot, { encoding: 'base64' });
} finally {
await driver.pause(1000);
await driver.deleteSession();
}
}

runTest();

WebOS (LG)

import { remote } from 'webdriverio';

const capabilities = {
'tvlabs:constraints': {
platform_key: 'web_os',
},
'tvlabs:build': process.env.TVLABS_BUILD_ID,
};

const wdOpts = {
hostname: process.env.APPIUM_HOST || 'appium.tvlabs.ai',
port: parseInt(process.env.APPIUM_PORT, 10) || 4723,
protocol: 'https',
logLevel: 'info',
capabilities,
headers: {
Authorization: `Bearer ${process.env.TVLABS_API_KEY}`,
},
connectionRetryTimeout: 60_000,
};

async function runTest() {
const driver = await remote(wdOpts);

try {
await driver.executeScript('webos: pressKey', [{ key: 'right' }]);

await driver.pause(1000);

await driver.executeScript('webos: pressKey', [{ key: 'left' }]);
} finally {
await driver.pause(1000);
await driver.deleteSession();
}
}

runTest();

Tizen TV (Samsung)

import { remote } from 'webdriverio';

const capabilities = {
'tvlabs:constraints': {
platform_key: 'tizen',
},
'tvlabs:build': process.env.TVLABS_BUILD_ID,
};

const wdOpts = {
hostname: process.env.APPIUM_HOST || 'appium.tvlabs.ai',
port: parseInt(process.env.APPIUM_PORT, 10) || 4723,
protocol: 'https',
logLevel: 'info',
capabilities,
headers: {
Authorization: `Bearer ${process.env.TVLABS_API_KEY}`,
},
connectionRetryTimeout: 60_000,
};

async function runTest() {
const driver = await remote(wdOpts);

try {
await driver.executeScript('tizen: pressKey', [{ key: 'KEY_RIGHT' }]);

await driver.pause(1000);

await driver.executeScript('tizen: pressKey', [{ key: 'KEY_LEFT' }]);
} finally {
await driver.pause(1000);
await driver.deleteSession();
}
}

runTest();

tvOS (Apple TV)

import { remote } from 'webdriverio';

const capabilities = {
'tvlabs:constraints': {
platform_key: 'tv_os',
},
'tvlabs:build': process.env.TVLABS_BUILD_ID,
};

const wdOpts = {
hostname: process.env.APPIUM_HOST || 'appium.tvlabs.ai',
port: parseInt(process.env.APPIUM_PORT, 10) || 4723,
protocol: 'https',
logLevel: 'info',
capabilities,
headers: {
Authorization: `Bearer ${process.env.TVLABS_API_KEY}`,
},
connectionRetryTimeout: 60_000,
};

async function runTest() {
const driver = await remote(wdOpts);

const pressKey = async (key) => {
await driver.executeScript('mobile: pressButton', [{ name: key }]);
await driver.pause(500);
};

try {
await pressKey('right');
await pressKey('left');
} finally {
await driver.pause(1000);
await driver.deleteSession();
}
}

runTest();

Using @tvlabs/wdio-service

Beginning with any of the examples above (Roku for this example), run the following command to install the WebdriverIO service:

npm install --save @tvlabs/wdio-service

Then modify the script to use the service:

import { remote } from 'webdriverio';
import TVLabsService from '@tvlabs/wdio-service';
import fs from 'fs';

const capabilities = {
'tvlabs:build': process.env.TVLABS_BUILD_ID,
'tvlabs:constraints': {
platform_key: 'roku',
},
};

const wdOpts = {
hostname: process.env.APPIUM_HOST || 'appium.tvlabs.ai',
port: parseInt(process.env.APPIUM_PORT, 10) || 4723,
protocol: 'https',
logLevel: 'info',
capabilities,
headers: {
Authorization: `Bearer ${process.env.TVLABS_API_KEY}`,
},
connectionRetryTimeout: 60_000,
};

const serviceOpts = {
apiKey: process.env.TVLABS_API_KEY,
};

async function runTest() {
// Unused here, but usually provided by the WebdriverIO test runner.
const wdioOptions = {};
const specs = [];
const cid = '';

const service = new TVLabsService(serviceOpts, capabilities, wdioOptions);

// This modifies capabilities, adding the TV Labs session ID.
await service.beforeSession(wdOpts, capabilities, [], '');

// Proceed normally!
const driver = await remote(wdOpts);

try {
await driver.executeScript('roku: deviceInfo', []);

await driver.executeScript('roku: pressKey', [{ key: 'Right' }]);

await driver.pause(1000);

await driver.executeScript('roku: pressKey', [{ key: 'Left' }]);

const screenshot = await driver.takeScreenshot();

fs.writeFileSync('./screenshot.png', screenshot, { encoding: 'base64' });
} finally {
await driver.pause(1000);
await driver.deleteSession();
}
}

runTest();