# Appium

Extends Webdriver

Appium helper extends Webriver (opens new window) helper. It supports all browser methods and also includes special methods for mobile apps testing. You can use this helper to test Web on desktop and mobile devices and mobile apps.

# Appium Installation

Appium is an open source test automation framework for use with native, hybrid and mobile web apps that implements the WebDriver protocol. It allows you to run Selenium tests on mobile devices and also test native, hybrid and mobile web apps.

Download and install Appium (opens new window)

npm install -g appium

Launch the daemon: appium

# Helper configuration

This helper should be configured in codecept.json or codecept.conf.js

  • app: Application path. Local path or remote URL to an .ipa or .apk file, or a .zip containing one of these. Alias to desiredCapabilities.appPackage
  • host: (default: 'localhost') Appium host
  • port: (default: '4723') Appium port
  • platform: (Android or IOS), which mobile OS to use; alias to desiredCapabilities.platformName
  • restart: restart browser or app between tests (default: true), if set to false cookies will be cleaned but browser window will be kept and for apps nothing will be changed.
  • desiredCapabilities: [], Appium capabilities, see below
    • platformName - Which mobile OS platform to use
    • appPackage - Java package of the Android app you want to run
    • appActivity - Activity name for the Android activity you want to launch from your package.
    • deviceName: The kind of mobile device or emulator to use
    • platformVersion: Mobile OS version
    • app - The absolute local path or remote http URL to an .ipa or .apk file, or a .zip containing one of these. Appium will attempt to install this app binary on the appropriate device first.
    • browserName: Name of mobile web browser to automate. Should be an empty string if automating an app instead.

Example Android App:

{
  helpers: {
      Appium: {
          platform: "Android",
          desiredCapabilities: {
              appPackage: "com.example.android.myApp",
              appActivity: "MainActivity",
              deviceName: "OnePlus3",
              platformVersion: "6.0.1"
          }
      }
    }
}

Example iOS Mobile Web with local Appium:

{
helpers: {
  Appium: {
    platform: "iOS",
    url: "https://the-internet.herokuapp.com/",
    desiredCapabilities: {
      deviceName: "iPhone X",
      platformVersion: "12.0",
      browserName: "safari"
    }
  }
}
}

Example iOS Mobile Web on BrowserStack:

{
helpers: {
  Appium: {
    host: "hub-cloud.browserstack.com",
    port: 4444,
    user: process.env.BROWSERSTACK_USER,
    key: process.env.BROWSERSTACK_KEY,
    platform: "iOS",
    url: "https://the-internet.herokuapp.com/",
    desiredCapabilities: {
      realMobile: "true",
      device: "iPhone 8",
      os_version: "12",
      browserName: "safari"
    }
  }
}
}

Additional configuration params can be used from https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md (opens new window)

# Access From Helpers

Receive a Appium client from a custom helper by accessing browser property:

let browser = this.helpers['Appium'].browser

# Methods

# Parameters

  • config

# runOnIOS

Execute code only on iOS

I.runOnIOS(() => {
   I.click('//UIAApplication[1]/UIAWindow[1]/UIAButton[1]');
   I.see('Hi, IOS', '~welcome');
});

Additional filter can be applied by checking for capabilities. For instance, this code will be executed only on iPhone 5s:

I.runOnIOS({deviceName: 'iPhone 5s'},() => {
   // ...
});

Also capabilities can be checked by a function.

I.runOnAndroid((caps) => {
   // caps is current config of desiredCapabiliites
   return caps.platformVersion >= 6
},() => {
   // ...
});

# Parameters

  • caps any
  • fn any

# runOnAndroid

Execute code only on Android

I.runOnAndroid(() => {
   I.click('io.selendroid.testapp:id/buttonTest');
});

Additional filter can be applied by checking for capabilities. For instance, this code will be executed only on Android 6.0:

I.runOnAndroid({platformVersion: '6.0'},() => {
   // ...
});

Also capabilities can be checked by a function. In this case, code will be executed only on Android >= 6.

