@wdio/cli 8.11.4 → 8.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/build/cjs/index.js +2 -2
  2. package/build/commands/config.d.ts.map +1 -1
  3. package/build/commands/config.js +1 -0
  4. package/build/commands/run.js +1 -1
  5. package/build/constants.d.ts +119 -56
  6. package/build/constants.d.ts.map +1 -1
  7. package/build/constants.js +110 -42
  8. package/build/templates/exampleFiles/cucumber/step_definitions/steps.js.ejs +6 -6
  9. package/build/templates/exampleFiles/mochaJasmine/test.e2e.js.ejs +11 -0
  10. package/build/templates/exampleFiles/pageobjects/login.page.js.ejs +9 -9
  11. package/build/templates/exampleFiles/pageobjects/page.js.ejs +2 -2
  12. package/build/templates/exampleFiles/pageobjects/secure.page.js.ejs +5 -5
  13. package/build/templates/snippets/capabilities.ejs +46 -0
  14. package/build/templates/snippets/electronTest.js.ejs +9 -0
  15. package/build/templates/snippets/macosTest.js.ejs +11 -0
  16. package/build/templates/snippets/services.ejs +18 -0
  17. package/build/templates/snippets/testWithPO.js.ejs +20 -0
  18. package/build/templates/snippets/testWithoutPO.js.ejs +16 -0
  19. package/build/templates/snippets/vscodeTest.js.ejs +9 -0
  20. package/build/templates/wdio.conf.tpl.ejs +23 -29
  21. package/build/types.d.ts +7 -2
  22. package/build/types.d.ts.map +1 -1
  23. package/build/utils.d.ts.map +1 -1
  24. package/build/utils.js +18 -11
  25. package/package.json +2 -2
  26. package/build/templates/exampleFiles/jasmine/example.e2e.js.ejs +0 -42
  27. package/build/templates/exampleFiles/mocha/example.e2e.js.ejs +0 -42
  28. /package/build/templates/{afterTest.ejs → snippets/afterTest.ejs} +0 -0
  29. /package/build/templates/{reporters.ejs → snippets/reporters.ejs} +0 -0
@@ -1,16 +1,16 @@
1
- <%- isUsingTypeScript || esmSupport
1
+ <%- answers.isUsingTypeScript || answers.esmSupport
2
2
  ? "import { Given, When, Then } from '@wdio/cucumber-framework';"
3
3
  : "const { Given, When, Then } = require('@wdio/cucumber-framework');" %>
4
4
  <%
5
5
  /**
6
6
  * step definition without page objects
7
7
  */
