diff --git a/packages/core/scripts/e2e/index.js b/packages/core/scripts/e2e/index.js
index 2401cb4a42..88c2c2c45b 100644
--- a/packages/core/scripts/e2e/index.js
+++ b/packages/core/scripts/e2e/index.js
@@ -6,6 +6,7 @@ const Mocha = require('mocha');
const path = require('path');
const webdriver = require('selenium-webdriver');
const chromedriver = require('chromedriver');
+const argv = require('yargs').argv
const Page = require('./page');
const Snapshot = require('./snapshot');
@@ -54,21 +55,19 @@ function getTestFiles() {
}
function processCommandLine() {
- process.argv.forEach(arg => {
- if (arg === '--snapshot') {
- takeScreenshots = true;
- }
+ if (argv.snapshot) {
+ takeScreenshots = true;
+ }
- if (arg.indexOf('-f') > -1) {
- folder = arg.split('=')[1];
- }
- });
+ if (argv.f || argv.folder) {
+ folder = argv.f || argv.folder;
+ }
}
function registerE2ETest(desc, tst) {
// NOTE: Do not use an arrow function here because: https://mochajs.org/#arrow-functions
it(desc, async function() {
- await tst(driver);
+ await tst(driver, this);
if (takeScreenshots) {
await snapshot.takeScreenshot(driver, {
name: this.test.fullTitle().replace(/(^[\w-]+\/[\w-]+)/, '$1:'),
@@ -106,44 +105,60 @@ async function run() {
const files = await getTestFiles();
files.forEach(f => mocha.addFile(f));
- mocha.loadFiles(() => {
- specIndex = 0;
+ const snapshot = await mochaLoadFiles(mocha);
+ const failures = await mochaRun(mocha);
- snapshot = new Snapshot({
- groupId: 'ionic-core',
- appId: 'snapshots',
- testId: generateTestId(),
- domain: 'ionic-snapshot-go.appspot.com',
- // domain: 'localhost:8080',
- sleepBetweenSpecs: 750,
- totalSpecs: getTotalTests(mocha.suite),
- platformDefaults: {
- browser: 'chrome',
- platform: 'linux',
- params: {
- platform_id: 'chrome_400x800',
- platform_index: 0,
- platform_count: 1,
- width: 400,
- height: 814
- }
- },
- accessKey: process.env.IONIC_SNAPSHOT_KEY
- });
+ if (takeScreenshots) {
+ snapshot.finish();
+ }
+ devServer.close();
+ driver.quit();
+ if (failures) {
+ throw new Error(failures);
+ }
+}
+
+function mochaRun(mocha) {
+ return new Promise((resolve, reject) => {
mocha.run(function(failures) {
- process.on('exit', function() {
- process.exit(failures); // exit with non-zero status if there were failures
- });
- if (takeScreenshots) {
- snapshot.finish();
- }
- devServer.close();
- driver.quit();
+ resolve(failures);
});
});
}
+function mochaLoadFiles(mocha) {
+ return new Promise((resolve, reject) => {
+ mocha.loadFiles(() => {
+ specIndex = 0;
+
+ const snapshot = new Snapshot({
+ groupId: 'ionic-core',
+ appId: 'snapshots',
+ testId: generateTestId(),
+ domain: 'ionic-snapshot-go.appspot.com',
+ // domain: 'localhost:8080',
+ sleepBetweenSpecs: 750,
+ totalSpecs: getTotalTests(mocha.suite),
+ platformDefaults: {
+ browser: 'chrome',
+ platform: 'linux',
+ params: {
+ platform_id: 'chrome_400x800',
+ platform_index: 0,
+ platform_count: 1,
+ width: 400,
+ height: 814
+ }
+ },
+ accessKey: process.env.IONIC_SNAPSHOT_KEY
+ });
+ resolve(snapshot);
+ });
+ });
+}
+
+
function parseSemver(str) {
return /(\d+)\.(\d+)\.(\d+)/
.exec(str)
@@ -162,7 +177,11 @@ function validateNodeVersion(version) {
// Invoke run() only if executed directly i.e. `node ./scripts/e2e`
if (require.main === module) {
validateNodeVersion(process.version);
- run();
+ run().catch((err) => {
+ console.log(err);
+ // fail with non-zero status code
+ process.exit(1);
+ });
}
module.exports = {
diff --git a/packages/core/src/components/nav/test/basic/e2e.js b/packages/core/src/components/nav/test/basic/e2e.js
index 881c7120e6..a31112aa41 100644
--- a/packages/core/src/components/nav/test/basic/e2e.js
+++ b/packages/core/src/components/nav/test/basic/e2e.js
@@ -11,9 +11,55 @@ class E2ETestPage extends Page {
platforms.forEach(platform => {
describe('nav/basic', () => {
+
register('should init', driver => {
const page = new E2ETestPage(driver, platform);
return page.navigate();
});
+
+ register('should go to page-one, page-two, page-three, then back to page-two, page-one', async (driver, testContext) => {
+
+ testContext.timeout(10000);
+ const page = new E2ETestPage(driver, platform);
+
+ // go to page two
+ const pageOneNextButtonSelector = '.first-page ion-button.next.hydrated';
+ const pageOneNextButton = await getElement(driver, pageOneNextButtonSelector);
+ pageOneNextButton.click();
+ await waitForTransition(600);
+
+ // go to page three
+ const pageTwoNextButtonSelector = '.second-page ion-button.next.hydrated';
+ const pageTwoNextButton = await getElement(driver, pageTwoNextButtonSelector);
+ pageTwoNextButton.click();
+ await waitForTransition(600);
+
+ // go back to page two
+ const pageThreeBackButtonSelector = '.third-page ion-button.previous.hydrated';
+ const pageThreeBackButton = await getElement(driver, pageThreeBackButtonSelector);
+ pageThreeBackButton.click();
+ await waitForTransition(600);
+
+ // go back to page two
+ const pageTwoBackButtonSelector = '.second-page ion-button.previous.hydrated';
+ const pageTwoBackButton = await getElement(driver, pageTwoBackButtonSelector);
+ pageTwoBackButton.click();
+ await waitForTransition(600);
+
+ // we're back on page one now
+ });
});
});
+
+async function getElement(driver, selector) {
+ driver.wait(until.elementLocated(By.css(selector)));
+ const element = driver.findElement(By.css(selector));
+ await driver.wait(until.elementIsVisible(driver.findElement(By.css(selector))));
+ return element;
+}
+
+function waitForTransition(duration) {
+ return new Promise(resolve => {
+ setTimeout(resolve, duration);
+ })
+}
diff --git a/packages/core/src/components/nav/test/basic/index.html b/packages/core/src/components/nav/test/basic/index.html
index 5e8957175b..9769efa160 100644
--- a/packages/core/src/components/nav/test/basic/index.html
+++ b/packages/core/src/components/nav/test/basic/index.html
@@ -7,7 +7,6 @@
-
@@ -41,7 +40,7 @@
Page One
- Go to Page Two
+ Go to Page Two
`;
diff --git a/packages/core/src/components/nav/test/simple-nested-navs/e2e.js b/packages/core/src/components/nav/test/simple-nested-navs/e2e.js
new file mode 100644
index 0000000000..0f3b6f715d
--- /dev/null
+++ b/packages/core/src/components/nav/test/simple-nested-navs/e2e.js
@@ -0,0 +1,289 @@
+'use strict';
+
+const { By, until } = require('selenium-webdriver');
+const expect = require('chai').expect;
+const { register, Page, platforms } = require('../../../../../scripts/e2e');
+
+class E2ETestPage extends Page {
+ constructor(driver, platform) {
+ super(driver, `http://localhost:3333/src/components/nav/test/simple-nested-navs?ionicplatform=${platform}`);
+ }
+}
+
+platforms.forEach(platform => {
+ describe('nav/simple-nested-navs', () => {
+ register('should init', driver => {
+ const page = new E2ETestPage(driver, platform);
+ return page.navigate();
+ });
+
+ register('should go from nav-one-page-one, nav-one-page-two, nav-two-page-one, nav-one-page-three, nav-one-page-two, nav-one-page-one', async (driver, testContext) => {
+
+ testContext.timeout(60000);
+ const page = new E2ETestPage(driver, platform);
+
+ await waitForTransition(300);
+
+ console.log('On Nav One Page One');
+ const navOnePageOneNextButtonSelector = '.nav-one-page-one ion-button.next.hydrated';
+ const navOnePageOneNextButton = await waitAndGetElement(driver, navOnePageOneNextButtonSelector);
+ navOnePageOneNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page Two');
+ const navOnePageTwoNextButtonSelector = '.nav-one-page-two ion-button.next.hydrated';
+ const navOnePageTwoNextButton = await waitAndGetElement(driver, navOnePageTwoNextButtonSelector);
+ navOnePageTwoNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page One');
+ const navTwoPageOneNextButtonSelector = '.nav-two-page-one ion-button.next.nav-one.hydrated';
+ const navTwoPageOneNextButton = await waitAndGetElement(driver, navTwoPageOneNextButtonSelector);
+ navTwoPageOneNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page Three');
+ const navOnePageThreePreviousButtonSelector = '.nav-one-page-three ion-button.previous.hydrated';
+ const navOnePageThreePreviousButton = await waitAndGetElement(driver, navOnePageThreePreviousButtonSelector);
+ navOnePageThreePreviousButton.click();
+ await waitForTransition(600);
+
+
+ console.log('On Nav Two Page One');
+ const navTwoPageOnePreviousButtonSelector = '.nav-two-page-one ion-button.previous.nav-one.hydrated';
+ const navTwoPageOnePreviousButton = await waitAndGetElement(driver, navTwoPageOnePreviousButtonSelector);
+ navTwoPageOnePreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page Two');
+ const navOnePageTwoPreviousButtonSelector = '.nav-one-page-two ion-button.previous.hydrated';
+ const navOnePageTwoPreviousButton = await waitAndGetElement(driver, navOnePageTwoPreviousButtonSelector);
+ navOnePageTwoPreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page One');
+ const navOnePageOneSelector = '.nav-one-page-one';
+ const navOnePageOne = await waitAndGetElement(driver, navOnePageOneSelector);
+ });
+
+
+ register('should go from nav-one-page-one, nav-one-page-two, nav-two-page-one, nav-two-page-two, nav-three-page-one, nav two-page-three and so on', async (driver, testContext) => {
+
+ testContext.timeout(60000);
+ const page = new E2ETestPage(driver, platform);
+
+ await waitForTransition(300);
+
+ console.log('On Nav One Page One');
+ const navOnePageOneNextButtonSelector = '.nav-one-page-one ion-button.next.hydrated';
+ const navOnePageOneNextButton = await waitAndGetElement(driver, navOnePageOneNextButtonSelector);
+ navOnePageOneNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page Two');
+ const navOnePageTwoNextButtonSelector = '.nav-one-page-two ion-button.next.hydrated';
+ const navOnePageTwoNextButton = await waitAndGetElement(driver, navOnePageTwoNextButtonSelector);
+ navOnePageTwoNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page One');
+ const navTwoPageOneNextButtonSelector = '.nav-two-page-one ion-button.next.nav-two.hydrated';
+ const navTwoPageOneNextButton = await waitAndGetElement(driver, navTwoPageOneNextButtonSelector);
+ navTwoPageOneNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page Two');
+ const navTwoPageTwoNextButtonSelector = '.nav-two-page-two ion-button.next.hydrated';
+ const navTwoPageTwoNextButton = await waitAndGetElement(driver, navTwoPageTwoNextButtonSelector);
+ navTwoPageTwoNextButton.click();
+ await waitForTransition(600);
+
+
+ console.log('On Nav Three Page One');
+ const navThreePageOneNextButtonSelector = '.nav-three-page-one ion-button.next.nav-two.hydrated';
+ const navThreePageOneNextButton = await waitAndGetElement(driver, navThreePageOneNextButtonSelector);
+ navThreePageOneNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page Three');
+ const navTwoPageThreePreviousButtonSelector = '.nav-two-page-three ion-button.previous.hydrated';
+ const navTwoPageThreePreviousButton = await waitAndGetElement(driver, navTwoPageThreePreviousButtonSelector);
+ navTwoPageThreePreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Three Page One');
+ const navThreePageOnePreviousButtonSelector = '.nav-three-page-one ion-button.previous.nav-two.hydrated';
+ const navThreePageOnePreviousButton = await waitAndGetElement(driver, navThreePageOnePreviousButtonSelector);
+ navThreePageOnePreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page Two');
+ const navTwoPageTwoPreviousButtonSelector = '.nav-two-page-two ion-button.previous.hydrated';
+ const navTwoPageTwoPreviousButton = await waitAndGetElement(driver, navTwoPageTwoPreviousButtonSelector);
+ navTwoPageTwoPreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page One');
+ const navTwoPageOnePreviousButtonSelector = '.nav-two-page-one ion-button.previous.nav-one.hydrated';
+ const navTwoPageOnePreviousButton = await waitAndGetElement(driver, navTwoPageOnePreviousButtonSelector);
+ navTwoPageOnePreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page Two');
+ const navOnePageTwoPreviousButtonSelector = '.nav-one-page-two ion-button.previous.hydrated';
+ const navOnePageTwoPreviousButton = await waitAndGetElement(driver, navOnePageTwoPreviousButtonSelector);
+ navOnePageTwoPreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page One');
+ const navOnePageOneSelector = '.nav-one-page-one';
+ const navOnePageOne = await waitAndGetElement(driver, navOnePageOneSelector);
+
+ });
+
+ register('should go from nav-one-page-one, nav-one-page-two, nav-two-page-one, nav-two-page-two, nav-three-page-one, nav-one-page-two, nav-one-page-one', async (driver, testContext) => {
+
+ testContext.timeout(60000);
+ const page = new E2ETestPage(driver, platform);
+
+ await waitForTransition(300);
+
+ console.log('On Nav One Page One');
+ const navOnePageOneNextButtonSelector = '.nav-one-page-one ion-button.next.hydrated';
+ const navOnePageOneNextButton = await waitAndGetElement(driver, navOnePageOneNextButtonSelector);
+ navOnePageOneNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page Two');
+ const navOnePageTwoNextButtonSelector = '.nav-one-page-two ion-button.next.hydrated';
+ const navOnePageTwoNextButton = await waitAndGetElement(driver, navOnePageTwoNextButtonSelector);
+ navOnePageTwoNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page One');
+ const navTwoPageOneNextButtonSelector = '.nav-two-page-one ion-button.next.nav-two.hydrated';
+ const navTwoPageOneNextButton = await waitAndGetElement(driver, navTwoPageOneNextButtonSelector);
+ navTwoPageOneNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page Two');
+ const navTwoPageTwoNextButtonSelector = '.nav-two-page-two ion-button.next.hydrated';
+ const navTwoPageTwoNextButton = await waitAndGetElement(driver, navTwoPageTwoNextButtonSelector);
+ navTwoPageTwoNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Three Page One');
+ const navThreePageOnePreviousButtonSelector = '.nav-three-page-one ion-button.previous.nav-one.hydrated';
+ const navThreePageOnePreviousButton = await waitAndGetElement(driver, navThreePageOnePreviousButtonSelector);
+ navThreePageOnePreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page Two');
+ const navOnePageTwoPreviousButtonSelector = '.nav-one-page-two ion-button.previous.hydrated';
+ const navOnePageTwoPreviousButton = await waitAndGetElement(driver, navOnePageTwoPreviousButtonSelector);
+ navOnePageTwoPreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page One');
+ const navOnePageOneSelector = '.nav-one-page-one';
+ const navOnePageOne = await waitAndGetElement(driver, navOnePageOneSelector);
+ });
+
+ register('should go from nav-one-page-one, nav-one-page-two, nav-two-page-one, nav-two-page-two, nav-three-page-one, nav-three-page-two, nav-three-page-three, nav-three-page-two, nav-three-page-one, nav-two-page-two, nav-two-page-one, nav-one-page-two, nav-one-page-one', async (driver, testContext) => {
+
+ testContext.timeout(60000);
+ const page = new E2ETestPage(driver, platform);
+
+ await waitForTransition(300);
+
+ console.log('On Nav One Page One');
+ const navOnePageOneNextButtonSelector = '.nav-one-page-one ion-button.next.hydrated';
+ const navOnePageOneNextButton = await waitAndGetElement(driver, navOnePageOneNextButtonSelector);
+ navOnePageOneNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page Two');
+ const navOnePageTwoNextButtonSelector = '.nav-one-page-two ion-button.next.hydrated';
+ const navOnePageTwoNextButton = await waitAndGetElement(driver, navOnePageTwoNextButtonSelector);
+ navOnePageTwoNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page One');
+ const navTwoPageOneNextButtonSelector = '.nav-two-page-one ion-button.next.nav-two.hydrated';
+ const navTwoPageOneNextButton = await waitAndGetElement(driver, navTwoPageOneNextButtonSelector);
+ navTwoPageOneNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page Two');
+ const navTwoPageTwoNextButtonSelector = '.nav-two-page-two ion-button.next.hydrated';
+ const navTwoPageTwoNextButton = await waitAndGetElement(driver, navTwoPageTwoNextButtonSelector);
+ navTwoPageTwoNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Three Page One');
+ const navThreePageOneNextButtonSelector = '.nav-three-page-one ion-button.next.nav-three.hydrated';
+ const navThreePageOneNextButton = await waitAndGetElement(driver, navThreePageOneNextButtonSelector);
+ navThreePageOneNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Three Page Two');
+ const navThreePageTwoNextButtonSelector = '.nav-three-page-two ion-button.next.hydrated';
+ const navThreePageTwoNextButton = await waitAndGetElement(driver, navThreePageTwoNextButtonSelector);
+ navThreePageTwoNextButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Three Page Three');
+ const navThreePageThreePreviousButtonSelector = '.nav-three-page-three ion-button.previous.hydrated';
+ const navThreePageThreePreviousButton = await waitAndGetElement(driver, navThreePageThreePreviousButtonSelector);
+ navThreePageThreePreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Three Page Two');
+ const navThreePageTwoPreviousButtonSelector = '.nav-three-page-two ion-button.previous.hydrated';
+ const navThreePageTwoPreviousButton = await waitAndGetElement(driver, navThreePageTwoPreviousButtonSelector);
+ navThreePageTwoPreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Three Page One');
+ const navThreePageOnePreviousButtonSelector = '.nav-three-page-one ion-button.nav-two.previous.hydrated';
+ const navThreePageOnePreviousButton = await waitAndGetElement(driver, navThreePageOnePreviousButtonSelector);
+ navThreePageOnePreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page Two');
+ const navTwoPageTwoPreviousButtonSelector = '.nav-two-page-two ion-button.previous.hydrated';
+ const navTwoPageTwoPreviousButton = await waitAndGetElement(driver, navTwoPageTwoPreviousButtonSelector);
+ navTwoPageTwoPreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav Two Page One');
+ const navTwoPageOnePreviousButtonSelector = '.nav-two-page-one ion-button.previous.nav-one.hydrated';
+ const navTwoPageOnePreviousButton = await waitAndGetElement(driver, navTwoPageOnePreviousButtonSelector);
+ navTwoPageOnePreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page Two');
+ const navOnePageTwoPreviousButtonSelector = '.nav-one-page-two ion-button.previous.hydrated';
+ const navOnePageTwoPreviousButton = await waitAndGetElement(driver, navOnePageTwoPreviousButtonSelector);
+ navOnePageTwoPreviousButton.click();
+ await waitForTransition(600);
+
+ console.log('On Nav One Page One');
+ const navOnePageTwoSelector = '.nav-one-page-one';
+ const navOnePageTwo = await waitAndGetElement(driver, navOnePageTwoSelector);
+ });
+ });
+});
+
+async function waitAndGetElement(driver, selector) {
+ driver.wait(until.elementLocated(By.css(selector)));
+ const element = driver.findElement(By.css(selector));
+ await driver.wait(until.elementIsVisible(driver.findElement(By.css(selector))));
+ return element;
+}
+
+function waitForTransition(duration) {
+ return new Promise(resolve => {
+ setTimeout(resolve, duration);
+ })
+}
\ No newline at end of file
diff --git a/packages/core/src/components/nav/test/simple-nested-navs/index.html b/packages/core/src/components/nav/test/simple-nested-navs/index.html
new file mode 100644
index 0000000000..1ea95f7097
--- /dev/null
+++ b/packages/core/src/components/nav/test/simple-nested-navs/index.html
@@ -0,0 +1,376 @@
+
+
+
+
+ Nav
+
+
+
+
+
+
+
+
+
+
+
+