Mac下使用Java实现编写Appium用例

发表于:2018-5-02 11:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小陈已被注册    来源:简书

  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,注释以下几句代码
  awaitthis.adb.uninstallApk(this.opts.appPackage);
  awaithelpers.installApkRemotely(this.adb,this.opts);
  awaithelpers.resetApp(this.adb,this.opts.app,this.opts.appPackage,this.opts.fastReset);
  awaitthis.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注释以下几句代码
  awaitadb.install(unicodeIMEPath,false);
  awaithelpers.pushSettingsApp(adb);
  awaithelpers.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服务器,再次连接真机,执行上述脚本,此时脚本就能正常执行了。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号