背景
可以关注来点儿干货呀公众号~
上半年因为要把selenium grid和appium结合做UI的分布式执行,但是在过程中发现,我有几个例如5.0和5.0.1这种系统的手机时,任务不能准备的分发到对应的设备上执行,这时候排查了原因,是出在appium这块,所以对源码进行了一定的修改。
过程
这块对appium的架构及原理不做解释,直接从对应的代码入手。假设我们是通过npm install -g appium
安装的appium,那它的源码就在/usr/local/lib/node_modules/appium下面。因为我们这边只讨论的是安卓设备,所以修改appium/node_modules/appium-android-driver/android-helpers.js这个文件。
for (let device of devices) {
// direct adb calls to the specific device
await adb.setDeviceId(device.udid);
let deviceOS = await adb.getPlatformVersion();
// build up our info string of available devices as we iterate
availDevicesStr.push(`${device.udid} (${deviceOS})`);
// we do a begins with check for implied wildcard matching
// eg: 4 matches 4.1, 4.0, 4.1.3-samsung, etc
if (deviceOS.indexOf(opts.platformVersion) === 0) {
udid = device.udid;
break;
}
}
这段代码是helpers.getDeviceInfoFromCaps
的一个实现,可以看到,是根据platformVersion去分配设备的,并在源码中的注释写到eg: 4 matches 4.1, 4.0, 4.1.3-samsung, etc
。所以这块就造成了无法满足分配到我们需要的手机这个功能,随即,我对这段代码进行了一定的改造。
for (let device of devices) {
if (opts.deviceName == device.udid){
await adb.setDeviceId(device.udid);
let deviceOS = await adb.getPlatformVersion();
availDevicesStr.push(`${device.udid} (${deviceOS})`);
udid = device.udid;
break;
}
我们这边的想法是通过设备唯一的udid去分配,这样就准备分配到对应的设备上了。
后续
修改完成后,保存对应的代码,npm run build
对应的依赖,重新启动appium即可使用你修改的代码了。