Skip to content

Commit

Permalink
fix: run ios simulator tests on default port (#51)
Browse files Browse the repository at this point in the history
* fix: run ios simulator tests on default port

* fix linting
  • Loading branch information
saikrishna321 authored Jul 11, 2024
1 parent 350e52c commit 526b65b
Show file tree
Hide file tree
Showing 9 changed files with 181 additions and 168 deletions.
8 changes: 8 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
.github/
README.md
docs/commands.md
finder.ts
flutter-by/wdio-flutter-by-service/package.json
flutter-by/wdio-flutter-by-service/package-lock.json
*.conf.ts
CHANGELOG.md
10 changes: 5 additions & 5 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"singleQuote": true,
"tabWidth": 3,
"semi": true,
"trailingComma": "all",
"useTabs": false
"singleQuote": true,
"tabWidth": 3,
"semi": true,
"trailingComma": "all",
"useTabs": false
}
26 changes: 13 additions & 13 deletions android.conf.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ import { join } from 'node:path';
import { config as baseConfig } from './wdio.conf.ts';

export const config: WebdriverIO.Config = {
...baseConfig,
capabilities: [
{
// capabilities for local Appium web tests on an Android Emulator
platformName: 'Android',
'appium:automationName': 'FlutterIntegration',
'appium:orientation': 'PORTRAIT',
'appium:app':
process.env.APP_PATH || join(process.cwd(), 'app-debug.apk'),
'appium:newCommandTimeout': 240,
'appium:flutterServerLaunchTimeout': 10000,
},
],
...baseConfig,
capabilities: [
{
// capabilities for local Appium web tests on an Android Emulator
platformName: 'Android',
'appium:automationName': 'FlutterIntegration',
'appium:orientation': 'PORTRAIT',
'appium:app':
process.env.APP_PATH || join(process.cwd(), 'app-debug.apk'),
'appium:newCommandTimeout': 240,
'appium:flutterServerLaunchTimeout': 10000,
},
],
};
226 changes: 113 additions & 113 deletions finder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,122 +3,122 @@ import { command } from 'webdriver';
import path from 'path';

export async function registerCommands() {
const utils = await import(
path.join(
require.resolve('webdriverio').replace('cjs/index.js', ''),
'utils',
'getElementObject.js',
)
);
const utils = await import(
path.join(
require.resolve('webdriverio').replace('cjs/index.js', ''),
'utils',
'getElementObject.js',
)
);

function handler(multi: boolean = false) {
return async function (value: string) {
let findElement;
function handler(multi: boolean = false) {
return async function (value: string) {
let findElement;

let args = ['key', value];
let suffix = multi ? 'elements' : 'element';
if (this['elementId']) {
args = [this['elementId'], 'key', value];
findElement = command(
'POST',
`/session/:sessionId/element/:elementId/${suffix}`,
{
command: 'flutterFinderByKey',
description: 'a new WebDriver command',
ref: 'https://vendor.com/commands/#myNewCommand',
variables: [
{
name: 'elementId',
type: 'string',
description: 'a valid parameter',
required: true,
},
],
parameters: [
{
name: 'using',
type: 'string',
description: 'a valid parameter',
required: true,
},
{
name: 'value',
type: 'string',
description: 'a valid parameter',
required: true,
},
],
returns: {
type: 'object',
name: 'element',
description:
"A JSON representation of an element object, e.g. `{ 'element-6066-11e4-a52e-4f735466cecf': 'ELEMENT_1' }`.",
},
},
);
} else {
findElement = command('POST', `/session/:sessionId/${suffix}`, {
command: 'flutterFinderByKey',
description: 'a new WebDriver command',
ref: 'https://vendor.com/commands/#myNewCommand',
variables: [],
parameters: [
{
name: 'using',
type: 'string',
description: 'a valid parameter',
required: true,
},
{
name: 'value',
type: 'string',
description: 'a valid parameter',
required: true,
},
{
name: 'context',
type: 'string',
description: 'a valid parameter',
required: false,
},
],
returns: {
type: 'object',
name: 'element',
description:
"A JSON representation of an element object, e.g. `{ 'element-6066-11e4-a52e-4f735466cecf': 'ELEMENT_1' }`.",
},
});
}
let args = ['key', value];
let suffix = multi ? 'elements' : 'element';
if (this['elementId']) {
args = [this['elementId'], 'key', value];
findElement = command(
'POST',
`/session/:sessionId/element/:elementId/${suffix}`,
{
command: 'flutterFinderByKey',
description: 'a new WebDriver command',
ref: 'https://vendor.com/commands/#myNewCommand',
variables: [
{
name: 'elementId',
type: 'string',
description: 'a valid parameter',
required: true,
},
],
parameters: [
{
name: 'using',
type: 'string',
description: 'a valid parameter',
required: true,
},
{
name: 'value',
type: 'string',
description: 'a valid parameter',
required: true,
},
],
returns: {
type: 'object',
name: 'element',
description:
"A JSON representation of an element object, e.g. `{ 'element-6066-11e4-a52e-4f735466cecf': 'ELEMENT_1' }`.",
},
},
);
} else {
findElement = command('POST', `/session/:sessionId/${suffix}`, {
command: 'flutterFinderByKey',
description: 'a new WebDriver command',
ref: 'https://vendor.com/commands/#myNewCommand',
variables: [],
parameters: [
{
name: 'using',
type: 'string',
description: 'a valid parameter',
required: true,
},
{
name: 'value',
type: 'string',
description: 'a valid parameter',
required: true,
},
{
name: 'context',
type: 'string',
description: 'a valid parameter',
required: false,
},
],
returns: {
type: 'object',
name: 'element',
description:
"A JSON representation of an element object, e.g. `{ 'element-6066-11e4-a52e-4f735466cecf': 'ELEMENT_1' }`.",
},
});
}

const response = await findElement.call(browser, ...args);
console.log(utils.getElement);
try {
if (multi) {
return response.map((element: any) =>
utils.getElement.call(this, null, element),
);
} else {
return utils.getElement.call(this, null, response);
}
} catch (e) {
console.log(e);
}
};
}
browser.addCommand('flutterFinderByKey$', handler());
browser.addCommand('flutterFinderByKey$', handler(), true);
const response = await findElement.call(browser, ...args);
console.log(utils.getElement);
try {
if (multi) {
return response.map((element: any) =>
utils.getElement.call(this, null, element),
);
} else {
return utils.getElement.call(this, null, response);
}
} catch (e) {
console.log(e);
}
};
}
browser.addCommand('flutterFinderByKey$', handler());
browser.addCommand('flutterFinderByKey$', handler(), true);

browser.addCommand('flutterFinderByKey$$', handler(true));
browser.addCommand('flutterFinderByKey$$', handler(true), true);
browser.addCommand('flutterFinderByKey$$', handler(true));
browser.addCommand('flutterFinderByKey$$', handler(true), true);

/**
*
* 1. Element visible
* 2. Element not visible
* 3. element enable/disabled
* 4. Element count
* 6.
*
*/
/**
*
* 1. Element visible
* 2. Element not visible
* 3. element enable/disabled
* 4. Element count
* 6.
*
*/
}
1 change: 0 additions & 1 deletion ios.conf.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ export const config: WebdriverIO.Config = {
'appium:newCommandTimeout': 240,
'appium:usePreinstalledWDA': true,
'appium:showIOSLog': true,
'appium:flutterSystemPort': 31321,
'appium:wdaLocalPort': 8456,
'appium:flutterServerLaunchTimeout': 25000,
},
Expand Down
10 changes: 4 additions & 6 deletions src/driver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,8 @@ export class AppiumFlutterDriver extends BaseDriver<FlutterDriverConstraints> {
}