I.runOnAndroid((caps) => {
   // caps is current config of desiredCapabiliites
   return caps.platformVersion >= 6
},() => {
   // ...
});

# Parameters

  • caps any
  • fn any

# runInWeb

Execute code only in Web mode.

I.runInWeb(() => {
   I.waitForElement('#data');
   I.seeInCurrentUrl('/data');
});

# Parameters

  • fn any

# seeAppIsInstalled

Check if an app is installed.

I.seeAppIsInstalled("com.example.android.apis");

# Parameters

# seeAppIsNotInstalled

Check if an app is not installed.

I.seeAppIsNotInstalled("com.example.android.apis");

# Parameters

# installApp

Install an app on device.

I.installApp('/path/to/file.apk');

# Parameters

# removeApp

Remove an app from the device.

I.removeApp('appName', 'com.example.android.apis');

# Parameters

# seeCurrentActivityIs

Check current activity on an Android device.

I.seeCurrentActivityIs(".HomeScreenActivity")

# Parameters

# seeDeviceIsLocked

Check whether the device is locked.

I.seeDeviceIsLocked();

Appium: support only Android

# seeDeviceIsUnlocked

Check whether the device is not locked.

I.seeDeviceIsUnlocked();

Appium: support only Android

# seeOrientationIs

Check the device orientation

I.seeOrientationIs('PORTRAIT');
I.seeOrientationIs('LANDSCAPE')

# Parameters

  • orientation ("LANDSCAPE" | "PORTRAIT") LANDSCAPE or PORTRAITAppium: support Android and iOS

# setOrientation

Set a device orientation. Will fail, if app will not set orientation

I.setOrientation('PORTRAIT');
I.setOrientation('LANDSCAPE')

# Parameters

  • orientation ("LANDSCAPE" | "PORTRAIT") LANDSCAPE or PORTRAITAppium: support Android and iOS

# grabAllContexts

Get list of all available contexts

let contexts = await I.grabAllContexts();

Appium: support Android and iOS

# grabContext

Retrieve current context

let context = await I.grabContext();

Appium: support Android and iOS

# grabCurrentActivity

Get current device activity.

let activity = await I.grabCurrentActivity();

Appium: support only Android

# grabNetworkConnection

Get information about the current network connection (Data/WIFI/Airplane). The actual server value will be a number. However WebdriverIO additional properties to the response object to allow easier assertions.

let con = await I.grabNetworkConnection();

Appium: support only Android

# grabOrientation

Get current orientation.

let orientation = await I.grabOrientation();

Appium: support Android and iOS

# grabSettings

Get all the currently specified settings.

let settings = await I.grabSettings();

Appium: support Android and iOS

# _switchToContext

Switch to the specified context.

# Parameters

  • context any the context to switch to

# switchToWeb

Switches to web context. If no context is provided switches to the first detected web context

// switch to first web context
I.switchToWeb();

// or set the context explicitly
I.switchToWeb('WEBVIEW_io.selendroid.testapp');

# Parameters

# switchToNative

Switches to native context. By default switches to NATIVE_APP context unless other specified.

I.switchToNative();

// or set context explicitly
I.switchToNative('SOME_OTHER_CONTEXT');

# Parameters

  • context any (optional, default null)

# startActivity

Start an arbitrary Android activity during a session.

I.startActivity('io.selendroid.testapp', '.RegisterUserActivity');

Appium: support only Android

# Parameters

  • appPackage
  • appActivity

# setNetworkConnection

Set network connection mode.

  • airplane mode
  • wifi mode
  • data data
I.setNetworkConnection(0) // airplane mode off, wifi off, data off
I.setNetworkConnection(1) // airplane mode on, wifi off, data off
I.setNetworkConnection(2) // airplane mode off, wifi on, data off
I.setNetworkConnection(4) // airplane mode off, wifi off, data on
I.setNetworkConnection(6) // airplane mode off, wifi on, data on

See corresponding webdriverio reference (opens new window).

Appium: support only Android

# Parameters

  • value

# setSettings

Update the current setting on the device

I.setSettings({cyberdelia: 'open'});

# Parameters

