Skip to content

Commit 8744490

Browse files
author
Zdravko
authored
Merge pull request #261 from NativeScript/svetoslavtsenov/gestures
feat: implement pinch, pan, rotate and scroll
2 parents 0bbb353 + 6f6edce commit 8744490

16 files changed

+366
-162
lines changed

lib/appium-driver.ts

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ import {
3030
encodeImageToBase64,
3131
ensureReportsDirExists,
3232
checkImageLogType,
33-
adbShellCommand
33+
adbShellCommand,
34+
logWarn
3435
} from "./utils";
3536

3637
import { INsCapabilities } from "./interfaces/ns-capabilities";
@@ -167,6 +168,11 @@ export class AppiumDriver {
167168
}
168169

169170
public async navBack() {
171+
if (this.isAndroid) {
172+
logInfo("=== Navigate back with hardware button!");
173+
} else {
174+
logInfo("=== Navigate back.");
175+
}
170176
return await this._driver.back();
171177
}
172178

@@ -244,7 +250,7 @@ export class AppiumDriver {
244250
prepareApp(args);
245251
if (!args.device) {
246252
if (args.isAndroid) {
247-
args.device = DeviceManager.getDefaultDevice(args, sessionInfo.capabilities.desired.deviceName, sessionInfo.capabilities.deviceUDID.replace("emulator-", ""), sessionInfo.capabilities.deviceUDID.includes("emulator") ? DeviceType.EMULATOR : DeviceType.SIMULATOR, sessionInfo.capabilities.desired.platformVersion || sessionInfo.capabilities.platformVersion);
253+
args.device = DeviceManager.getDefaultDevice(args, sessionInfo.capabilities.desired.deviceName, sessionInfo.capabilities.deviceUDID.replace("emulator-", ""), sessionInfo.capabilities.deviceUDID.includes("emulator") ? DeviceType.EMULATOR : DeviceType.SIMULATOR, sessionInfo.capabilities.deviceApiLevel || sessionInfo.capabilities.platformVersion);
248254
} else {
249255
args.device = DeviceManager.getDefaultDevice(args);
250256
}
@@ -257,6 +263,8 @@ export class AppiumDriver {
257263
}
258264
} catch (error) {
259265
args.verbose = true;
266+
console.log("===============================");
267+
console.log("", error)
260268
if (!args.ignoreDeviceController && error && error.message && error.message.includes("Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE]")) {
261269
await DeviceManager.kill(args.device);
262270
await DeviceController.startDevice(args.device);
@@ -280,11 +288,11 @@ export class AppiumDriver {
280288
console.log("Retry launching appium driver!");
281289
hasStarted = false;
282290

283-
if (error && error.message && error.message.includes("WebDriverAgent")) {
284-
const freePort = await findFreePort(100, args.wdaLocalPort);
285-
console.log("args.appiumCaps['wdaLocalPort']", freePort);
286-
args.appiumCaps["wdaLocalPort"] = freePort;
287-
}
291+
// if (error && error.message && error.message.includes("WebDriverAgent")) {
292+
// const freePort = await findFreePort(100, args.wdaLocalPort);
293+
// console.log("args.appiumCaps['wdaLocalPort']", freePort);
294+
// args.appiumCaps["wdaLocalPort"] = freePort;
295+
// }
288296
}
289297

290298
if (hasStarted) {
@@ -491,7 +499,7 @@ export class AppiumDriver {
491499
* @param xOffset
492500
*/
493501
public async scroll(direction: Direction, y: number, x: number, yOffset: number, xOffset: number = 0) {
494-
await scroll(this._wd, this._driver, direction, this._webio.isIOS, y, x, yOffset, xOffset, this._args.verbose);
502+
await scroll(this._wd, this._driver, direction, this._webio.isIOS, y, x, yOffset, xOffset);
495503
}
496504

497505
/**
@@ -509,13 +517,15 @@ export class AppiumDriver {
509517
while ((el === null || !isDisplayed) && retryCount > 0) {
510518
try {
511519
el = await element();
512-
isDisplayed = await el.isDisplayed();
520+
isDisplayed = el && await el.isDisplayed();
513521
if (!isDisplayed) {
514-
await scroll(this._wd, this._driver, direction, this._webio.isIOS, startPoint.y, startPoint.x, offsetPoint.x, offsetPoint.y, this._args.verbose);
522+
await scroll(this._wd, this._driver, direction, this._webio.isIOS, startPoint.y, startPoint.x, offsetPoint.y, offsetPoint.x);
515523
el = null;
516524
}
517525
} catch (error) {
518526
console.log("scrollTo Error: " + error);
527+
await scroll(this._wd, this._driver, direction, this._webio.isIOS, startPoint.y, startPoint.x, offsetPoint.y, offsetPoint.x);
528+
el = null;
519529
}
520530

521531
retryCount--;
@@ -864,7 +874,7 @@ export class AppiumDriver {
864874
}
865875
}
866876

867-
private static async applyAdditionalSettings(args) {
877+
private static async applyAdditionalSettings(args: INsCapabilities) {
868878
if (args.isSauceLab) return;
869879

870880
args.appiumCaps['udid'] = args.appiumCaps['udid'] || args.device.token;
@@ -881,6 +891,11 @@ export class AppiumDriver {
881891
args.appiumCaps["wdaStartupRetries"] = 5;
882892
args.appiumCaps["shouldUseSingletonTestManager"] = args.appiumCaps.shouldUseSingletonTestManager;
883893

894+
if (args.derivedDataPath) {
895+
args.appiumCaps["derivedDataPath"] = `${args.derivedDataPath}/${args.device.token}`;
896+
logWarn('Changed derivedDataPath to: ', args.appiumCaps["derivedDataPath"]);
897+
}
898+
884899
// It looks we need it for XCTest (iOS 10+ automation)
885900
if (args.appiumCaps.platformVersion >= 10 && args.wdaLocalPort) {
886901
console.log(`args.appiumCaps['wdaLocalPort']: ${args.wdaLocalPort}`);

lib/appium-server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ export class AppiumServer {
126126

127127
private startAppiumServer(logLevel: string, isSauceLab: boolean) {
128128
const startingServerArgs: Array<string> = isSauceLab ? ["--log-level", logLevel] : ["-p", this.port.toString(), "--log-level", logLevel];
129-
if (this._args.isAndroid && this._args.ignoreDeviceController && !this._args.isSauceLab) {
129+
if (this._args.isAndroid) {
130130
this._args.relaxedSecurity ? startingServerArgs.push("--relaxed-security") : console.log("'relaxedSecurity' is not enabled!\nTo enabled it use '--relaxedSecurity'!");
131131
}
132132

lib/device-manager.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ export class DeviceManager implements IDeviceManager {
171171
type: type,
172172
platform: args.appiumCaps.platformName.toLowerCase(),
173173
token: token,
174-
apiLevel: platformVersion || args.appiumCaps.platformVersion,
174+
apiLevel: platformVersion || args.appiumCaps.deviceApiLevel || args.appiumCaps.platformVersion,
175175
config: { "density": args.appiumCaps.density, "offsetPixels": args.appiumCaps.offsetPixels }
176176
}
177177

@@ -197,7 +197,7 @@ export class DeviceManager implements IDeviceManager {
197197
const sizeArr = sessionInfoDetails.deviceScreenSize.split("x");
198198
args.device.deviceScreenSize = { width: sizeArr[0], height: sizeArr[1] };
199199

200-
args.device.apiLevel = sessionInfoDetails.deviceApiLevel;
200+
args.device.apiLevel = sessionInfoDetails.deviceApiLevel || args.device.apiLevel;
201201
args.device.deviceScreenDensity = sessionInfoDetails.deviceScreenDensity / 100;
202202
args.device.config = { "density": args.device.deviceScreenDensity || args.device.config.density, "offsetPixels": +sessionInfoDetails.statBarHeight || args.device.config.offsetPixels };
203203
} else {
@@ -209,6 +209,7 @@ export class DeviceManager implements IDeviceManager {
209209

210210
args.device.statBarHeight = sessionInfoDetails.statBarHeight;
211211
args.device.viewportRect = DeviceManager.convertViewportRectToIRectangle(sessionInfoDetails.viewportRect);
212+
args.device.token = args.device.token || sessionInfoDetails.udid;
212213

213214
return args.device;
214215
}
@@ -217,14 +218,14 @@ export class DeviceManager implements IDeviceManager {
217218
const status = value ? 1 : 0;
218219
try {
219220
if (args.isAndroid) {
220-
if (!args.ignoreDeviceController) {
221-
AndroidController.setDontKeepActivities(value, args.device);
222-
} else if (args.relaxedSecurity) {
221+
if (args.relaxedSecurity) {
223222
const output = await DeviceManager.executeShellCommand(driver, { command: "settings", args: ['put', 'global', 'always_finish_activities', status] });
224223
console.log(`Output from setting always_finish_activities to ${status}: ${output}`);
225224
//check if set
226225
const check = await DeviceManager.executeShellCommand(driver, { command: "settings", args: ['get', 'global', 'always_finish_activities'] });
227226
console.info(`Check if always_finish_activities is set correctly: ${check}`);
227+
} else if (!args.ignoreDeviceController) {
228+
AndroidController.setDontKeepActivities(value, args.device);
228229
}
229230
} else {
230231
// Do nothing for iOS ...

lib/direction.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export declare const enum Direction {
1+
export declare enum Direction {
22
down = 0,
33
up = 1,
44
left = 2,

lib/direction.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export const enum Direction {
1+
export enum Direction {
22
down,
33
up,
44
left,

lib/interfaces/ns-capabilities-args.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { AutomationName } from "../automation-name";
44
import { ITestReporter } from "./test-reporter";
55
import { LogImageType } from "../enums/log-image-type";
66
export interface INsCapabilitiesArgs {
7+
derivedDataPath?: string;
78
port?: number;
89
wdaLocalPort?: number;
910
projectDir?: string;

lib/interfaces/ns-capabilities-args.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ITestReporter } from "./test-reporter";
55
import { LogImageType } from "../enums/log-image-type";
66

77
export interface INsCapabilitiesArgs {
8+
derivedDataPath?: string;
89
port?: number;
910
wdaLocalPort?: number;
1011
projectDir?: string;

lib/ns-capabilities.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export declare class NsCapabilities implements INsCapabilities {
4747
deviceTypeOrPlatform: string;
4848
driverConfig: any;
4949
logImageTypes: Array<LogImageType>;
50+
derivedDataPath: string;
5051
constructor(_parser: INsCapabilitiesArgs);
5152
readonly isAndroid: any;
5253
readonly isIOS: boolean;

lib/ns-capabilities.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ export class NsCapabilities implements INsCapabilities {
5353
public deviceTypeOrPlatform: string;
5454
public driverConfig: any;
5555
public logImageTypes: Array<LogImageType>;
56+
public derivedDataPath: string;
5657

5758
constructor(private _parser: INsCapabilitiesArgs) {
5859
this.projectDir = this._parser.projectDir;
@@ -76,6 +77,7 @@ export class NsCapabilities implements INsCapabilities {
7677
this.isSauceLab = this._parser.isSauceLab;
7778
this.ignoreDeviceController = this._parser.ignoreDeviceController;
7879
this.wdaLocalPort = this._parser.wdaLocalPort;
80+
this.derivedDataPath = this._parser.derivedDataPath;
7981
this.path = this._parser.path;
8082
this.capabilitiesName = this._parser.capabilitiesName;
8183
this.imagesPath = this._parser.imagesPath;

lib/parser.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
import { LogImageType } from "./enums/log-image-type";
2-
export declare const projectDir: string, projectBinary: string, pluginRoot: string, pluginBinary: string, port: number, verbose: boolean, appiumCapsLocation: string, testFolder: string, runType: string, isSauceLab: boolean, appPath: string, storage: string, testReports: string, devMode: boolean, ignoreDeviceController: boolean, wdaLocalPort: number, path: string, relaxedSecurity: boolean, cleanApp: boolean, attachToDebug: boolean, sessionId: string, startSession: boolean, capabilitiesName: string, imagesPath: string, startDeviceOptions: string, deviceTypeOrPlatform: string, device: any, driverConfig: any, logImageTypes: LogImageType[], appiumCaps: any;
2+
export declare const projectDir: string, projectBinary: string, pluginRoot: string, pluginBinary: string, port: number, verbose: boolean, appiumCapsLocation: string, testFolder: string, runType: string, isSauceLab: boolean, appPath: string, storage: string, testReports: string, devMode: boolean, ignoreDeviceController: boolean, wdaLocalPort: number, derivedDataPath: string, path: string, relaxedSecurity: boolean, cleanApp: boolean, attachToDebug: boolean, sessionId: string, startSession: boolean, capabilitiesName: string, imagesPath: string, startDeviceOptions: string, deviceTypeOrPlatform: string, device: any, driverConfig: any, logImageTypes: LogImageType[], appiumCaps: any;

0 commit comments

Comments
 (0)