wda-driver
Version:
Facebook WebDriverAgent Node Client Library (not official)
128 lines (109 loc) • 3.57 kB
text/typescript
import HTTPClient from './httpclient'
import Session from './session'
import fs from 'fs'
class Client {
http: HTTPClient
// Args:
// target (string): the device url
// If target is None, set to "http://localhost:8100"
constructor (url: string = 'http://localhost:8100') {
this.http = new HTTPClient(url)
}
async status () {
const res = await this.http.fetch('get', 'status')
return res
}
async home () {
// Press home button
return await this.http.fetch('post', '/wda/homescreen')
}
async healthcheck () {
// Hit healthcheck
return await this.http.fetch('get', '/wda/healthcheck')
}
async source (format: 'xml' | 'json' = 'xml', accessible: boolean = false) {
// Args:
// format (str): only 'xml' and 'json' source types are supported
// accessible (bool): when set to true, format is always 'json'
let res: any
if (accessible) {
res = await this.http.fetch('get', '/wda/accessibleSource')
} else {
res = await this.http.fetch('get', 'source?format=' + format)
}
return res.value
}
async session (bundleId?: string, args: string[] = [], environment: any = {}) {
// Args:
// - bundle_id (str): the app bundle id
// - arguments (list): ['-u', 'https://www.google.com/ncr']
// - enviroment (dict): {"KEY": "VAL"}
// WDA Return json like
// {
// "value": {
// "sessionId": "69E6FDBA-8D59-4349-B7DE-A9CA41A97814",
// "capabilities": {
// "device": "iphone",
// "browserName": "部落冲突",
// "sdkVersion": "9.3.2",
// "CFBundleIdentifier": "com.supercell.magic"
// }
// },
// "sessionId": "69E6FDBA-8D59-4349-B7DE-A9CA41A97814",
// "status": 0
// }
// To create a new session, send json data like
// {
// "desiredCapabilities": {
// "bundleId": "your-bundle-id",
// "app": "your-app-path"
// "shouldUseCompactResponses": (bool),
// "shouldUseTestManagerForVisibilityDetection": (bool),
// "maxTypingFrequency": (integer),
// "arguments": (list(str)),
// "environment": (dict: str->str)
// },
// }
if (!bundleId) {
const status = await this.status()
const sid = status['sessionId']
if (!sid) {
throw 'no session created ever'
}
const http = this.http.newClient('session/' + sid)
const { value } = await http.fetch('get', '/')
return await new Session(http, value)
}
if (!Array.isArray(args)) {
throw 'arguments must be a array'
}
if (typeof environment !== 'object') {
throw 'environment must be a object'
}
const capabilities = {
bundleId,
arguments: args,
environment,
shouldWaitForQuiescence: true,
}
const data = {
desiredCapabilities: capabilities
}
const res = await this.http.fetch('post', 'session', data)
const httpclient = this.http.newClient('session/' + res.sessionId)
const value = await httpclient.fetch('get', '/')
return new Session(httpclient, value)
}
/**
* Screenshot with PNG format
*
* @param pngFilename optional, save file name
* @return png raw data
*/
async screenshot (pngFilename: string = 'screenshot.png') {
const { value } = await this.http.fetch('get', 'screenshot')
fs.writeFileSync(pngFilename, value, 'base64')
return value
}
}
export default Client