Skip to content

Latest commit

 

History

History
445 lines (315 loc) · 16.8 KB

APIRef.DeviceObjectAPI.md

File metadata and controls

445 lines (315 loc) · 16.8 KB

The device Object

device is globally available in every test file, it enables control over the current attached device (currently only simulators are supported).

Public Properties

device.id

Holds the environment-unique ID of the device - namely, the adb ID on Android (e.g. emulator-5554) and the Mac-global simulator UDID on iOS, as used by simctl (e.g. AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE).

The value will be undefined until the device is properly prepared (i.e. in detox.init()).

device.name

Holds a descriptive name of the device. Example: emulator-5554 (Pixel_API_26)

The value will be undefined until the device is properly prepared (i.e. in detox.init()).

Methods

device.launchApp(params)

Launch the app defined in the current configuration.

params—object, containing one of more of the following keys and values:

1. newInstance—Launching a New Instance of the App

Terminate the app and launch it again.

If set to false, the device will try to resume the app (e.g. bring from foreground to background). If the app isn't running, it will launch a new instance nonetheless. Default is false.

await device.launchApp({newInstance: true});
2. permissions—Set Runtime Permissions (iOS Only)

Grants or denies runtime permissions to your application. This will cause the app to terminate before permissions are applied.

await device.launchApp({permissions: {calendar: 'YES'}});

Detox uses AppleSimUtils to implement this functionality for iOS simulators. Read about the different types of permissions and how to set them in AppleSimUtils' documentation and by checking out Detox's own test suite.

3. url—Launching with URL

Launches the app with the specified URL to test your app's deep link handling mechanism.

await device.launchApp({url});
await device.launchApp({url, newInstance: true}); // Launch a new instance of the app
await device.launchApp({url, newInstance: false}); // Reuse existing instance

Read more here. Go back to subsection 1 to read about the full effect of the newInstance argument.

4. userNotification—Launching with User Notifications

Launches with the specified user notification.

await device.launchApp({userNotification});
await device.launchApp({userNotification, newInstance: true}); // Launch a new instance of the app
await device.launchApp({userNotification, newInstance: false}); // Reuse existing instance

Read more here. Go back to subsection 1 to read about the full effect of the newInstance argument.

5. userActivity—Launch with User Activity (iOS Only)

Launches the app with the specified user activity.

await device.launchApp({userActivity: activity});
await device.launchApp({userActivity: activity, newInstance: true}); //Launch a new instance of the app
await device.launchApp({userActivity: activity, newInstance: false}); //Reuse existing instance

Read more in here. Go back to subsection 1 to read about the full effect of the newInstance argument.

6. delete—Delete and Reinstall Application Before Launching

Before launching the application, it is uninstalled and then reinstalled.