8
- if (usePageObjects) { %>
9
- <%- isUsingTypeScript || esmSupport
10
- ? `import LoginPage from '${relativePath}/login.page${esmSupport ? '.js' : ''}';`
8
+ if (answers.usePageObjects) { %>
9
+ <%- answers.isUsingTypeScript || answers.esmSupport
10
+ ? `import LoginPage from '${relativePath}/login.page${answers.esmSupport ? '.js' : ''}';`
11
11
  : `const LoginPage = require('${relativePath}/login.page');` %>
12
- <%- isUsingTypeScript || esmSupport
13
- ? `import SecurePage from '${relativePath}/secure.page${esmSupport ? '.js' : ''}';`
12
+ <%- answers.isUsingTypeScript || answers.esmSupport
13
+ ? `import SecurePage from '${relativePath}/secure.page${answers.esmSupport ? '.js' : ''}';`
14
14
  : `const SecurePage = require('${relativePath}/secure.page');` %>
15
15
 
16
16
  const pages = {
@@ -0,0 +1,11 @@
1
+ <% if (answers.purpose === 'vscode') {
2
+ %><%- include('../../snippets/vscodeTest.js.ejs', { answers }) %><%
3
+ } else if (answers.purpose === 'electron') {
4
+ %><%- include('../../snippets/electronTest.js.ejs', { answers }) %><%
5
+ } else if (answers.purpose === 'macos') {
6
+ %><%- include('../../snippets/macosTest.js.ejs', { answers }) %><%
7
+ } else if (answers.usePageObjects) {
8
+ %><%- include('../../snippets/testWithPO.js.ejs', { answers }) %><%
9
+ } else if (!answers.usePageObjects) {
10
+ %><%- include('../../snippets/testWithoutPO.js.ejs', { answers }) %><%
11
+ } %>
@@ -1,7 +1,7 @@
1
- <%- isUsingTypeScript ? "import { ChainablePromiseElement } from 'webdriverio';" : "" %>
1
+ <%- answers.isUsingTypeScript ? "import { ChainablePromiseElement } from 'webdriverio';" : "" %>
2
2
 
3
- <%- isUsingTypeScript || esmSupport
4
- ? `import Page from './page${esmSupport ? '.js' : ''}';`
3
+ <%- answers.isUsingTypeScript || answers.esmSupport
4
+ ? `import Page from './page${answers.esmSupport ? '.js' : ''}';`
5
5
  : "const Page = require('./page');" %>
6
6
 
7
7
  /**
@@ -11,15 +11,15 @@ class LoginPage extends Page {
11
11
  /**
12
12
  * define selectors using getter methods
13
13
  */
14
- <%- isUsingTypeScript ? "public " : "" %>get inputUsername () {
14
+ <%- answers.isUsingTypeScript ? "public " : "" %>get inputUsername () {
15
15
  return $('#username');
16
16
  }
17
17
 
18
- <%- isUsingTypeScript ? "public " : "" %>get inputPassword () {
18
+ <%- answers.isUsingTypeScript ? "public " : "" %>get inputPassword () {
19
19
  return $('#password');
20
20
  }
21
21
 
22
- <%- isUsingTypeScript ? "public " : "" %>get btnSubmit () {
22
+ <%- answers.isUsingTypeScript ? "public " : "" %>get btnSubmit () {
23
23
  return $('button[type="submit"]');
24
24
  }
25
25
 
@@ -27,7 +27,7 @@ class LoginPage extends Page {
27
27
  * a method to encapsule automation code to interact with the page
28
28
  * e.g. to login using username and password
29
29
  */
30
- <%- isUsingTypeScript ? "public " : "" %>async login (username<%- isUsingTypeScript ? ": string": "" %>, password<%- isUsingTypeScript ? ": string": "" %>) {
30
+ <%- answers.isUsingTypeScript ? "public " : "" %>async login (username<%- answers.isUsingTypeScript ? ": string": "" %>, password<%- answers.isUsingTypeScript ? ": string": "" %>) {
31
31
  await this.inputUsername.setValue(username);
32
32
  await this.inputPassword.setValue(password);
33
33
  await this.btnSubmit.click();
@@ -36,9 +36,9 @@ class LoginPage extends Page {
36
36
  /**
37
37
  * overwrite specific options to adapt it to page object
38
38
  */
39
- <%- isUsingTypeScript ? "public " : "" %>open () {
39
+ <%- answers.isUsingTypeScript ? "public " : "" %>open () {
40
40
  return super.open('login');
41
41
  }
42
42
  }
43
43
 
44
- <%- isUsingTypeScript || esmSupport ? "export default": "module.exports =" %> new LoginPage();
44
+ <%- answers.isUsingTypeScript || answers.esmSupport ? "export default": "module.exports =" %> new LoginPage();
@@ -2,12 +2,12 @@
2
2
  * main page object containing all methods, selectors and functionality
3
3
  * that is shared across all page objects
4
4
  */
5
- <%- isUsingTypeScript || esmSupport ? "export default" : "module.exports =" %> class Page {
5
+ <%- answers.isUsingTypeScript || answers.esmSupport ? "export default" : "module.exports =" %> class Page {
6
6
  /**
7
7
  * Opens a sub page of the page
8
8
  * @param path path of the sub page (e.g. /path/to/page.html)
9
9
  */
10
- <%- isUsingTypeScript ? "public " : "" %>open (path<%- isUsingTypeScript ? ": string" : "" %>) {
10
+ <%- answers.isUsingTypeScript ? "public " : "" %>open (path<%- answers.isUsingTypeScript ? ": string" : "" %>) {
11
11
  return browser.url(`https://the-internet.herokuapp.com/${path}`)
12
12
  }
13
13
  }
@@ -1,7 +1,7 @@
1
- <%- isUsingTypeScript ? "import { ChainablePromiseElement } from 'webdriverio';" : "" %>
1
+ <%- answers.isUsingTypeScript ? "import { ChainablePromiseElement } from 'webdriverio';" : "" %>
2
2
 
3
- <%- isUsingTypeScript || esmSupport
4
- ? `import Page from './page${esmSupport ? '.js' : ''}';`
3
+ <%- answers.isUsingTypeScript || answers.esmSupport
4
+ ? `import Page from './page${answers.esmSupport ? '.js' : ''}';`
5
5
  : "const Page = require('./page');" %>
6
6
 
7
7
  /**
@@ -11,9 +11,9 @@ class SecurePage extends Page {
11
11
  /**
12
12
  * define selectors using getter methods
13
13
  */
14
- <%- isUsingTypeScript ? "public " : "" %>get flashAlert () {
14
+ <%- answers.isUsingTypeScript ? "public " : "" %>get flashAlert () {
15
15
  return $('#flash');
16
16
  }
17
17
  }
18
18
 
19
- <%- isUsingTypeScript || esmSupport ? "export default": "module.exports =" %> new SecurePage();
19
+ <%- answers.isUsingTypeScript || answers.esmSupport ? "export default": "module.exports =" %> new SecurePage();
@@ -0,0 +1,46 @@
1
+ capabilities: [{<%
2
+ if (answers.expEnvAccessKey) { %>
3
+ // Experitest Access Key
4
+ // get more information at https://docs.experitest.com/display/TE/Obtaining+Access+Key
5
+ 'experitest:accessKey': '<%- answers.expEnvAccessKey %>',<%
6
+ }
7
+ if (answers.browserEnvironment && answers.browserEnvironment.length) { %>
8
+ <%- answers.browserEnvironment.map((browserName) => `browserName: '${browserName}'`).join('\n }, {\n ') %><%
9
+ } else if (answers.mobileEnvironment === 'android') { %>
10
+ // capabilities for local Appium web tests on an Android Emulator
11
+ platformName: 'Android',
12
+ browserName: 'Chrome',
13
+ 'appium:deviceName': 'Android GoogleAPI Emulator',
14
+ 'appium:platformVersion': '12.0',
15
+ 'appium:automationName': 'UiAutomator2'<%
16
+ } else if (answers.mobileEnvironment === 'ios') { %>
17
+ // capabilities for local Appium web tests on iOS
18
+ platformName: 'iOS',
19
+ browserName: 'Safari',
20
+ 'appium:deviceName': 'iPhone Simulator',
21
+ 'appium:platformVersion': '16.4',
22
+ 'appium:automationName': 'XCUITest'<%
23
+ } else if (answers.purpose === 'macos') { %>
24
+ platformName: 'Mac',
25
+ 'appium:automationName': 'Mac2',
26
+ 'appium:bundleId': '<%= answers.generateTestFiles ? 'com.apple.calculator' : '...' %>'<%
27
+ } else if (answers.purpose === 'vscode') { %>
28
+ browserName: 'vscode',
29
+ browserVersion: 'stable', // also possible: "insiders" or a specific version e.g. "1.80.0"
30
+ 'wdio:vscodeOptions': {
31
+ // points to directory where extension package.json is located
32
+ extensionPath: __dirname,
33
+ // optional VS Code settings
34
+ userSettings: {
35
+ "editor.fontSize": 14
36
+ }
37
+ }<%
38
+ } else if (answers.purpose === 'electron') { %>
39
+ // no need to define any capabilities for local Electron web tests
40
+ // since service plugin takes care of setting everything up<%
41
+ } else {
42
+ %>
43
+ // capabilities for local browser web tests
44
+ browserName: 'chrome' // or "firefox", "microsoftedge", "safari"<%
45
+ } %>
46
+ }],
@@ -0,0 +1,9 @@
1
+ import { browser } from '@wdio/globals'
2
+
3
+ describe('Electron Testing', () => {
4
+ it('should print application metadata', async () => {
5
+ const appName = await browser.electron.app('getName')
6
+ const appVersion = await browser.electron.app('getVersion')
7
+ console.log('Testing Electron app:', appName, appVersion)
8
+ })
9
+ })
@@ -0,0 +1,11 @@
1
+ import { expect, $ } from '@wdio/globals'
2
+
3
+ describe('MacOS Testing', () => {
4
+ it('should calculate the meaning of life', async function () {
5
+ await $('//XCUIElementTypeButton[@label="seven"]').click()
6
+ await $('//XCUIElementTypeButton[@label="multiply"]').click()
7
+ await $('//XCUIElementTypeButton[@label="six"]').click()
8
+ await $('//XCUIElementTypeButton[@title="="]').click()
9
+ await expect($('//XCUIElementTypeStaticText[@label="main display"]')).toHaveText('42')
10
+ })
11
+ })
@@ -0,0 +1,18 @@
1
+ services: [<%- answers.services.map((service) => {
2
+ if (service === 'electron') {
3
+ return /*js*/`[
4
+ 'electron',
5
+ {
6
+ appPath: '${answers.appPath}',
7
+ appName: productName,
8
+ appArgs: ['foo', 'bar=baz'],
9
+ chromedriver: {
10
+ logFileName: 'wdio-chromedriver.log',
11
+ },
12
+ electronVersion: '23.1.0',
13
+ }
14
+ ]`
15
+ }
16
+
17
+ return `'${service}'`
18
+ }) %>],
@@ -0,0 +1,20 @@
1
+ /**
2
+ * test with page objects
3
+ */
4
+ <%- answers.isUsingTypeScript || answers.esmSupport
5
+ ? `import LoginPage from '${answers.relativePath}/login.page${answers.esmSupport ? '.js' : ''}'`
6
+ : `const LoginPage = require('${answers.relativePath}/login.page')` %>
7
+ <%- answers.isUsingTypeScript || answers.esmSupport
8
+ ? `import SecurePage from '${answers.relativePath}/secure.page${answers.esmSupport ? '.js' : ''}'`
9
+ : `const SecurePage = require('${answers.relativePath}/secure.page')` %>
10
+
11
+ describe('My Login application', () => {
12
+ it('should login with valid credentials', async () => {
13
+ await LoginPage.open()
14
+
15
+ await LoginPage.login('tomsmith', 'SuperSecretPassword!')
16
+ await expect(SecurePage.flashAlert).toBeExisting()
17
+ await expect(SecurePage.flashAlert).toHaveTextContaining(
18
+ 'You logged into a secure area!')
19
+ })
20
+ })
@@ -0,0 +1,16 @@
1
+ /**
2
+ * test without page objects
3
+ */
4
+ describe('My Login application', () => {
5
+ it('should login with valid credentials', async () => {
6
+ await browser.url(`https://the-internet.herokuapp.com/login`)
7
+
8
+ await $('#username').setValue('tomsmith')
9
+ await $('#password').setValue('SuperSecretPassword!')
10
+ await $('button[type="submit"]').click()
11
+
12
+ await expect($('#flash')).toBeExisting()
13
+ await expect($('#flash')).toHaveTextContaining(
14
+ 'You logged into a secure area!')
15
+ })
16
+ })
@@ -0,0 +1,9 @@
1
+ import { browser } from '@wdio/globals'
2
+
3
+ describe('VS Code Extension Testing', () => {
4
+ it('should be able to load VSCode', async () => {
5
+ const workbench = await browser.getWorkbench()
6
+ expect(await workbench.getTitleBar().getTitle())
7
+ .toContain('[Extension Development Host]')
8
+ })
9
+ })
@@ -1,7 +1,20 @@
1
- <% if (answers.isUsingTypeScript) {
1
+ <%
2
+ if (answers.purpose === 'electron') {
3
+ %>import fs from 'node:fs'
4
+ <% }
5
+
6
+ if (answers.isUsingTypeScript) {
2
7
  %>import type { Options } from '@wdio/types'
8
+ <% }
9
+
10
+ if (answers.purpose === 'electron') { %>
11
+ const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf-8'))
12
+ const productName = packageJson.build.productName
13
+
14
+ <% }
3
15
 
4
- export const config: Options.Testrunner = {<%
16
+ if (answers.isUsingTypeScript) {
17
+ %>export const config: Options.Testrunner = {<%
5
18
  } else if (answers.esmSupport) {
6
19
  %>export const config = {<%
7
20
  } else {
@@ -35,16 +48,15 @@ export const config: Options.Testrunner = {<%
35
48
  transpileOnly: true
36
49
  }
37
50
  },
38
- <% } %>
39
- <% if(answers.expEnvAccessKey){ %>
51
+ <% }
52
+ if(answers.expEnvAccessKey){ %>
40
53
  hostname: '<%- answers.expEnvHostname %>',
41
54
  <% if (answers.expEnvPort === '443'){%>protocol: 'https',
42
55
  <%} else if (answers.expEnvPort === '80'){%>protocol: 'http',
43
56
  <%} else { %>protocol: '<%- answers.expEnvProtocol %>',<%}%>
44
57
  port: <%- answers.expEnvPort %>,
45
58
  path: '/wd/hub',
46
- <% } else if(answers.hostname && answers.port) { %>
47
- //
59
+ <% } else if(answers.hostname && answers.port) { %>//
48
60
  // =====================
49
61
  // Server Configurations
50
62
  // =====================
@@ -126,25 +138,7 @@ export const config: Options.Testrunner = {<%
126
138
  // Sauce Labs platform configurator - a great tool to configure your capabilities:
127
139
  // https://saucelabs.com/platform/platform-configurator
128
140
  //
129
- capabilities: [{<%
130
- if (answers.expEnvAccessKey) { %>
131
- // Experitest Access Key
132
- // get more information at https://docs.experitest.com/display/TE/Obtaining+Access+Key
133
- 'experitest:accessKey': '<%- answers.expEnvAccessKey %>',<%
134
- }
135
- if (answers.setupMobileEnvironment) { %>
136
- // capabilities for local Appium web tests on an Android Emulator
137
- platformName: 'Android', // or "iOS"
138
- browserName: 'Chrome', // or "Safari"
139
- 'appium:deviceName': 'Android GoogleAPI Emulator', // or "iPhone Simulator"
140
- 'appium:platformVersion': '12.0', // or "16.2" (for running iOS v16)
141
- 'appium:automationName': 'UiAutomator2' // or "XCUITest"<%
142
- } else {
143
- %>
144
- // capabilities for local browser web tests
145
- browserName: 'chrome' // or "firefox", "microsoftedge", "safari"<%
146
- } %>
147
- }],
141
+ <%- include('snippets/capabilities', { answers }) %>
148
142
  //
149
143
  // ===================
150
144
  // Test Configurations
@@ -193,8 +187,8 @@ export const config: Options.Testrunner = {<%
193
187
  // your test setup with almost no effort. Unlike plugins, they don't add new
194
188
  // commands. Instead, they hook themselves up into the test process.
195
189
  <% if(answers.services.length) {
196
- %>services: [<%- answers.services.map(service => `'${service}'`) %>],
197
- <% } else {
190
+ %><%- include('snippets/services', { answers }) %><%
191
+ } else {
198
192
  %>// services: [],
199
193
  //<% } %>
200
194
  // Framework you want to run your specs with.
@@ -214,7 +208,7 @@ export const config: Options.Testrunner = {<%
214
208
  // Whether or not retried spec files should be retried immediately or deferred to the end of the queue
215
209
  // specFileRetriesDeferred: false,
216
210
  //
217
- <%- include('reporters', { reporters: answers.reporters }) %>
211
+ <%- include('snippets/reporters', { reporters: answers.reporters }) %>
218
212
  <% if(answers.framework === 'mocha') { %>
219
213
  //
220
214
  // Options to be passed to Mocha.
@@ -351,7 +345,7 @@ export const config: Options.Testrunner = {<%
351
345
  */
352
346
  // afterHook: function (test, context, { error, result, duration, passed, retries }) {
353
347
  // },
354
- <%- include('afterTest', { reporters: answers.reporters }) %>
348
+ <%- include('snippets/afterTest', { reporters: answers.reporters }) %>
355
349
  /**
356
350
  * Hook that gets executed after the suite has ended
357
351
  * @param {object} suite suite details
package/build/types.d.ts CHANGED
@@ -5,7 +5,8 @@ export interface Questionnair {
5
5
  runner: string;
6
6
  preset?: string;
7
7
  installTestingLibrary?: boolean;
8
- backend: typeof BACKEND_CHOICES[number];
8
+ appPath?: string;
9
+ backend?: typeof BACKEND_CHOICES[number];
9
10
  hostname?: string;
10
11
  port?: string;
11
12
  path?: string;
@@ -32,12 +33,15 @@ export interface Questionnair {
32
33
  createPackageJSON?: boolean;
33
34
  projectRootCorrect?: boolean;
34
35
  projectRoot?: string;
35
- setupMobileEnvironment?: boolean;
36
+ e2eEnvironment?: 'web' | 'mobile';
37
+ mobileEnvironment?: 'android' | 'ios';
38
+ browserEnvironment?: ('chrome' | 'firefox' | 'safari' | 'microsoftedge')[];
36
39
  }
37
40
  export interface ParsedAnswers extends Omit<Questionnair, 'runner' | 'framework' | 'reporters' | 'services' | 'plugins'> {
38
41
  rawAnswers: Questionnair;
39
42
  runner: 'local' | 'browser';
40
43
  framework: string;
44
+ purpose: string;
41
45
  reporters: string[];
42
46
  plugins: string[];
43
47
  services: string[];
@@ -105,6 +109,7 @@ export interface ConfigCommandArguments {
105
109
  export interface SupportedPackage {
106
110
  package: string;
107
111
  short: string;
112
+ purpose: string;
108
113
  }
109
114
  export interface OnCompleteResult {
110
115
  finished: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/build/utils.js CHANGED
@@ -198,11 +198,8 @@ export function addServiceDeps(names, packages, update = false) {
198
198
  * @todo add JSComments
199
199
  */
200
200
  export function convertPackageHashToObject(pkg, hash = '$--$') {
201
- const splitHash = pkg.split(hash);
202
- return {
203
- package: splitHash[0],
204
- short: splitHash[1]
205
- };
201
+ const [p, short, purpose] = pkg.split(hash);
202
+ return { package: p, short, purpose };
206
203
  }
207
204
  export const validateServiceAnswers = (answers) => {
208
205
  let result = true;
@@ -363,15 +360,13 @@ export async function generateBrowserRunnerTestFiles(answers) {
363
360
  async function generateLocalRunnerTestFiles(answers) {
364
361
  const testFiles = answers.framework === 'cucumber'
365
362
  ? [path.join(TEMPLATE_ROOT_DIR, 'cucumber')]
366
- : (answers.framework === 'mocha'
367
- ? [path.join(TEMPLATE_ROOT_DIR, 'mocha')]
368
- : [path.join(TEMPLATE_ROOT_DIR, 'jasmine')]);
363
+ : [path.join(TEMPLATE_ROOT_DIR, 'mochaJasmine')];
369
364
  if (answers.usePageObjects) {
370
365
  testFiles.push(path.join(TEMPLATE_ROOT_DIR, 'pageobjects'));
371
366
  }
372
367
  const files = (await Promise.all(testFiles.map((dirPath) => readDir(dirPath, [(file, stats) => !stats.isDirectory() && !(file.endsWith('.ejs') || file.endsWith('.feature'))])))).reduce((cur, acc) => [...acc, ...(cur)], []);
373
368
  for (const file of files) {
374
- const renderedTpl = await renderFile(file, answers);
369
+ const renderedTpl = await renderFile(file, { answers });
375
370
  const isJSX = answers.preset && ['preact', 'react'].includes(answers.preset);
376
371
  const fileEnding = (answers.isUsingTypeScript ? '.ts' : '.js') + (isJSX ? 'x' : '');
377
372
  const destPath = (file.endsWith('page.js.ejs')
@@ -385,7 +380,7 @@ async function generateLocalRunnerTestFiles(answers) {
385
380
  }
386
381
  export async function getAnswers(yes) {
387
382
  if (yes) {
388
- const ignoredQuestions = ['setupMobileEnvironment'];
383
+ const ignoredQuestions = ['e2eEnvironment'];
389
384
  const filterdQuestionaire = QUESTIONNAIRE.filter((question) => !ignoredQuestions.includes(question.name));
390
385
  const answers = filterdQuestionaire.reduce((answers, question) => Object.assign(answers, question.when && !question.when(answers)
391
386
  /**
@@ -609,6 +604,18 @@ export function npmInstall(parsedAnswers, useYarn, npmTag) {
609
604
  if (parsedAnswers.framework === 'jasmine' && parsedAnswers.isUsingTypeScript) {
610
605
  parsedAnswers.packagesToInstall.push('@types/jasmine');
611
606
  }
607
+ /**
608
+ * add Appium mobile drivers if desired
609
+ */
610
+ if (parsedAnswers.purpose === 'macos') {
611
+ parsedAnswers.packagesToInstall.push('appium-mac2-driver');
612
+ }
613
+ if (parsedAnswers.mobileEnvironment === 'android') {
614
+ parsedAnswers.packagesToInstall.push('appium-uiautomator2-driver');
615
+ }
616
+ if (parsedAnswers.mobileEnvironment === 'ios') {
617
+ parsedAnswers.packagesToInstall.push('appium-xcuitest-driver');
618
+ }
612
619
  /**
613
620
  * add packages that are required by services
614
621
  */
@@ -746,7 +753,7 @@ export async function createWDIOScript(parsedAnswers) {
746
753
  }
747
754
  }
748
755
  export async function runAppiumInstaller(parsedAnswers) {
749
- if (!parsedAnswers.setupMobileEnvironment) {
756
+ if (parsedAnswers.e2eEnvironment !== 'mobile') {
750
757
  return;
751
758
  }
752
759
  const answer = await inquirer.prompt({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wdio/cli",
3
- "version": "8.11.4",
3
+ "version": "8.12.0",
4
4
  "description": "WebdriverIO testrunner command line interface",
5
5
  "author": "Christian Bromann <mail@bromann.dev>",
6
6
  "homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/wdio-cli",
@@ -82,5 +82,5 @@
82
82
  "publishConfig": {
83
83
  "access": "public"
84
84
  },
85
- "gitHead": "a2eb799e8dafa777a379eca54944cc12e09bcf06"
85
+ "gitHead": "23b4ff40c94c0d83cd807815cd60bb40ad9b2c9f"
86
86
  }
@@ -1,42 +0,0 @@
1
- <%
2
- /**
3
- * step definition without page objects
4
- */
5
- if (usePageObjects) {
6
- %><%- isUsingTypeScript || esmSupport
7
- ? `import LoginPage from '${relativePath}/login.page${esmSupport ? '.js' : ''}';`
8
- : `const LoginPage = require('${relativePath}/login.page');` %>
9
- <%- isUsingTypeScript || esmSupport
10
- ? `import SecurePage from '${relativePath}/secure.page${esmSupport ? '.js' : ''}';`
11
- : `const SecurePage = require('${relativePath}/secure.page');` %>
12
-
13
- describe('My Login application', () => {
14
- it('should login with valid credentials', async () => {
15
- await LoginPage.open();
16
-
17
- await LoginPage.login('tomsmith', 'SuperSecretPassword!');
18
- await expect(SecurePage.flashAlert).toBeExisting();
19
- await expect(SecurePage.flashAlert).toHaveTextContaining(
20
- 'You logged into a secure area!');
21
- });
22
- });
23
-
24
- <% } else {
25
-
26
- /**
27
- * step definition with page objects
28
- */
29
- %>describe('My Login application', () => {
30
- it('should login with valid credentials', async () => {
31
- await browser.url(`https://the-internet.herokuapp.com/login`);
32
-
33
- await $('#username').setValue('tomsmith');
34
- await $('#password').setValue('SuperSecretPassword!');
35
- await $('button[type="submit"]').click();
36
-
37
- await expect($('#flash')).toBeExisting();
38
- await expect($('#flash')).toHaveTextContaining(
39
- 'You logged into a secure area!');
40
- });
41
- });
42
- <% } %>
@@ -1,42 +0,0 @@
1
- <%
2
- /**
3
- * test with page objects
4
- */
5
- if (usePageObjects) {
6
- %><%- isUsingTypeScript || esmSupport
7
- ? `import LoginPage from '${relativePath}/login.page${esmSupport ? '.js' : ''}'`
8
- : `const LoginPage = require('${relativePath}/login.page')` %>
9
- <%- isUsingTypeScript || esmSupport
10
- ? `import SecurePage from '${relativePath}/secure.page${esmSupport ? '.js' : ''}'`
11
- : `const SecurePage = require('${relativePath}/secure.page')` %>
12
-
13
- describe('My Login application', () => {
14
- it('should login with valid credentials', async () => {
15
- await LoginPage.open()
16
-
17
- await LoginPage.login('tomsmith', 'SuperSecretPassword!')
18
- await expect(SecurePage.flashAlert).toBeExisting()
19
- await expect(SecurePage.flashAlert).toHaveTextContaining(
20
- 'You logged into a secure area!')
21
- })
22
- })
23
-
24
- <% } else {
25
-
26
- /**
27
- * test without page objects
28
- */
29
- %>describe('My Login application', () => {
30
- it('should login with valid credentials', async () => {
31
- await browser.url(`https://the-internet.herokuapp.com/login`)
32
-
33
- await $('#username').setValue('tomsmith')
34
- await $('#password').setValue('SuperSecretPassword!')
35
- await $('button[type="submit"]').click()
36
-
37
- await expect($('#flash')).toBeExisting()
38
- await expect($('#flash')).toHaveTextContaining(
39
- 'You logged into a secure area!')
40
- })
41
- })
42
- <% } %>