const systemPort =
this.internalCaps.flutterSystemPort ?? (await getFreePort());
this.internalCaps.flutterSystemPort ||
(isIosSimulator ? null : await getFreePort());
const udid = this.proxydriver.opts.udid!;

this.flutterPort = await fetchFlutterServerPort.bind(this)({
Expand Down Expand Up @@ -352,13 +353,10 @@ export class AppiumFlutterDriver extends BaseDriver<FlutterDriverConstraints> {
);

// Add port parameter to launch argument and only supported for iOS
if (
this.proxydriver instanceof XCUITestDriver &&
this.internalCaps?.flutterSystemPort
) {
if (this.proxydriver instanceof XCUITestDriver) {
launchArgs.arguments = _.flatten([
launchArgs.arguments,
`--flutter-server-port=${this.internalCaps.flutterSystemPort}`,
`--flutter-server-port=${this.internalCaps?.flutterSystemPort || this.flutterPort}`,
]);
this.log.info(
'Attaching launch arguments to XCUITestDriver ' +
Expand Down
13 changes: 8 additions & 5 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,16 +124,19 @@ export async function fetchFlutterServerPort(
let devicePort = startPort;
let forwardedPort = systemPort;

if (isIosSimulator && systemPort) {
if (isIosSimulator && (systemPort || devicePort)) {
try {
this.log.info(
`Checking if flutter server is running on port ${systemPort} for simulator with id ${udid}`,
`Checking if flutter server is running on port ${systemPort || devicePort} for simulator with id ${udid}`,
);
await waitForFlutterServer.bind(this)(
(systemPort || devicePort)!,
packageName,
);
await waitForFlutterServer.bind(this)(systemPort!, packageName);
this.log.info(
`Flutter server is successfully running on port ${systemPort}`,
`Flutter server is successfully running on port ${systemPort || devicePort}`,
);
return systemPort!;
return (systemPort || devicePort)!;
} catch (e) {
return null;
}
Expand Down
9 changes: 7 additions & 2 deletions test/specs/test.e2e.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ async function performLogin(userName = 'admin', password = '1234') {

await browser.flutterByValueKey$('password_text_field').clearValue();
await browser.flutterByValueKey$('password').addValue(password);
expect(await browser.flutterByType$('ElevatedButton').flutterByType$("Text").getText()).toEqual('Login');
expect(
await browser
.flutterByType$('ElevatedButton')
.flutterByType$('Text')
.getText(),
).toEqual('Login');
await browser.flutterByType$('ElevatedButton').click();
}

Expand All @@ -30,7 +35,7 @@ describe('My Login application', () => {
}
await browser.installApp(process.env.APP_PATH);
await browser.pause(2000);
if (await browser.isAppInstalled(appID)){
if (await browser.isAppInstalled(appID)) {
console.log('App is installed');
await browser.execute('flutter: launchApp', {
appId: appID,
Expand Down
Loading

0 comments on commit 526b65b

Please sign in to comment.