# hideDeviceKeyboard

Hide the keyboard.

// taps outside to hide keyboard per default
I.hideDeviceKeyboard();
I.hideDeviceKeyboard('tapOutside');

// or by pressing key
I.hideDeviceKeyboard('pressKey', 'Done');

# Parameters

  • strategy ("tapOutside" | "pressKey") desired strategy to close keyboard (‘tapOutside’ or ‘pressKey’)Appium: support Android and iOS
  • key

# sendDeviceKeyEvent

Send a key event to the device. List of keys: https://developer.android.com/reference/android/view/KeyEvent.html (opens new window)

I.sendDeviceKeyEvent(3);

# Parameters

# openNotifications

Open the notifications panel on the device.

I.openNotifications();

Appium: support only Android

# makeTouchAction

The Touch Action API provides the basis of all gestures that can be automated in Appium. At its core is the ability to chain together ad hoc individual actions, which will then be applied to an element in the application on the device. See complete documentation (opens new window)

I.makeTouchAction("~buttonStartWebviewCD", 'tap');

Appium: support Android and iOS

# Parameters

  • locator
  • action

# tap

Taps on element.

I.tap("~buttonStartWebviewCD");

Shortcut for makeTouchAction

# Parameters

  • locator any

# swipe

Perform a swipe on the screen or an element.

let locator = "#io.selendroid.testapp:id/LinearLayout1";
I.swipe(locator, 800, 1200, 1000);

See complete reference (opens new window)

# Parameters

# performSwipe

Perform a swipe on the screen.

I.performswipe(100,200);

# Parameters

# swipeDown

Perform a swipe down on an element.

let locator = "#io.selendroid.testapp:id/LinearLayout1";
I.swipeDown(locator); // simple swipe
I.swipeDown(locator, 500); // set speed
I.swipeDown(locator, 1200, 1000); // set offset and speed

# Parameters

# swipeLeft

Perform a swipe left on an element.

let locator = "#io.selendroid.testapp:id/LinearLayout1";
I.swipeLeft(locator); // simple swipe
I.swipeLeft(locator, 500); // set speed
I.swipeLeft(locator, 1200, 1000); // set offset and speed

# Parameters

# swipeRight

Perform a swipe right on an element.

let locator = "#io.selendroid.testapp:id/LinearLayout1";
I.swipeRight(locator); // simple swipe
I.swipeRight(locator, 500); // set speed
I.swipeRight(locator, 1200, 1000); // set offset and speed

# Parameters

# swipeUp

Perform a swipe up on an element.

let locator = "#io.selendroid.testapp:id/LinearLayout1";
I.swipeUp(locator); // simple swipe
I.swipeUp(locator, 500); // set speed
I.swipeUp(locator, 1200, 1000); // set offset and speed

# Parameters

# swipeTo

Perform a swipe in selected direction on an element to searchable element.

I.swipeTo(
 "android.widget.CheckBox", // searchable element
 "//android.widget.ScrollView/android.widget.LinearLayout", // scroll element
  "up", // direction
   30,
   100,
   500);

# Parameters

# touchPerform

Performs a specific touch action. The action object need to contain the action name, x/y coordinates

I.touchPerform([{
    action: 'press',
    options: {
      x: 100,
      y: 200
    }
}, {action: 'release'}])

I.touchPerform([{
   action: 'tap',
   options: {
       element: '1', // json web element was queried before
       x: 10,   // x offset
       y: 20,   // y offset
       count: 1 // number of touches
   }
}]);

Appium: support Android and iOS

# Parameters

  • actions

# pullFile

Pulls a file from the device.

I.pullFile('/storage/emulated/0/DCIM/logo.png', 'my/path');
// save file to output dir
I.pullFile('/storage/emulated/0/DCIM/logo.png', output_dir);

Appium: support Android and iOS

# Parameters

  • path
  • dest

# shakeDevice

Perform a shake action on the device.

I.shakeDevice();

Appium: support only iOS

# rotate

Perform a rotation gesture centered on the specified element.

I.rotate(120, 120)

