appium-cdp-driver 1.0.0-beta.3 → 1.0.1
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.
- package/README.md +24 -14
- package/build/scripts/opera.js +95 -0
- package/build/src/adb.js +112 -0
- package/build/src/cdp.js +22 -0
- package/build/src/commands/cookies.js +63 -0
- package/build/{commands → src/commands}/createSession.js +1 -1
- package/build/src/commands/document.js +24 -0
- package/build/src/commands/element.js +84 -0
- package/build/{commands → src/commands}/find.js +2 -2
- package/build/src/commands/index.js +16 -0
- package/build/src/commands/navigation.js +34 -0
- package/build/src/commands/screencapture.js +31 -0
- package/build/{commands → src/commands}/url.js +6 -1
- package/build/src/driver.js +100 -0
- package/build/{index.js → src/index.js} +1 -1
- package/build/{logger.js → src/logger.js} +1 -1
- package/package.json +18 -10
- package/src/adb.js +44 -16
- package/src/assets/Black_512px.png +0 -0
- package/src/assets/White_512px.png +0 -0
- package/src/commands/element.js +24 -2
- package/src/commands/find.js +6 -6
- package/src/commands/index.js +2 -1
- package/src/commands/screencapture.js +19 -0
- package/src/commands/url.js +5 -1
- package/src/driver.js +41 -20
- package/build/adb.js +0 -87
- package/build/commands/element.js +0 -61
- package/build/commands/index.js +0 -12
- package/build/driver.js +0 -85
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.helpers = exports.commands = void 0;
|
|
13
|
+
const taiko_1 = require("taiko");
|
|
14
|
+
const find_1 = require("./find");
|
|
15
|
+
let commands = {}, helpers = {}, extensions = {};
|
|
16
|
+
exports.commands = commands;
|
|
17
|
+
exports.helpers = helpers;
|
|
18
|
+
commands.getScreenshot = function getScreenshot() {
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
return (0, taiko_1.screenshot)({ encoding: "base64" });
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
commands.getElementScreenshot = function getElementScreenshot(elementId) {
|
|
24
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
+
const element = find_1.elementCache[elementId];
|
|
26
|
+
return (0, taiko_1.screenshot)(element, { encoding: "base64" });
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
Object.assign(extensions, commands, helpers);
|
|
30
|
+
exports.default = extensions;
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyZWVuY2FwdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zY3JlZW5jYXB0dXJlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLGlDQUFtQztBQUNuQyxpQ0FBc0M7QUFFdEMsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUNmLE9BQU8sR0FBRyxFQUFFLEVBQ1osVUFBVSxHQUFHLEVBQUUsQ0FBQztBQVlULDRCQUFRO0FBQUUsMEJBQU87QUFWMUIsUUFBUSxDQUFDLGFBQWEsR0FBRyxTQUFlLGFBQWE7O1FBQ25ELE9BQU8sSUFBQSxrQkFBVSxFQUFDLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUFBLENBQUM7QUFFRixRQUFRLENBQUMsb0JBQW9CLEdBQUcsU0FBZSxvQkFBb0IsQ0FBQyxTQUFTOztRQUMzRSxNQUFNLE9BQU8sR0FBRyxtQkFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sSUFBQSxrQkFBVSxFQUFDLE9BQU8sRUFBRSxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7Q0FBQSxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRTdDLGtCQUFlLFVBQVUsQ0FBQyJ9
|
|
@@ -24,6 +24,11 @@ commands.getUrl = function getUrl() {
|
|
|
24
24
|
return yield (0, taiko_1.currentURL)();
|
|
25
25
|
});
|
|
26
26
|
};
|
|
27
|
+
commands.refresh = function refresh() {
|
|
28
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
29
|
+
return yield (0, taiko_1.reload)();
|
|
30
|
+
});
|
|
31
|
+
};
|
|
27
32
|
Object.assign(extensions, commands, helpers);
|
|
28
33
|
exports.default = extensions;
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3VybC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxpQ0FBaUQ7QUFFakQsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUNmLE9BQU8sR0FBRyxFQUFFLEVBQ1osVUFBVSxHQUFHLEVBQUUsQ0FBQztBQWVULDRCQUFRO0FBQUUsMEJBQU87QUFiMUIsUUFBUSxDQUFDLE1BQU0sR0FBRyxTQUFlLE1BQU0sQ0FBQyxHQUFHOztRQUN6QyxNQUFNLElBQUEsWUFBSSxFQUFDLEdBQUcsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUFBLENBQUM7QUFFRixRQUFRLENBQUMsTUFBTSxHQUFHLFNBQWUsTUFBTTs7UUFDckMsT0FBTyxNQUFNLElBQUEsa0JBQVUsR0FBRSxDQUFDO0lBQzVCLENBQUM7Q0FBQSxDQUFDO0FBRUYsUUFBUSxDQUFDLE9BQU8sR0FBRyxTQUFlLE9BQU87O1FBQ3ZDLE9BQU8sTUFBTSxJQUFBLGNBQU0sR0FBRSxDQUFDO0lBQ3hCLENBQUM7Q0FBQSxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRTdDLGtCQUFlLFVBQVUsQ0FBQyJ9
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.AppiumCDPDriver = void 0;
|
|
16
|
+
const base_driver_1 = require("@appium/base-driver");
|
|
17
|
+
const adb_1 = require("./adb");
|
|
18
|
+
const taiko_1 = require("taiko");
|
|
19
|
+
const commands_1 = __importDefault(require("./commands"));
|
|
20
|
+
const logger_1 = __importDefault(require("./logger"));
|
|
21
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
22
|
+
const async_retry_1 = __importDefault(require("async-retry"));
|
|
23
|
+
process.env.LOCAL_PROTOCOL = true;
|
|
24
|
+
class AppiumCDPDriver extends base_driver_1.BaseDriver {
|
|
25
|
+
constructor(args) {
|
|
26
|
+
super(args);
|
|
27
|
+
this.locatorStrategies = ['xpath', 'id'];
|
|
28
|
+
this.desiredCapConstraints = {
|
|
29
|
+
automationName: {
|
|
30
|
+
presence: true,
|
|
31
|
+
isString: true,
|
|
32
|
+
},
|
|
33
|
+
browserName: {
|
|
34
|
+
presence: true,
|
|
35
|
+
isString: true,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
createSession(jwpCaps, reqCaps, w3cCaps, otherDriverData) {
|
|
40
|
+
const _super = Object.create(null, {
|
|
41
|
+
createSession: { get: () => super.createSession }
|
|
42
|
+
});
|
|
43
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
44
|
+
console.log(yield (0, taiko_1.getConfig)('local'));
|
|
45
|
+
const res = yield _super.createSession.call(this, w3cCaps);
|
|
46
|
+
const browser = w3cCaps.alwaysMatch['browserName'];
|
|
47
|
+
yield (0, adb_1.getAdb)();
|
|
48
|
+
const port = yield (0, adb_1.adbExec)(browser);
|
|
49
|
+
yield (0, adb_1.startApplication)(browser);
|
|
50
|
+
logger_1.default.info('Browser opened');
|
|
51
|
+
// Wait a bit longer for Opera to initialize its CDP interface
|
|
52
|
+
yield new Promise((resolve) => setTimeout(resolve, 3000));
|
|
53
|
+
const data = yield (0, async_retry_1.default)((bail) => __awaiter(this, void 0, void 0, function* () {
|
|
54
|
+
try {
|
|
55
|
+
logger_1.default.info(`Attempting to connect to CDP at http://localhost:${port}/json/list`);
|
|
56
|
+
const res = yield (0, node_fetch_1.default)(`http://localhost:${port}/json/list`);
|
|
57
|
+
if (!res.ok) {
|
|
58
|
+
throw new Error(`HTTP ${res.status}: ${res.statusText}`);
|
|
59
|
+
}
|
|
60
|
+
const data = yield res.json();
|
|
61
|
+
logger_1.default.info(`CDP response: ${JSON.stringify(data)}`);
|
|
62
|
+
if (!Array.isArray(data) || data.length === 0) {
|
|
63
|
+
throw new Error('Debug list is empty or invalid');
|
|
64
|
+
}
|
|
65
|
+
return data;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
logger_1.default.error(`CDP connection attempt failed: ${error.message}`);
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}), {
|
|
72
|
+
retries: 10,
|
|
73
|
+
factor: 2,
|
|
74
|
+
minTimeout: 2000,
|
|
75
|
+
maxTimeout: 10000,
|
|
76
|
+
});
|
|
77
|
+
const target = data.find((target) => {
|
|
78
|
+
return target.url.includes('appium.io');
|
|
79
|
+
});
|
|
80
|
+
logger_1.default.info(`Target found: ${target.webSocketDebuggerUrl}`);
|
|
81
|
+
yield (0, taiko_1.openBrowser)({
|
|
82
|
+
port: port,
|
|
83
|
+
host: '127.0.0.1',
|
|
84
|
+
target: target.webSocketDebuggerUrl,
|
|
85
|
+
});
|
|
86
|
+
return res;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
deleteSession() {
|
|
90
|
+
const _super = Object.create(null, {
|
|
91
|
+
deleteSession: { get: () => super.deleteSession }
|
|
92
|
+
});
|
|
93
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
+
yield _super.deleteSession.call(this);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.AppiumCDPDriver = AppiumCDPDriver;
|
|
99
|
+
Object.assign(AppiumCDPDriver.prototype, commands_1.default);
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RyaXZlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBeUQ7QUFDekQsK0JBQTBEO0FBQzFELGlDQUFxRDtBQUNyRCwwREFBa0M7QUFDbEMsc0RBQTJCO0FBQzNCLDREQUErQjtBQUMvQiw4REFBZ0M7QUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQ2xDLE1BQU0sZUFBZ0IsU0FBUSx3QkFBVTtJQUN0QyxZQUFZLElBQUk7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLHFCQUFxQixHQUFHO1lBQzNCLGNBQWMsRUFBRTtnQkFDZCxRQUFRLEVBQUUsSUFBSTtnQkFDZCxRQUFRLEVBQUUsSUFBSTthQUNmO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFFBQVEsRUFBRSxJQUFJO2FBQ2Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVLLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlOzs7OztZQUM1RCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBQSxpQkFBUyxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFNLGFBQWEsWUFBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sSUFBQSxZQUFNLEdBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSxhQUFPLEVBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsTUFBTSxJQUFBLHNCQUFnQixFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLGdCQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDM0IsOERBQThEO1lBQzlELE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUUxRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEscUJBQUssRUFDdEIsQ0FBTyxJQUFJLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUM7b0JBQ0gsZ0JBQUcsQ0FBQyxJQUFJLENBQ04sb0RBQW9ELElBQUksWUFBWSxDQUNyRSxDQUFDO29CQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxvQkFBSyxFQUFDLG9CQUFvQixJQUFJLFlBQVksQ0FBQyxDQUFDO29CQUU5RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO29CQUMzRCxDQUFDO29CQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUM5QixnQkFBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBRWxELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztvQkFDcEQsQ0FBQztvQkFFRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsZ0JBQUcsQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUM3RCxNQUFNLEtBQUssQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQyxDQUFBLEVBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLFVBQVUsRUFBRSxLQUFLO2FBQ2xCLENBQ0YsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDbEMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztZQUNILGdCQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sSUFBQSxtQkFBVyxFQUFDO2dCQUNoQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsV0FBVztnQkFDakIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxvQkFBb0I7YUFDcEMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO0tBQUE7SUFFSyxhQUFhOzs7OztZQUNqQixNQUFNLE9BQU0sYUFBYSxXQUFFLENBQUM7UUFDOUIsQ0FBQztLQUFBO0NBQ0Y7QUFHUSwwQ0FBZTtBQUR4QixNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsa0JBQVEsQ0FBQyxDQUFDIn0=
|
|
@@ -48,4 +48,4 @@ function example() {
|
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
example();
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDcEMsU0FBZSxPQUFPOztRQUNwQixJQUFJLE1BQU0sQ0FBQztRQUNYLElBQUksQ0FBQztZQUNILHNCQUFzQjtZQUN0Qix1QkFBdUI7WUFDdkIsdUJBQXVCO1lBQ3ZCLGdCQUFnQjtZQUNoQixpQkFBaUI7WUFDakIsc0RBQXNEO1lBQ3RELE1BQU07WUFDTixzQkFBc0I7WUFDdEIsdUJBQXVCO1lBQ3ZCLGdCQUFnQjtZQUNoQixzREFBc0Q7WUFDdEQsTUFBTTtZQUNOLDRCQUE0QjtZQUM1Qix3QkFBd0I7WUFDeEIsa0JBQWtCO1lBRWxCLE1BQU0sT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNsQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUFBO0FBRUQsT0FBTyxFQUFFLENBQUMifQ==
|
|
@@ -3,4 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const support_1 = require("@appium/support");
|
|
4
4
|
const log = support_1.logger.getLogger("CDPDriver");
|
|
5
5
|
exports.default = log;
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUF5QztBQUV6QyxNQUFNLEdBQUcsR0FBRyxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUUxQyxrQkFBZSxHQUFHLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-cdp-driver",
|
|
3
|
-
"description": "Appium driver for the
|
|
3
|
+
"description": "Appium driver for the CDP",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"appium",
|
|
6
6
|
"chrome-dev-tools"
|
|
7
7
|
],
|
|
8
|
-
"version": "1.0.
|
|
8
|
+
"version": "1.0.1",
|
|
9
9
|
"author": "",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"repository": {
|
|
12
12
|
"type": "git",
|
|
13
|
-
"url": "https://github.com/appium/appium-
|
|
13
|
+
"url": "https://github.com/appium/appium-cdp-driver.git"
|
|
14
14
|
},
|
|
15
15
|
"bugs": {
|
|
16
|
-
"url": "https://github.com/appium/appium-
|
|
16
|
+
"url": "https://github.com/appium/appium-cdp-driver/issues"
|
|
17
17
|
},
|
|
18
|
-
"main": "./build/driver.js",
|
|
18
|
+
"main": "./build/src/driver.js",
|
|
19
19
|
"bin": {},
|
|
20
20
|
"directories": {
|
|
21
21
|
"src": "src"
|
|
@@ -30,14 +30,17 @@
|
|
|
30
30
|
"platformNames": [
|
|
31
31
|
"Android"
|
|
32
32
|
],
|
|
33
|
-
"mainClass": "AppiumCDPDriver"
|
|
33
|
+
"mainClass": "AppiumCDPDriver",
|
|
34
|
+
"scripts": {
|
|
35
|
+
"skip-welcome-opera": "./build/scripts/opera.js"
|
|
36
|
+
}
|
|
34
37
|
},
|
|
35
38
|
"scripts": {
|
|
36
39
|
"clean": "rimraf package-lock.json && rimraf node_modules && TAIKO_SKIP_CHROMIUM_DOWNLOAD=true npm install",
|
|
37
40
|
"build": "rimraf build && tsc",
|
|
38
41
|
"watch": "tsc --watch",
|
|
39
|
-
"test": "mocha --require ts-node/register
|
|
40
|
-
"install-driver": "npm run build
|
|
42
|
+
"test": "mocha --require ts-node/register ./test/*.spec.js --timeout 260000 ",
|
|
43
|
+
"install-driver": "npm run build",
|
|
41
44
|
"reinstall-driver": "(appium driver uninstall cdp-driver || exit 0) && npm run install-driver"
|
|
42
45
|
},
|
|
43
46
|
"devDependencies": {
|
|
@@ -46,17 +49,22 @@
|
|
|
46
49
|
"mocha": "^10.0.0",
|
|
47
50
|
"rimraf": "^3.0.2",
|
|
48
51
|
"ts-node": "^10.9.1",
|
|
49
|
-
"typescript": "^
|
|
52
|
+
"typescript": "^5.0.0",
|
|
50
53
|
"webdriverio": "^7.12.4"
|
|
51
54
|
},
|
|
52
55
|
"dependencies": {
|
|
53
56
|
"@appium/base-driver": "^8.5.7",
|
|
57
|
+
"appium-uiautomator2-driver": "^4.2.3",
|
|
54
58
|
"@appium/support": "^2.59.2",
|
|
55
59
|
"appium-adb": "^9.10.0",
|
|
56
60
|
"async-retry": "^1.3.3",
|
|
57
61
|
"chai": "^4.3.6",
|
|
58
62
|
"chrome-remote-interface": "^0.31.3",
|
|
59
63
|
"get-port": "^5.1.1",
|
|
60
|
-
"taiko": "https://github.com/getgauge/taiko.git"
|
|
64
|
+
"taiko": "https://github.com/getgauge/taiko.git",
|
|
65
|
+
"asyncbox": "3.0.0"
|
|
66
|
+
},
|
|
67
|
+
"peerDependencies": {
|
|
68
|
+
"appium": "^2.4.1 || ^3.0.0-beta.0"
|
|
61
69
|
}
|
|
62
70
|
}
|
package/src/adb.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import { ADB, getSdkRootFromEnv } from
|
|
2
|
-
import { fs } from
|
|
3
|
-
import
|
|
4
|
-
import
|
|
1
|
+
import { ADB, getSdkRootFromEnv } from 'appium-adb';
|
|
2
|
+
import { fs } from '@appium/support';
|
|
3
|
+
import getPort from 'get-port';
|
|
4
|
+
import log from './logger';
|
|
5
5
|
|
|
6
6
|
let adb;
|
|
7
7
|
const START_APP_WAIT_DURATION = 60000;
|
|
8
8
|
|
|
9
|
+
const DEVTOOLS_SOCKET_MAP = {
|
|
10
|
+
chrome: 'chrome_devtools_remote',
|
|
11
|
+
brave: 'chrome_devtools_remote',
|
|
12
|
+
opera: 'com.opera.browser.devtools',
|
|
13
|
+
terrance: 'com.sec.android.app.sbrowser_devtools_remote',
|
|
14
|
+
};
|
|
15
|
+
|
|
9
16
|
export async function getAdb() {
|
|
10
17
|
try {
|
|
11
18
|
if (!adb) {
|
|
@@ -19,7 +26,7 @@ export async function getAdb() {
|
|
|
19
26
|
export async function requireSdkRoot() {
|
|
20
27
|
const sdkRoot = getSdkRootFromEnv();
|
|
21
28
|
const docMsg =
|
|
22
|
-
|
|
29
|
+
'Read https://developer.android.com/studio/command-line/variables for more details';
|
|
23
30
|
if (_.isEmpty(sdkRoot)) {
|
|
24
31
|
throw new Error(
|
|
25
32
|
`Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported. ${docMsg}`
|
|
@@ -40,12 +47,14 @@ export async function requireSdkRoot() {
|
|
|
40
47
|
return sdkRoot;
|
|
41
48
|
}
|
|
42
49
|
|
|
43
|
-
export async function adbExec(browser =
|
|
50
|
+
export async function adbExec(browser = 'chrome') {
|
|
44
51
|
let freePort = await getPort();
|
|
52
|
+
const devtoolsSocket =
|
|
53
|
+
DEVTOOLS_SOCKET_MAP[browser] || `${browser}_devtools_remote`;
|
|
45
54
|
await adb.adbExec([
|
|
46
|
-
|
|
55
|
+
'forward',
|
|
47
56
|
`tcp:${freePort}`,
|
|
48
|
-
`localabstract:${
|
|
57
|
+
`localabstract:${devtoolsSocket}`,
|
|
49
58
|
]);
|
|
50
59
|
return freePort;
|
|
51
60
|
}
|
|
@@ -53,20 +62,39 @@ export async function adbExec(browser = "chrome") {
|
|
|
53
62
|
export async function startApplication(browser = 'chrome') {
|
|
54
63
|
const common = {
|
|
55
64
|
waitDuration: START_APP_WAIT_DURATION,
|
|
56
|
-
optionalIntentArguments:
|
|
65
|
+
optionalIntentArguments: '-d www.appium.io',
|
|
57
66
|
};
|
|
58
67
|
const chrome = {
|
|
59
|
-
pkg:
|
|
60
|
-
activity:
|
|
68
|
+
pkg: 'com.android.chrome',
|
|
69
|
+
activity: 'com.google.android.apps.chrome.Main',
|
|
61
70
|
};
|
|
62
71
|
|
|
63
72
|
const terrance = {
|
|
64
|
-
pkg:
|
|
65
|
-
activity:
|
|
73
|
+
pkg: 'com.sec.android.app.sbrowser',
|
|
74
|
+
activity: 'com.sec.android.app.sbrowser.SBrowserMainActivity',
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const brave = {
|
|
78
|
+
pkg: 'com.brave.browser',
|
|
79
|
+
activity: 'com.google.android.apps.chrome.Main',
|
|
66
80
|
};
|
|
81
|
+
|
|
82
|
+
const opera = {
|
|
83
|
+
pkg: 'com.opera.browser',
|
|
84
|
+
activity: 'com.opera.android.BrowserActivity',
|
|
85
|
+
};
|
|
86
|
+
|
|
67
87
|
if (browser === 'chrome') {
|
|
68
|
-
|
|
69
|
-
|
|
88
|
+
log.info(`Starting Chrome`);
|
|
89
|
+
await adb.startApp(Object.assign({}, chrome, common));
|
|
90
|
+
} else if (browser === 'terrance') {
|
|
91
|
+
log.info(`Starting Terrance`);
|
|
70
92
|
await adb.startApp(Object.assign({}, terrance, common));
|
|
93
|
+
} else if (browser === 'brave') {
|
|
94
|
+
log.info(`Starting Brave`);
|
|
95
|
+
await adb.startApp(Object.assign({}, brave, common));
|
|
96
|
+
} else if (browser === 'opera') {
|
|
97
|
+
log.info(`Starting Opera`);
|
|
98
|
+
await adb.startApp(Object.assign({}, opera, common));
|
|
71
99
|
}
|
|
72
|
-
}
|
|
100
|
+
}
|
|
Binary file
|
|
Binary file
|
package/src/commands/element.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {click, evaluate, into, write} from "taiko";
|
|
2
2
|
import { elementCache } from "./find";
|
|
3
3
|
|
|
4
4
|
let commands = {},
|
|
@@ -25,7 +25,7 @@ commands.elementDisplayed = async function elementDisplayed(elementId) {
|
|
|
25
25
|
|
|
26
26
|
commands.elementEnabled = async function elementEnabled(elementId) {
|
|
27
27
|
const element = elementCache[elementId];
|
|
28
|
-
return !element.isDisabled();
|
|
28
|
+
return !await element.isDisabled();
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
commands.setValue = async function setValue(value, elementId) {
|
|
@@ -38,6 +38,28 @@ commands.clear = async function clear(elementId) {
|
|
|
38
38
|
await write("", into(element));
|
|
39
39
|
};
|
|
40
40
|
|
|
41
|
+
commands.getAttribute = async function getAttribute(value, elementId) {
|
|
42
|
+
const element = elementCache[elementId];
|
|
43
|
+
return await element.attribute(value);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
commands.getElementRect = async function getElementRect(elementId) {
|
|
47
|
+
const element = elementCache[elementId];
|
|
48
|
+
return await evaluate(element, (element) =>
|
|
49
|
+
{
|
|
50
|
+
const {x, y, width, height } = element.getBoundingClientRect();
|
|
51
|
+
return {x, y, width, height }
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
commands.getName = async function getName(elementId) {
|
|
56
|
+
const element = elementCache[elementId];
|
|
57
|
+
return await evaluate(element, (element) =>
|
|
58
|
+
{
|
|
59
|
+
return element.tagName;
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
|
|
41
63
|
Object.assign(extensions, commands, helpers);
|
|
42
64
|
export { commands, helpers };
|
|
43
65
|
export default extensions;
|
package/src/commands/find.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { errors } from
|
|
2
|
-
import { $ } from
|
|
3
|
-
import log from
|
|
4
|
-
import { util } from
|
|
5
|
-
import { W3C_ELEMENT_KEY } from
|
|
1
|
+
import { errors } from '@appium/base-driver';
|
|
2
|
+
import { $ } from 'taiko';
|
|
3
|
+
import log from '../logger';
|
|
4
|
+
import { util } from '@appium/support';
|
|
5
|
+
import { W3C_ELEMENT_KEY } from '@appium/base-driver/build/lib/constants';
|
|
6
6
|
|
|
7
7
|
let commands = {},
|
|
8
8
|
helpers = {},
|
|
@@ -23,7 +23,7 @@ helpers.findElOrEls = async function findElOrEls(
|
|
|
23
23
|
log.info(`Selector is ${selector}`);
|
|
24
24
|
log.info(`Mult is ${mult}`);
|
|
25
25
|
log.info(`Context is ${context}`);
|
|
26
|
-
const elStrategy = strategy ===
|
|
26
|
+
const elStrategy = strategy === 'xpath' ? $(selector) : $(`#${selector}`);
|
|
27
27
|
if ((await elStrategy.exists()) && !mult) {
|
|
28
28
|
const elementId = getUUID();
|
|
29
29
|
elementCache[elementId] = elStrategy;
|
package/src/commands/index.js
CHANGED
|
@@ -4,9 +4,10 @@ import elementCommands from "./element";
|
|
|
4
4
|
import navigationCommands from "./navigation";
|
|
5
5
|
import documentCommands from "./document";
|
|
6
6
|
import cookieCommands from "./cookies";
|
|
7
|
+
import screenshotComamnds from "./screencapture"
|
|
7
8
|
|
|
8
9
|
let commands = {};
|
|
9
10
|
|
|
10
|
-
Object.assign(commands, cookieCommands, documentCommands, navigationCommands, urlCommands, findCommand, elementCommands);
|
|
11
|
+
Object.assign(commands, screenshotComamnds, cookieCommands, documentCommands, navigationCommands, urlCommands, findCommand, elementCommands);
|
|
11
12
|
|
|
12
13
|
export default commands;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { screenshot } from "taiko";
|
|
2
|
+
import { elementCache } from "./find";
|
|
3
|
+
|
|
4
|
+
let commands = {},
|
|
5
|
+
helpers = {},
|
|
6
|
+
extensions = {};
|
|
7
|
+
|
|
8
|
+
commands.getScreenshot = async function getScreenshot() {
|
|
9
|
+
return screenshot({encoding: "base64"});
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
commands.getElementScreenshot = async function getElementScreenshot(elementId) {
|
|
13
|
+
const element = elementCache[elementId];
|
|
14
|
+
return screenshot(element, {encoding: "base64"});
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
Object.assign(extensions, commands, helpers);
|
|
18
|
+
export { commands, helpers };
|
|
19
|
+
export default extensions;
|
package/src/commands/url.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { goto, currentURL } from "taiko";
|
|
1
|
+
import { goto, currentURL, reload } from "taiko";
|
|
2
2
|
|
|
3
3
|
let commands = {},
|
|
4
4
|
helpers = {},
|
|
@@ -12,6 +12,10 @@ commands.getUrl = async function getUrl() {
|
|
|
12
12
|
return await currentURL();
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
+
commands.refresh = async function refresh() {
|
|
16
|
+
return await reload();
|
|
17
|
+
};
|
|
18
|
+
|
|
15
19
|
Object.assign(extensions, commands, helpers);
|
|
16
20
|
export { commands, helpers };
|
|
17
21
|
export default extensions;
|
package/src/driver.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { BaseDriver, errors } from
|
|
2
|
-
import { getAdb, adbExec, startApplication } from
|
|
3
|
-
import { openBrowser, getConfig, goto } from
|
|
4
|
-
import commands from
|
|
5
|
-
import log from
|
|
6
|
-
import fetch from
|
|
7
|
-
import retry from
|
|
1
|
+
import { BaseDriver, errors } from '@appium/base-driver';
|
|
2
|
+
import { getAdb, adbExec, startApplication } from './adb';
|
|
3
|
+
import { openBrowser, getConfig, goto } from 'taiko';
|
|
4
|
+
import commands from './commands';
|
|
5
|
+
import log from './logger';
|
|
6
|
+
import fetch from 'node-fetch';
|
|
7
|
+
import retry from 'async-retry';
|
|
8
8
|
process.env.LOCAL_PROTOCOL = true;
|
|
9
9
|
class AppiumCDPDriver extends BaseDriver {
|
|
10
10
|
constructor(args) {
|
|
11
11
|
super(args);
|
|
12
|
-
this.locatorStrategies = [
|
|
12
|
+
this.locatorStrategies = ['xpath', 'id'];
|
|
13
13
|
this.desiredCapConstraints = {
|
|
14
14
|
automationName: {
|
|
15
15
|
presence: true,
|
|
@@ -23,34 +23,55 @@ class AppiumCDPDriver extends BaseDriver {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
async createSession(jwpCaps, reqCaps, w3cCaps, otherDriverData) {
|
|
26
|
-
console.log(await getConfig(
|
|
26
|
+
console.log(await getConfig('local'));
|
|
27
27
|
const res = await super.createSession(w3cCaps);
|
|
28
|
-
const browser = w3cCaps.alwaysMatch[
|
|
28
|
+
const browser = w3cCaps.alwaysMatch['browserName'];
|
|
29
29
|
await getAdb();
|
|
30
30
|
const port = await adbExec(browser);
|
|
31
31
|
await startApplication(browser);
|
|
32
|
-
log.info(
|
|
32
|
+
log.info('Browser opened');
|
|
33
|
+
// Wait a bit longer for Opera to initialize its CDP interface
|
|
34
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
35
|
+
|
|
33
36
|
const data = await retry(
|
|
34
37
|
async (bail) => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
try {
|
|
39
|
+
log.info(
|
|
40
|
+
`Attempting to connect to CDP at http://localhost:${port}/json/list`
|
|
41
|
+
);
|
|
42
|
+
const res = await fetch(`http://localhost:${port}/json/list`);
|
|
43
|
+
|
|
44
|
+
if (!res.ok) {
|
|
45
|
+
throw new Error(`HTTP ${res.status}: ${res.statusText}`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const data = await res.json();
|
|
49
|
+
log.info(`CDP response: ${JSON.stringify(data)}`);
|
|
50
|
+
|
|
51
|
+
if (!Array.isArray(data) || data.length === 0) {
|
|
52
|
+
throw new Error('Debug list is empty or invalid');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return data;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
log.error(`CDP connection attempt failed: ${error.message}`);
|
|
58
|
+
throw error;
|
|
39
59
|
}
|
|
40
|
-
return data;
|
|
41
60
|
},
|
|
42
61
|
{
|
|
43
|
-
retries:
|
|
44
|
-
factor:
|
|
62
|
+
retries: 10,
|
|
63
|
+
factor: 2,
|
|
64
|
+
minTimeout: 2000,
|
|
65
|
+
maxTimeout: 10000,
|
|
45
66
|
}
|
|
46
67
|
);
|
|
47
68
|
const target = data.find((target) => {
|
|
48
|
-
return
|
|
69
|
+
return target.url.includes('appium.io');
|
|
49
70
|
});
|
|
50
71
|
log.info(`Target found: ${target.webSocketDebuggerUrl}`);
|
|
51
72
|
await openBrowser({
|
|
52
73
|
port: port,
|
|
53
|
-
host:
|
|
74
|
+
host: '127.0.0.1',
|
|
54
75
|
target: target.webSocketDebuggerUrl,
|
|
55
76
|
});
|
|
56
77
|
return res;
|
package/build/adb.js
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.startApplication = exports.adbExec = exports.requireSdkRoot = exports.getAdb = void 0;
|
|
16
|
-
const appium_adb_1 = require("appium-adb");
|
|
17
|
-
const support_1 = require("@appium/support");
|
|
18
|
-
const get_port_1 = __importDefault(require("get-port"));
|
|
19
|
-
let adb;
|
|
20
|
-
const START_APP_WAIT_DURATION = 60000;
|
|
21
|
-
function getAdb() {
|
|
22
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
-
try {
|
|
24
|
-
if (!adb) {
|
|
25
|
-
adb = yield appium_adb_1.ADB.createADB();
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
catch (e) {
|
|
29
|
-
console.log(e);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
exports.getAdb = getAdb;
|
|
34
|
-
function requireSdkRoot() {
|
|
35
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
-
const sdkRoot = (0, appium_adb_1.getSdkRootFromEnv)();
|
|
37
|
-
const docMsg = "Read https://developer.android.com/studio/command-line/variables for more details";
|
|
38
|
-
if (_.isEmpty(sdkRoot)) {
|
|
39
|
-
throw new Error(`Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported. ${docMsg}`);
|
|
40
|
-
}
|
|
41
|
-
if (!(yield support_1.fs.exists(sdkRoot))) {
|
|
42
|
-
throw new Error(`The Android SDK root folder '${sdkRoot}' does not exist on the local file system. ${docMsg}`);
|
|
43
|
-
}
|
|
44
|
-
const stats = yield support_1.fs.stat(sdkRoot);
|
|
45
|
-
if (!stats.isDirectory()) {
|
|
46
|
-
throw new Error(`The Android SDK root '${sdkRoot}' must be a folder. ${docMsg}`);
|
|
47
|
-
}
|
|
48
|
-
return sdkRoot;
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
exports.requireSdkRoot = requireSdkRoot;
|
|
52
|
-
function adbExec(browser = "chrome") {
|
|
53
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
54
|
-
let freePort = yield (0, get_port_1.default)();
|
|
55
|
-
yield adb.adbExec([
|
|
56
|
-
"forward",
|
|
57
|
-
`tcp:${freePort}`,
|
|
58
|
-
`localabstract:${browser}_devtools_remote`,
|
|
59
|
-
]);
|
|
60
|
-
return freePort;
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
exports.adbExec = adbExec;
|
|
64
|
-
function startApplication(browser = 'chrome') {
|
|
65
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
-
const common = {
|
|
67
|
-
waitDuration: START_APP_WAIT_DURATION,
|
|
68
|
-
optionalIntentArguments: "-d www.appium.io",
|
|
69
|
-
};
|
|
70
|
-
const chrome = {
|
|
71
|
-
pkg: "com.android.chrome",
|
|
72
|
-
activity: "com.google.android.apps.chrome.Main",
|
|
73
|
-
};
|
|
74
|
-
const terrance = {
|
|
75
|
-
pkg: "com.sec.android.app.sbrowser",
|
|
76
|
-
activity: "com.sec.android.app.sbrowser.SBrowserMainActivity",
|
|
77
|
-
};
|
|
78
|
-
if (browser === 'chrome') {
|
|
79
|
-
yield adb.startApp(Object.assign({}, chrome, common));
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
yield adb.startApp(Object.assign({}, terrance, common));
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
exports.startApplication = startApplication;
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FkYi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBb0Q7QUFDcEQsNkNBQXFDO0FBRXJDLHdEQUErQjtBQUUvQixJQUFJLEdBQUcsQ0FBQztBQUNSLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBRXRDLFNBQXNCLE1BQU07O1FBQzFCLElBQUk7WUFDRixJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNSLEdBQUcsR0FBRyxNQUFNLGdCQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDN0I7U0FDRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQjtJQUNILENBQUM7Q0FBQTtBQVJELHdCQVFDO0FBRUQsU0FBc0IsY0FBYzs7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBQSw4QkFBaUIsR0FBRSxDQUFDO1FBQ3BDLE1BQU0sTUFBTSxHQUNWLG1GQUFtRixDQUFDO1FBQ3RGLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN0QixNQUFNLElBQUksS0FBSyxDQUNiLGdGQUFnRixNQUFNLEVBQUUsQ0FDekYsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FDYixnQ0FBZ0MsT0FBTyw4Q0FBOEMsTUFBTSxFQUFFLENBQzlGLENBQUM7U0FDSDtRQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUJBQXlCLE9BQU8sdUJBQXVCLE1BQU0sRUFBRSxDQUNoRSxDQUFDO1NBQ0g7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQUE7QUF0QkQsd0NBc0JDO0FBRUQsU0FBc0IsT0FBTyxDQUFDLE9BQU8sR0FBRyxRQUFROztRQUM5QyxJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUEsa0JBQU8sR0FBRSxDQUFDO1FBQy9CLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUNoQixTQUFTO1lBQ1QsT0FBTyxRQUFRLEVBQUU7WUFDakIsaUJBQWlCLE9BQU8sa0JBQWtCO1NBQzNDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FBQTtBQVJELDBCQVFDO0FBRUQsU0FBc0IsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLFFBQVE7O1FBQ3ZELE1BQU0sTUFBTSxHQUFHO1lBQ2IsWUFBWSxFQUFFLHVCQUF1QjtZQUNyQyx1QkFBdUIsRUFBRSxrQkFBa0I7U0FDNUMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHO1lBQ2IsR0FBRyxFQUFFLG9CQUFvQjtZQUN6QixRQUFRLEVBQUUscUNBQXFDO1NBQ2hELENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRztZQUNmLEdBQUcsRUFBRSw4QkFBOEI7WUFDbkMsUUFBUSxFQUFFLG1EQUFtRDtTQUM5RCxDQUFDO1FBQ0YsSUFBSSxPQUFPLEtBQUssUUFBUSxFQUFFO1lBQ3RCLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN6RDthQUFNO1lBQ0wsTUFBTSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztDQUFBO0FBbkJELDRDQW1CQyJ9
|