A flag that enables relaunching into a fresh installation of the app (it will uninstall and install the binary. Default is false.

await device.launchApp({delete: true});
7. launchArgs—Additional Process Launch Arguments

Starts the app's process with the specified launch arguments.

await device.launchApp({launchArgs: {arg1: 1, arg2: "2"}});

On iOS, the specified launch arguments are passed as the process launch arguments and available through normal means.

On Android, the launch arguments are set as bundle-extra into the activity's intent. It will therefore be accessible on the native side via the current activity as: currentActivity.getIntent().getBundleExtra("launchArgs").

Further handling of these launch arguments is up to the user's responsibility and is out of scope for Detox.

8. disableTouchIndicators—Disable Touch Indicators (iOS Only)

Disables touch indicators on iOS. Default is false.

await device.launchApp({disableTouchIndicators: true});
9. languageAndLocale—Launch with a Specific Language and/or Local (iOS Only)

Launch the app with a specific system language

Information about accepted values can be found here.

await device.launchApp({
  languageAndLocale: {
    language: "es-MX",
    locale: "es-MX"
  }
});

With this API, you can run sets of e2e tests per language. For example:

['es-MX', 'fr-FR', 'pt-BR'].forEach(locale => {
  describe(`Test suite in ${locale}`, () => {

    beforeAll(async () => {
      await device.launchApp({
        newInstance: true,
        languageAndLocale: {
          language: locale,
          locale
        }
      });
    });


    it('Test A', () => {
      
    })

    it('Test B', () => {
      
    })

  });
});
10. detoxEnableSynchronization—Initialize Detox with synchronization enabled or disabled at app launch

Launches the app with the synchronization mechanism enabled or disabled. Useful if the app cannot be synchronized during the launch process. Synchronization can later be enabled using device.enableSynchronization().

await device.launchApp({
  newInstance: true,
  launchArgs: { detoxEnableSynchronization: 0 }
}); 
11. detoxURLBlacklistRegex—Initialize the URL Blacklist at app launch

Launches the app with a URL blacklist to disable network synchronization on certain endpoints. Useful if the app makes frequent network calls to blacklisted endpoints upon startup.

await device.launchApp({
  newInstance: true,
  launchArgs: { detoxURLBlacklistRegex: ' \\("http://192.168.1.253:19001/onchange","https://e.crashlytics.com/spi/v2/events"\\)' },
}); 

device.relaunchApp(params)

Deprecated: Use device.launchApp(params) instead. The method calls launchApp({newInstance: true}) for backwards compatibility.

device.terminateApp()

By default, terminateApp() with no params will terminate the app file defined in the current configuration.

To terminate another app, specify its bundle id

await device.terminateApp('other.bundle.id');

device.sendToHome()

Send application to background by bringing com.apple.springboard to the foreground. Combining sendToHome() with launchApp({newInstance: false}) will simulate app coming back from background. Check out Detox's own test suite

await device.sendToHome();
await device.launchApp({newInstance: false});
// app returned from background, do stuff

Check out Detox's own test suite

device.reloadReactNative()

If this is a React Native app, reload the React Native JS bundle. This action is much faster than device.launchApp(), and can be used if you just need to reset your React Native logic.

Note: This functionality does not work without faults. Under certain conditions, the system may not behave as expected and/or even crash. In these cases, use device.launchApp() to launch the app cleanly instead of only reloading the JS bundle.

device.installApp()

By default, installApp() with no params will install the app file defined in the current configuration.

To install another app, specify its path

await device.installApp('path/to/other/app');

device.uninstallApp()

By default, uninstallApp() with no params will uninstall the app defined in the current configuration.

To uninstall another app, specify its bundle id

await device.uninstallApp('other.bundle.id');

device.openURL({url, sourceApp[optional]})

Mock opening the app from URL. sourceApp is an optional iOS-only parameter to specify source application bundle id.

Read more in Mocking Open From URL section. Check out Detox's own test suite

device.sendUserNotification(params)

Mock handling of a user notification previously received in the system, while the app is already running.

Read more in Mocking User Notifications section. Check out Detox's own test suite

device.sendUserActivity(params)

iOS-only API

Mock handling of received user activity when app is in foreground. Read more in Mocking User Activity section. Check out Detox's own test suite

device.setOrientation(orientation)

Takes "portrait" or "landscape" and rotates the device to the given orientation. Currently only available in the iOS Simulator. Check out Detox's own test suite

device.setLocation(lat, lon)

Note: setLocation is dependent on fbsimctl. if fbsimctl is not installed, the command will fail, asking for it to be installed. Sets the simulator location to the given latitude and longitude.

await device.setLocation(32.0853, 34.7818);

device.setURLBlacklist([urls])

Disable EarlGrey's network synchronization mechanism on preferred endpoints. Useful if you want to on skip over synchronizing on certain URLs. To disable endpoints at initialization, pass in the blacklist at device launch.

await device.setURLBlacklist(['.*127.0.0.1.*']);
await device.setURLBlacklist(['.*my.ignored.endpoint.*']);

device.enableSynchronization()

Enable EarlGrey's synchronization mechanism (enabled by default). This is being reset on every new instance of the app.

await device.enableSynchronization();

device.disableSynchronization()

Disable EarlGrey's synchronization mechanism (enabled by default) This is being reset on every new instance of the app.

await device.disableSynchronization();

device.resetContentAndSettings() iOS Only

Resets the Simulator to clean state (like the Simulator > Reset Content and Settings... menu item), especially removing previously set permissions.

await device.resetContentAndSettings();

device.getPlatform()

Returns the current device, ios or android.

if (device.getPlatform() === 'ios') {
  await expect(loopSwitch).toHaveValue('1');
}

device.takeScreenshot(name)

Takes a screenshot on the device and schedules putting it to the artifacts folder upon completion of the current test.

Returns a temporary path to the screenshot.

NOTE: The returned path is guaranteed to be valid only during the test execution. Later on, the screenshot will be moved to the artifacts location.

Consider the example below:

describe('Menu items', () => {
  it('should have Logout', async () => {
    // ...
    const screenshotPath = await device.takeScreenshot('tap on menu');
    // ...
  });
});

In this example:

  • If --take-screenshots none is set, the screenshot will be taken, but it won't be saved to <artifacts-location> after the test ends.
  • If --take-screenshots failing is set, and the test passes, the screenshot won't be saved to <artifacts-location> after the test ends.
  • In the other modes (manual and all), if the test passes, the screenshot will be put to <artifacts-location>/✓ Menu items should have Logout/tap on menu.png.
  • In the other modes (manual and all), if the test fails, the screenshot will be put to <artifacts-location>/✗ Menu items should have Logout/tap on menu.png.

device.shake() iOS Only

Simulate shake

device.setBiometricEnrollment(bool) iOS Only

Toggles device enrollment in biometric auth (TouchID or FaceID).

await device.setBiometricEnrollment(true);
// or
await device.setBiometricEnrollment(false);

device.matchFace() iOS Only

Simulates the success of a face match via FaceID

device.unmatchFace() iOS Only

Simulates the failure of face match via FaceID

device.matchFinger() iOS Only

Simulates the success of a finger match via TouchID

device.unmatchFinger() iOS Only

Simulates the failure of a finger match via TouchID

device.clearKeychain() iOS Only

Clears the device keychain

device.setStatusBar() iOS Only

Override simulator's status bar. Available options:

{
  time: "12:34"
  // Set the date or time to a fixed value.
  // If the string is a valid ISO date string it will also set the date on relevant devices.
  dataNetwork: "wifi"
  // If specified must be one of 'wifi', '3g', '4g', 'lte', 'lte-a', or 'lte+'.
  wifiMode: "failed"
  // If specified must be one of 'searching', 'failed', or 'active'.
  wifiBars: "2"
  // If specified must be 0-3.
  cellularMode: "searching"
  // If specified must be one of 'notSupported', 'searching', 'failed', or 'active'.
  cellularBars: "3"
  // If specified must be 0-4.
  batteryState: "charging"
  // If specified must be one of 'charging', 'charged', or 'discharging'.
  batteryLevel: "50"
  // If specified must be 0-100.
}

device.resetStatusBar() iOS Only

Resets any override in simulator's status bar.

device.reverseTcpPort() Android Only

Reverse a TCP port from the device (guest) back to the host-computer, as typically done with the adb reverse command. The end result would be that all network requests going from the device to the specified port will be forwarded to the computer.

device.unreverseTcpPort() Android Only

Clear a reversed TCP-port (e.g. previously set using device.reverseTcpPort()).

device.pressBack() Android Only

Simulate press back button.

await device.pressBack();

device.getUiDevice() Android Only

Exposes UiAutomator's UiDevice API (https://developer.android.com/reference/android/support/test/uiautomator/UiDevice) This is not a part of the official Detox API, it may break and change whenever an update to UiDevice or UiAutomator gradle dependencies ('androidx.test.uiautomator:uiautomator') is introduced.

UiDevice's autogenerated code