See corresponding webdriverio reference (opens new window).

Appium: support only iOS

# Parameters

  • x
  • y
  • duration
  • radius
  • rotation
  • touchCount

# setImmediateValue

Set immediate value in app.

See corresponding webdriverio reference (opens new window).

Appium: support only iOS

# Parameters

  • id
  • value

# simulateTouchId

Simulate Touch ID with either valid (match == true) or invalid (match == false) fingerprint.

I.touchId(); // simulates valid fingerprint
I.touchId(true); // simulates valid fingerprint
I.touchId(false); // simulates invalid fingerprint

Appium: support only iOS TODO: not tested

# Parameters

  • match

# closeApp

Close the given application.

I.closeApp();

Appium: support only iOS

# appendField

Appends text to a input field or textarea. Field is located by name, label, CSS or XPath

I.appendField('#myTextField', 'appended');

# Parameters

# checkOption

Selects a checkbox or radio button. Element is located by label or name or CSS or XPath.

The second parameter is a context (CSS or XPath locator) to narrow the search.

I.checkOption('#agree');
I.checkOption('I Agree to Terms and Conditions');
I.checkOption('agree', '//form');

# Parameters

# click

Perform a click on a link or a button, given by a locator. If a fuzzy locator is given, the page will be searched for a button, link, or image matching the locator string. For buttons, the "value" attribute, "name" attribute, and inner text are searched. For links, the link text is searched. For images, the "alt" attribute and inner text of any parent links are searched.

The second parameter is a context (CSS or XPath locator) to narrow the search.

// simple link
I.click('Logout');
// button of form
I.click('Submit');
// CSS button
I.click('#form input[type=submit]');
// XPath
I.click('//form/*[@type=submit]');
// link in context
I.click('Logout', '#nav');
// using strict locator
I.click({css: 'nav a.login'});

# Parameters

# dontSeeCheckboxIsChecked

Verifies that the specified checkbox is not checked.

I.dontSeeCheckboxIsChecked('#agree'); // located by ID
I.dontSeeCheckboxIsChecked('I agree to terms'); // located by label
I.dontSeeCheckboxIsChecked('agree'); // located by name

# Parameters

# dontSeeElement

Opposite to seeElement. Checks that element is not visible (or in DOM)

I.dontSeeElement('.modal'); // modal is not shown

# Parameters

# dontSeeInField

Checks that value of input field or textarea doesn't equal to given value Opposite to seeInField.

I.dontSeeInField('email', '[email protected]'); // field by name
I.dontSeeInField({ css: 'form input.email' }, '[email protected]'); // field by CSS

# Parameters

# dontSee

Opposite to see. Checks that a text is not present on a page. Use context parameter to narrow down the search.

I.dontSee('Login'); // assume we are already logged in.
I.dontSee('Login', '.nav'); // no login inside .nav element

# Parameters

# fillField

Fills a text field or textarea, after clearing its value, with the given string. Field is located by name, label, CSS, or XPath.

// by label
I.fillField('Email', '[email protected]');
// by name
I.fillField('password', secret('123456'));
// by CSS
I.fillField('form#login input[name=username]', 'John');
// or by strict locator
I.fillField({css: 'form#login input[name=username]'}, 'John');

# Parameters

# grabTextFromAll

Retrieves all texts from an element located by CSS or XPath and returns it to test. Resumes test execution, so should be used inside async with await operator.

let pins = await I.grabTextFromAll('#pin li');

# Parameters

Returns Promise (opens new window)<Array (opens new window)<string (opens new window)>> attribute value

# grabTextFrom

Retrieves a text from an element located by CSS or XPath and returns it to test. Resumes test execution, so should be used inside async with await operator.

let pin = await I.grabTextFrom('#pin');

If multiple elements found returns first element.

# Parameters

Returns Promise (opens new window)<string (opens new window)> attribute value

# grabValueFromAll

Retrieves an array of value from a form located by CSS or XPath and returns it to test. Resumes test execution, so should be used inside async function with await operator.

let inputs = await I.grabValueFromAll('//form/input');

