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 + + + + + + + + + + + +