diff --git a/demo/JavaScriptApp/app/main-page.android.xml b/demo/JavaScriptApp/app/main-page.android.xml
index 35578b2c..8a128c2c 100644
--- a/demo/JavaScriptApp/app/main-page.android.xml
+++ b/demo/JavaScriptApp/app/main-page.android.xml
@@ -25,15 +25,18 @@ https://docs.nativescript.org/ui/components.
class names available for styling your app at https://docs.nativescript.org/ui/theme.
-->
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
diff --git a/demo/JavaScriptApp/app/main-page.ios.xml b/demo/JavaScriptApp/app/main-page.ios.xml
index bfe7f17f..2c313ca3 100644
--- a/demo/JavaScriptApp/app/main-page.ios.xml
+++ b/demo/JavaScriptApp/app/main-page.ios.xml
@@ -25,15 +25,18 @@ https://docs.nativescript.org/ui/components.
class names available for styling your app at https://docs.nativescript.org/ui/theme.
-->
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
diff --git a/demo/JavaScriptApp/e2e/config/appium.capabilities.json b/demo/JavaScriptApp/e2e/config/appium.capabilities.json
new file mode 100644
index 00000000..630f6215
--- /dev/null
+++ b/demo/JavaScriptApp/e2e/config/appium.capabilities.json
@@ -0,0 +1,106 @@
+{
+ "android19": {
+ "platformName": "Android",
+ "platformVersion": "4.4",
+ "deviceName": "Emulator-Api19-Default",
+ "avd": "Emulator-Api19-Default",
+ "lt": 60000,
+ "appActivity": "com.tns.NativeScriptActivity",
+ "newCommandTimeout": 720,
+ "noReset": true,
+ "fullReset": false,
+ "app": ""
+ },
+ "android21": {
+ "platformName": "Android",
+ "platformVersion": "5.0",
+ "deviceName": "Emulator-Api21-Default",
+ "avd": "Emulator-Api21-Default",
+ "lt": 60000,
+ "appActivity": "com.tns.NativeScriptActivity",
+ "newCommandTimeout": 720,
+ "noReset": true,
+ "fullReset": false,
+ "app": ""
+ },
+ "android23": {
+ "platformName": "Android",
+ "platformVersion": "6.0",
+ "deviceName": "Emulator-Api23-Default",
+ "avd": "Emulator-Api23-Default",
+ "lt": 60000,
+ "appActivity": "com.tns.NativeScriptActivity",
+ "newCommandTimeout": 720,
+ "noReset": true,
+ "fullReset": false,
+ "app": ""
+ },
+ "android24": {
+ "platformName": "Android",
+ "platformVersion": "7.0",
+ "deviceName": "Emulator-Api24-Default",
+ "avd": "Emulator-Api24-Default",
+ "lt": 60000,
+ "appActivity": "com.tns.NativeScriptActivity",
+ "newCommandTimeout": 720,
+ "noReset": true,
+ "fullReset": false,
+ "app": ""
+ },
+ "android25": {
+ "platformName": "Android",
+ "platformVersion": "7.1",
+ "deviceName": "Emulator-Api25-Google",
+ "avd": "Emulator-Api25-Google",
+ "lt": 60000,
+ "appActivity": "com.tns.NativeScriptActivity",
+ "newCommandTimeout": 720,
+ "noReset": true,
+ "fullReset": false,
+ "app": ""
+ },
+ "android26": {
+ "platformName": "Android",
+ "platformVersion": "8.0",
+ "deviceName": "Emulator-Api26-Google",
+ "avd": "Emulator-Api26-Google",
+ "lt": 60000,
+ "appActivity": "com.tns.NativeScriptActivity",
+ "newCommandTimeout": 720,
+ "noReset": true,
+ "fullReset": false,
+ "app": ""
+ },
+ "sim.iPhone7.iOS100": {
+ "platformName": "iOS",
+ "platformVersion": "10.0",
+ "deviceName": "iPhone 7 100",
+ "noReset": true,
+ "fullReset": false,
+ "app": ""
+ },
+ "sim.iPhone8.iOS110": {
+ "platformName": "iOS",
+ "platformVersion": "11.0",
+ "deviceName": "iPhone 8 110",
+ "noReset": true,
+ "fullReset": false,
+ "app": ""
+ },
+ "sim.iPhoneX.iOS110": {
+ "platformName": "iOS",
+ "platformVersion": "11.0",
+ "deviceName": "iPhone X",
+ "noReset": true,
+ "fullReset": false,
+ "app": ""
+ },
+ "sim.iPhoneX.iOS111": {
+ "platformName": "iOS",
+ "platformVersion": "11.1",
+ "deviceName": "iPhone X",
+ "noReset": true,
+ "fullReset": false,
+ "app": ""
+ }
+}
diff --git a/demo/JavaScriptApp/e2e/config/mocha.opts b/demo/JavaScriptApp/e2e/config/mocha.opts
new file mode 100644
index 00000000..796ec472
--- /dev/null
+++ b/demo/JavaScriptApp/e2e/config/mocha.opts
@@ -0,0 +1,4 @@
+--timeout 80000
+--recursive e2e
+--reporter mocha-multi
+--reporter-options spec=-,mocha-junit-reporter=test-results.xml
\ No newline at end of file
diff --git a/demo/JavaScriptApp/e2e/resources/images/JavaScriptApp/android/style.png b/demo/JavaScriptApp/e2e/resources/images/JavaScriptApp/android/style.png
new file mode 100644
index 00000000..0d06ce7a
Binary files /dev/null and b/demo/JavaScriptApp/e2e/resources/images/JavaScriptApp/android/style.png differ
diff --git a/demo/JavaScriptApp/e2e/resources/images/JavaScriptApp/ios/style.png b/demo/JavaScriptApp/e2e/resources/images/JavaScriptApp/ios/style.png
new file mode 100644
index 00000000..091628ed
Binary files /dev/null and b/demo/JavaScriptApp/e2e/resources/images/JavaScriptApp/ios/style.png differ
diff --git a/demo/JavaScriptApp/e2e/setup.js b/demo/JavaScriptApp/e2e/setup.js
new file mode 100644
index 00000000..0809e972
--- /dev/null
+++ b/demo/JavaScriptApp/e2e/setup.js
@@ -0,0 +1,18 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const nativescript_dev_appium_1 = require("nativescript-dev-appium");
+before("start server", () => __awaiter(this, void 0, void 0, function* () {
+ yield nativescript_dev_appium_1.startServer();
+}));
+after("stop server", () => __awaiter(this, void 0, void 0, function* () {
+ yield nativescript_dev_appium_1.stopServer();
+}));
+//# sourceMappingURL=setup.js.map
\ No newline at end of file
diff --git a/demo/JavaScriptApp/e2e/tests.e2e-spec.js b/demo/JavaScriptApp/e2e/tests.e2e-spec.js
new file mode 100644
index 00000000..169ca81c
--- /dev/null
+++ b/demo/JavaScriptApp/e2e/tests.e2e-spec.js
@@ -0,0 +1,77 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const nativescript_dev_appium_1 = require("nativescript-dev-appium");
+const chai_1 = require("chai");
+describe("sample scenario", () => {
+ let driver;
+ before(() => __awaiter(this, void 0, void 0, function* () {
+ driver = yield nativescript_dev_appium_1.createDriver();
+ }));
+ beforeEach(function () {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ const lblPlatform = yield getPlatformLabel();
+ }
+ catch (err) {
+ console.log("Navigating to main page ...");
+ yield driver.navBack();
+ }
+ });
+ });
+ afterEach(function () {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (this.currentTest.state === "failed") {
+ yield driver.logPageSource(this.currentTest.title);
+ yield driver.logScreenshot(this.currentTest.title);
+ }
+ });
+ });
+ after(() => __awaiter(this, void 0, void 0, function* () {
+ yield driver.quit();
+ console.log("Quit driver!");
+ }));
+ it("should the button on second page work", () => __awaiter(this, void 0, void 0, function* () {
+ const btnNav = yield driver.findElementByText("btnNav");
+ yield btnNav.tap();
+ const secondPage = yield driver.findElementByText("Second Page");
+ const btnZero = yield driver.findElementByText("0");
+ yield btnZero.tap();
+ // In iOS, the `automationText` property applies on both `name` and `label`:
+ // https://github.com/NativeScript/NativeScript/issues/3150
+ //
+ //
+ const btnOne = yield driver.findElementByText("1");
+ yield driver.navBack();
+ }));
+ it("should the button on main page work", () => __awaiter(this, void 0, void 0, function* () {
+ const btnTap = yield driver.findElementByText("TAP");
+ yield btnTap.tap();
+ const lblTaps = yield driver.findElementByText("taps left", 1 /* contains */);
+ const lblTapsText = yield lblTaps.text();
+ chai_1.assert.isTrue(lblTapsText.includes("41"));
+ }));
+ const styleTypes = {
+ "inline": "styleInline",
+ "page": "stylePage",
+ "app": "styleApp"
+ };
+ for (let styleType in styleTypes) {
+ it(`should find an element with ${styleType} style applied`, function () {
+ return __awaiter(this, void 0, void 0, function* () {
+ const element = yield driver.findElementByText(styleTypes[styleType]);
+ const result = yield driver.compareElement(element, "style");
+ chai_1.assert.isTrue(result);
+ });
+ });
+ }
+ const getPlatformLabel = () => __awaiter(this, void 0, void 0, function* () { return driver.isAndroid ? yield driver.findElementByText("android") : yield driver.findElementByText("ios"); });
+});
+//# sourceMappingURL=tests.e2e-spec.js.map
\ No newline at end of file
diff --git a/demo/JavaScriptApp/package.json b/demo/JavaScriptApp/package.json
index 8b487cfc..25dd1ff0 100644
--- a/demo/JavaScriptApp/package.json
+++ b/demo/JavaScriptApp/package.json
@@ -24,6 +24,7 @@
"css-loader": "~0.28.7",
"extract-text-webpack-plugin": "~3.0.0",
"lazy": "1.0.11",
+ "nativescript-dev-appium": "next",
"nativescript-dev-sass": "^1.3.5",
"nativescript-dev-webpack": "file:../..",
"nativescript-worker-loader": "~0.8.1",
@@ -42,6 +43,7 @@
"build-android-bundle": "npm run ns-bundle --android --build-app",
"build-ios-bundle": "npm run ns-bundle --ios --build-app",
"publish-ios-bundle": "npm run ns-bundle --ios --publish-app",
- "generate-android-snapshot": "generate-android-snapshot --targetArchs arm,arm64,ia32 --install"
+ "generate-android-snapshot": "generate-android-snapshot --targetArchs arm,arm64,ia32 --install",
+ "e2e": "mocha --opts ./e2e/config/mocha.opts"
}
-}
+}
\ No newline at end of file
diff --git a/demo/TypeScriptApp/e2e/tests.e2e-spec.ts b/demo/TypeScriptApp/e2e/tests.e2e-spec.ts
index 01a8cef1..ed4c5e80 100644
--- a/demo/TypeScriptApp/e2e/tests.e2e-spec.ts
+++ b/demo/TypeScriptApp/e2e/tests.e2e-spec.ts
@@ -2,7 +2,6 @@ import { AppiumDriver, createDriver, SearchOptions } from "nativescript-dev-appi
import { assert } from "chai";
describe("sample scenario", () => {
- const defaultWaitTime = 5000;
let driver: AppiumDriver;
before(async () => {
@@ -20,6 +19,7 @@ describe("sample scenario", () => {
afterEach(async function () {
if (this.currentTest.state === "failed") {
+ await driver.logPageSource(this.currentTest.title);
await driver.logScreenshot(this.currentTest.title);
}
});