# Parameters

Returns Promise (opens new window)<Array (opens new window)<string (opens new window)>> attribute value

# grabValueFrom

Retrieves a value from a form element located by CSS or XPath and returns it to test. Resumes test execution, so should be used inside async function with await operator. If more than one element is found - value of first element is returned.

let email = await I.grabValueFrom('input[name=email]');

# Parameters

Returns Promise (opens new window)<string (opens new window)> attribute value

# scrollIntoView

Scroll element into viewport.

I.scrollIntoView('#submit');
I.scrollIntoView('#submit', true);
I.scrollIntoView('#submit', { behavior: "smooth", block: "center", inline: "center" });

# Parameters

# seeCheckboxIsChecked

Verifies that the specified checkbox is checked.

I.seeCheckboxIsChecked('Agree');
I.seeCheckboxIsChecked('#agree'); // I suppose user agreed to terms
I.seeCheckboxIsChecked({css: '#signup_form input[type=checkbox]'});

# Parameters

# seeElement

Checks that a given Element is visible Element is located by CSS or XPath.

I.seeElement('#modal');

# Parameters

# seeInField

Checks that the given input field or textarea equals to given value. For fuzzy locators, fields are matched by label text, the "name" attribute, CSS, and XPath.

I.seeInField('Username', 'davert');
I.seeInField({css: 'form textarea'},'Type your comment here');
I.seeInField('form input[type=hidden]','hidden_value');
I.seeInField('#searchform input','Search');

# Parameters

# see

Checks that a page contains a visible text. Use context parameter to narrow down the search.

I.see('Welcome'); // text welcome on a page
I.see('Welcome', '.content'); // text inside .content div
I.see('Register', {css: 'form.register'}); // use strict locator

# Parameters

# selectOption

Selects an option in a drop-down select. Field is searched by label | name | CSS | XPath. Option is selected by visible text or by value.

I.selectOption('Choose Plan', 'Monthly'); // select by label
I.selectOption('subscription', 'Monthly'); // match option by text
I.selectOption('subscription', '0'); // or by value
I.selectOption('//form/select[@name=account]','Premium');
I.selectOption('form select[name=account]', 'Premium');
I.selectOption({css: 'form select[name=account]'}, 'Premium');

Provide an array for the second argument to select multiple options.

I.selectOption('Which OS do you use?', ['Android', 'iOS']);

# Parameters

# waitForElement

Waits for element to be present on page (by default waits for 1sec). Element can be located by CSS or XPath.

I.waitForElement('.btn.continue');
I.waitForElement('.btn.continue', 5); // wait for 5 secs

# Parameters

# waitForVisible

Waits for an element to become visible on a page (by default waits for 1sec). Element can be located by CSS or XPath.

I.waitForVisible('#popup');

# Parameters

# waitForInvisible

Waits for an element to be removed or become invisible on a page (by default waits for 1sec). Element can be located by CSS or XPath.

I.waitForInvisible('#popup');

# Parameters

# waitForText

Waits for a text to appear (by default waits for 1sec). Element can be located by CSS or XPath. Narrow down search results by providing context.

I.waitForText('Thank you, form has been submitted');
I.waitForText('Thank you, form has been submitted', 5, '#modal');

# Parameters

# useWebDriverTo

Use webdriverio (opens new window) API inside a test.

First argument is a description of an action. Second argument is async function that gets this helper as parameter.

{ browser (opens new window)) } object from WebDriver API is available.

I.useWebDriverTo('open multiple windows', async ({ browser }) {
   // create new window
   await browser.newWindow('https://webdriver.io');
});

# Parameters

# _isShadowLocator

Check if locator is type of "Shadow"

# Parameters

# _locateShadow

Locate Element within the Shadow Dom

# Parameters

# _smartWait

Smart Wait to locate an element

# Parameters

# _locate

Get elements by different locator types, including strict locator. Should be used in custom helpers:

this.helpers['WebDriver']._locate({name: 'password'}).then //...

# Parameters

# _locateCheckable

Find a checkbox by providing human readable text:

