美文网首页我爱编程
mac下使用java实现编写appium用例

mac下使用java实现编写appium用例

作者: 小陈已被注册 | 来源:发表于2018-05-02 01:17 被阅读0次

    appium支持用户使用多种语言编写测试用例。由于本人对java比较熟悉,所以采用了java语言。

    appium提供各种语言的客户端类库,我们先到官网(appium.io)下载java 客户端类库。下载完毕后,还需要准备如下环境:Android 开发环境、jdk、Android sdk,请自行搭建,不再赘谈。

    打开Android studio,新增一个项目File--New--New Project,按提示一步步往下走,直到项目创建成功为止。

    接着导入appium java client类库包,我们可以通过在build.grable中直接添加依赖,然后重新构建项目,也可以通过File--Project Structure进入到项目配置页面,在Dependencies页签下导入本地类包。由于appium会引用到selenium的API,所以需要把selenium的jar包通过上述方式引入项目。到这里,是不是所有的jar包都导入完毕了呢。很遗憾并没有,后续还需要导入其他jar包,而且jar包之间还有严格的版本配套规则。一旦版本不一致,用例就无法运行成功。下面是我导入的所有jar包,由于版本不一致,可能导入的jar包也不一样,仅作参考:

    当然,我们也可以采用另外一种方式检查是否遗漏jar包未导入,就是直接编写appium自动化代码,然后运行,根据报错信息,去加入需要的jar包,我当时就是通过这种方式把第一个demo跑起来的。以Android项目为例,代码如下:

public void addition_isCorrect()throws Exception {

        AndroidDriver driver;

        DesiredCapabilities cap=new DesiredCapabilities();

        cap.setCapability("automationName", "Appium");//appium做自动化

        cap.setCapability("deviceName", "HUAWEI P10");//设备名称

        cap.setCapability("platformName", "Android"); //安卓自动化还是IOS自动化

        cap.setCapability("platformVersion", "8.0"); //安卓操作系统版本

        cap.setCapability("udid", "SJE0217B30001350"); //设备的udid (adb devices 查看到的)

        cap.setCapability("appPackage","com.med.doc");//被测app的包名

        cap.setCapability("appActivity",".activity.splash.StartActivity");//被测app的入口Activity名称

        cap.setCapability("unicodeKeyboard", "True"); //支持中文输入

        cap.setCapability("resetKeyboard", "True"); //支持中文输入,必须两条都配置

        cap.setCapability("newCommandTimeout", "30"); //没有新命令,appium30秒退出

        cap.setCapability("autoAcceptAlerts","true");

        driver =new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),cap);//把以上配置传到appium服务端并连接手机

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//隐式等待

//通过resource name定位元素

        WebElement phone = driver.findElement(By.id("com.medtrust.doctor:id/login_pwd_edtTxt_phone"));//捕获帐号输入框

        phone.sendKeys("1111111");//输入账号

        WebElement pwd = driver.findElement(By.id("com.medtrust.doctor:id/login_pwd_edtTxt_pwd"));//捕获密码框

        pwd.sendKeys("1");

        TouchAction action =new TouchAction(driver);

        action.tap(885, 286).perform();//点击登录按钮

    }

    运行上述代码时,请选择Android Junit方式运行,可以通过Run--Edit Configurations为本方法 新增一个Android Junit运行方式。然后启动appium服务端,并连接真机(由于有公司的测试机,所以没试过模拟器运行的场景,模拟器场景不知道能否成功运行,建议连接真机)运行上述代码。这个过程中,我遇到过下面两种错误:

1.Exception in thread main java.lang.NoClassDefFoundError:xxx/xxx/xxx

显而易见,运行的时候找不到某个类导致报错,应该是某个jar包未导入导致的,解决方法:在百度上搜索缺少的类名所属的jar包,然后下载并导入到项目中即可。

2.java.lang.NoSuchMethodError:xxx.xxx.xxx.xxx

上述表示程序找得到需要的类,但是这个类没有提供供程序调用的方法,应该是jar包的版本不一致。到网上下载其他版本的jar包,检查jar包中对应类下有无此方法。若无则继续下载其他版本验证,若有则导入该jar包即可解决问题。要是导入后,仍无法解决问题,还有一种可能:该项目存在两个不同版本但API相同的jar包。这种情况有个特点,就是有时能运行成功,有时会报上述错误(因为运行时会出现概率性调用到正确版本的jar包),解决方法就是删掉其中一个版本jar包。

    不断重复运行上述代码,直到编译通过并能执行代码,则表示jar包已导入完整。当然,接下来执行代码时,你可能会遇到下面几个问题:

1.被测APP有些输入框的输入法无法弹出。

解决方案:由于执行代码时,appium会自动在手机上安装一个appium输入法,所以会导致原先的输入法无法弹出。我们可以在手机设置里面把appium输入法取消,这样原先的输入法又可以正常弹出使用了。

    2.运行时,发现每次都会自动安装appium setting 和unlock两个APP,且启动被测APP时,经常会弹出权限请求的窗口,甚至导致用例执行失败。

    解决方案:修改appium代码,禁止appium安装appium setting 和unlock,修改后,自动化用例就能正常执行了。

    修改appium代码操作如下(直接在网上复制下来的):

    这里以mac版本的appium为例子:(appium 根路径有可能不一样,请按照自身实际情况修改)

1、文件: /usr/local/lib/node_modules/appium/node_modules/appium-android-driver/lib/driver.js,注释以下几句代码

await this.adb.uninstallApk(this.opts.appPackage);

await helpers.installApkRemotely(this.adb, this.opts);

await helpers.resetApp(this.adb, this.opts.app, this.opts.appPackage, this.opts.fastReset);

await this.checkPackagePresent();

2、文件:/usr/local/lib/node_modules/appium/node_modules/appium-android-driver/build/lib/driver.js 注释以下几句代码

return_regeneratorRuntime.awrap(_androidHelpers2['default'].resetApp(this.adb, this.opts.app, this.opts.appPackage, this.opts.fastReset));

return_regeneratorRuntime.awrap(this.adb.uninstallApk(this.opts.appPackage));

return_regeneratorRuntime.awrap(_androidHelpers2['default'].installApkRemotely(this.adb, this.opts));

return_regeneratorRuntime.awrap(this.checkPackagePresent());

3、文件:/usr/local/lib/node_modules/appium/node_modules/appium-android-driver/lib/android-helpers.js 注释以下几句代码

await adb.install(unicodeIMEPath, false);

await helpers.pushSettingsApp(adb);

await helpers.pushUnlock(adb);

4、文件 /usr/local/lib/node_modules/appium/node_modules/appium-android-driver/build/lib/android-helpers.js 替换以下几句代码

return_regeneratorRuntime.awrap(helpers.initUnicodeKeyboard(adb)) 替换为returncontext$1$0.abrupt('return', defaultIME);

return_regeneratorRuntime.awrap(helpers.pushSettingsApp(adb)); 替换为returncontext$1$0.abrupt('return', defaultIME);

return_regeneratorRuntime.awrap(helpers.pushUnlock(adb)); 替换为returncontext$1$0.abrupt('return', defaultIME);

    修改后,重新启动appium服务器,再次连接真机,执行上述脚本,此时脚本就能正常执行了。

相关文章

网友评论

    本文标题:mac下使用java实现编写appium用例

    本文链接:https://www.haomeiwen.com/subject/dsxqrftx.html