this.helpers['WebDriver']._locateCheckable('I agree with terms and conditions').then // ...

# Parameters

# _locateClickable

Find a clickable element by providing human readable text:

const els = await this.helpers.WebDriver._locateClickable('Next page');
const els = await this.helpers.WebDriver._locateClickable('Next page', '.pages');

# Parameters

# _locateFields

Find field elements by providing human readable text:

this.helpers['WebDriver']._locateFields('Your email').then // ...

# Parameters

# defineTimeout

Set WebDriver timeouts (opens new window) in realtime.

Timeouts are expected to be passed as object:

I.defineTimeout({ script: 5000 });
I.defineTimeout({ implicit: 10000, pageLoad: 10000, script: 5000 });

# Parameters

  • timeouts WebdriverIO.Timeouts WebDriver timeouts object.

# amOnPage

Opens a web page in a browser. Requires relative or absolute url. If url starts with /, opens a web page of a site defined in url config parameter.

I.amOnPage('/'); // opens main page of website
I.amOnPage('https://github.com'); // opens github
I.amOnPage('/login'); // opens a login page

# Parameters

# forceClick

Perform an emulated click on a link or a button, given by a locator. Unlike normal click instead of sending native event, emulates a click with JavaScript. This works on hidden, animated or inactive elements as well.

If a fuzzy locator is given, the page will be searched for a button, link, or image matching the locator string. For buttons, the "value" attribute, "name" attribute, and inner text are searched. For links, the link text is searched. For images, the "alt" attribute and inner text of any parent links are searched.

The second parameter is a context (CSS or XPath locator) to narrow the search.

// simple link
I.forceClick('Logout');
// button of form
I.forceClick('Submit');
// CSS button
I.forceClick('#form input[type=submit]');
// XPath
I.forceClick('//form/*[@type=submit]');
// link in context
I.forceClick('Logout', '#nav');
// using strict locator
I.forceClick({css: 'nav a.login'});

# Parameters

# doubleClick

Performs a double-click on an element matched by link|button|label|CSS or XPath. Context can be specified as second parameter to narrow search.

I.doubleClick('Edit');
I.doubleClick('Edit', '.actions');
I.doubleClick({css: 'button.accept'});
I.doubleClick('.btn.edit');

# Parameters

# rightClick

Performs right click on a clickable element matched by semantic locator, CSS or XPath.

// right click element with id el
I.rightClick('#el');
// right click link or button with text "Click me"
I.rightClick('Click me');
// right click button with text "Click me" inside .context
I.rightClick('Click me', '.context');

# Parameters

# forceRightClick

Emulates right click on an element. Unlike normal click instead of sending native event, emulates a click with JavaScript. This works on hidden, animated or inactive elements as well.

If a fuzzy locator is given, the page will be searched for a button, link, or image matching the locator string. For buttons, the "value" attribute, "name" attribute, and inner text are searched. For links, the link text is searched. For images, the "alt" attribute and inner text of any parent links are searched.

The second parameter is a context (CSS or XPath locator) to narrow the search.

// simple link
I.forceRightClick('Menu');

# Parameters

# clearField

Clears a <textarea> or text <input> element's value.

I.clearField('Email');
I.clearField('user[email]');
I.clearField('#email');

# Parameters

# attachFile

Attaches a file to element located by label, name, CSS or XPath Path to file is relative current codecept directory (where codecept.json or codecept.conf.js is located). File will be uploaded to remote system (if tests are running remotely).

I.attachFile('Avatar', 'data/avatar.jpg');
I.attachFile('form input[name=avatar]', 'data/avatar.jpg');

# Parameters

# uncheckOption

Unselects a checkbox or radio button. Element is located by label or name or CSS or XPath.

The second parameter is a context (CSS or XPath locator) to narrow the search.

I.uncheckOption('#agree');
I.uncheckOption('I Agree to Terms and Conditions');
I.uncheckOption('agree', '//form');

# Parameters

# grabHTMLFromAll

Retrieves all the innerHTML from elements located by CSS or XPath and returns it to test. Resumes test execution, so should be used inside async function with await operator.

let postHTMLs = await I.grabHTMLFromAll('.post');

# Parameters

Returns Promise (opens new window)<Array (opens new window)<string (opens new window)>> HTML code for an element

# grabHTMLFrom

Retrieves the innerHTML from an element located by CSS or XPath and returns it to test. Resumes test execution, so should be used inside async function with await operator. If more than one element is found - HTML of first element is returned.

let postHTML = await I.grabHTMLFrom('#post');

# Parameters

Returns Promise (opens new window)<string (opens new window)> HTML code for an element

# grabAttributeFromAll

Retrieves an array of attributes from elements located by CSS or XPath and returns it to test. Resumes test execution, so should be used inside async with await operator.

let hints = await I.grabAttributeFromAll('.tooltip', 'title');

# Parameters

Returns Promise (opens new window)<Array (opens new window)<string (opens new window)>> attribute valueAppium: can be used for apps only with several values ("contentDescription", "text", "className", "resourceId")

# grabAttributeFrom

Retrieves an attribute from an element located by CSS or XPath and returns it to test. Resumes test execution, so should be used inside async with await operator. If more than one element is found - attribute of first element is returned.

let hint = await I.grabAttributeFrom('#tooltip', 'title');

# Parameters

Returns Promise (opens new window)<string (opens new window)> attribute valueAppium: can be used for apps only with several values ("contentDescription", "text", "className", "resourceId")

# seeTextEquals

Checks that text is equal to provided one.

I.seeTextEquals('text', 'h1');

# Parameters

# seeElementInDOM

Checks that a given Element is present in the DOM Element is located by CSS or XPath.

I.seeElementInDOM('#modal');

# Parameters

# dontSeeElementInDOM

Opposite to seeElementInDOM. Checks that element is not on page.

I.dontSeeElementInDOM('.nav'); // checks that element is not on page visible or not

# Parameters

# seeInSource

Checks that the current page contains the given string in its raw source code.

I.seeInSource('<h1>Green eggs &amp; ham</h1>');

# Parameters

# grabSource

Retrieves page source and returns it to test. Resumes test execution, so should be used inside async function with await operator.

let pageSource = await I.grabSource();

Returns Promise (opens new window)<string (opens new window)> source code

# grabBrowserLogs

Get JS log from browser. Log buffer is reset after each request. Resumes test execution, so should be used inside an async function with await operator.

let logs = await I.grabBrowserLogs();
console.log(JSON.stringify(logs))

Returns (Promise (opens new window)<Array (opens new window)<object (opens new window)>> | undefined (opens new window)) all browser logs

# dontSeeInSource

Checks that the current page does not contains the given string in its raw source code.

I.dontSeeInSource('<!--'); // no comments in source

# Parameters

# seeNumberOfElements

Asserts that an element appears a given number of times in the DOM. Element is located by label or name or CSS or XPath.

I.seeNumberOfElements('#submitBtn', 1);

# Parameters

# seeNumberOfVisibleElements

Asserts that an element is visible a given number of times. Element is located by CSS or XPath.

I.seeNumberOfVisibleElements('.buttons', 3);

# Parameters

# seeAttributesOnElements

Checks that all elements with given locator have given attributes.

I.seeAttributesOnElements('//form', { method: "post"});

# Parameters

# grabNumberOfVisibleElements

Grab number of visible elements by locator. Resumes test execution, so should be used inside async function with await operator.

let numOfElements = await I.grabNumberOfVisibleElements('p');

# Parameters

Returns Promise (opens new window)<number (opens new window)> number of visible elements

# scrollTo

Scrolls to element matched by locator. Extra shift can be set with offsetX and offsetY options.

I.scrollTo('footer');
I.scrollTo('#submit', 5, 5);

# Parameters

# moveCursorTo

Moves cursor to element matched by locator. Extra shift can be set with offsetX and offsetY options.

I.moveCursorTo('.tooltip');
I.moveCursorTo('#submit', 5,5);

# Parameters

# saveElementScreenshot

Saves screenshot of the specified locator to ouput folder (set in codecept.json or codecept.conf.js). Filename is relative to output folder.

I.saveElementScreenshot(`#submit`,'debug.png');

# Parameters

# saveScreenshot

Saves a screenshot to ouput folder (set in codecept.json or codecept.conf.js). Filename is relative to output folder. Optionally resize the window to the full available page scrollHeight and scrollWidth to capture the entire page by passing true in as the second argument.

I.saveScreenshot('debug.png');
I.saveScreenshot('debug.png', true) //resizes to available scrollHeight and scrollWidth before taking screenshot

# Parameters

# type

Types out the given text into an active field. To slow down typing use a second parameter, to set interval between key presses. Note: Should be used when fillField is not an option.

// passing in a string
I.type('Type this out.');

// typing values with a 100ms interval
I.type('4141555311111111', 100);

// passing in an array
I.type(['T', 'E', 'X', 'T']);

# Parameters

# dragAndDrop

Drag an item to a destination element.

I.dragAndDrop('#dragHandle', '#container');

# Parameters

# dragSlider

Drag the scrubber of a slider to a given position For fuzzy locators, fields are matched by label text, the "name" attribute, CSS, and XPath.

I.dragSlider('#slider', 30);
I.dragSlider('#slider', -70);

# Parameters

# grabAllWindowHandles

Get all Window Handles. Useful for referencing a specific handle when calling I.switchToWindow(handle)

const windows = await I.grabAllWindowHandles();

Returns Promise (opens new window)<Array (opens new window)<string (opens new window)>>

# grabCurrentWindowHandle

Get the current Window Handle. Useful for referencing it when calling I.switchToWindow(handle)

const window = await I.grabCurrentWindowHandle();

Returns Promise (opens new window)<string (opens new window)>

# switchToWindow

Switch to the window with a specified handle.

const windows = await I.grabAllWindowHandles();
// ... do something
await I.switchToWindow( windows[0] );

const window = await I.grabCurrentWindowHandle();
// ... do something
await I.switchToWindow( window );

# Parameters

# closeOtherTabs

Close all tabs except for the current one.

I.closeOtherTabs();

# switchTo

Switches frame or in case of null locator reverts to parent.

I.switchTo('iframe'); // switch to first iframe
I.switchTo(); // switch back to main page

# Parameters

# grabNumberOfOpenTabs

Grab number of open tabs. Resumes test execution, so should be used inside async function with await operator.

let tabs = await I.grabNumberOfOpenTabs();

Returns Promise (opens new window)<number (opens new window)> number of open tabs

# scrollPageToTop

Scroll page to the top.

I.scrollPageToTop();

# scrollPageToBottom

Scroll page to the bottom.

I.scrollPageToBottom();

# grabPageScrollPosition

Retrieves a page scroll position and returns it to test. Resumes test execution, so should be used inside an async function with await operator.

let { x, y } = await I.grabPageScrollPosition();

Returns Promise (opens new window)<PageScrollPosition> scroll position

# setGeoLocation

Set the current geo location

I.setGeoLocation(121.21, 11.56);
I.setGeoLocation(121.21, 11.56, 10);

# Parameters

# grabGeoLocation

Return the current geo location Resumes test execution, so should be used inside async function with await operator.

let geoLocation = await I.grabGeoLocation();

Returns Promise (opens new window)<{latitude: number (opens new window), longitude: number (opens new window), altitude: number (opens new window)}>

# grabElementBoundingRect

Grab the width, height, location of given locator. Provide width or heightas second param to get your desired prop. Resumes test execution, so should be used inside an async function with await operator.

Returns an object with x, y, width, height keys.

const value = await I.grabElementBoundingRect('h3');
// value is like { x: 226.5, y: 89, width: 527, height: 220 }

To get only one metric use second parameter:

const width = await I.grabElementBoundingRect('h3', 'width');
// width == 527

# Parameters

Returns (Promise (opens new window)<DOMRect> | Promise (opens new window)<number (opens new window)>) Element bounding rectangle

Last Updated: 9/30/2020, 3:51:13 PM