多测师是一家拥有先进的教学理念,强大的师资团队,业内好评甚多的接口自动化测试培训机构!

17727591462

联系电话

您现在所在位置:接口自动化测试培训 > 新闻资讯

在Mac下使用Java实现编写Appium用例-自动化测试

更新时间:2022-03-30 09:53:40 作者:多测师 浏览:158

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

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

在Mac下使用Java实现编写Appium用例-自动化测试

  打开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服务器,再次连接真机,执行上述脚本,此时脚本就能正常执行了。

  以上内容为大家介绍了自动化测试中的在Mac下使用Java实现编写Appium用例,本文由多测师亲自撰写,希望对大家有所帮助。了解更多自动化测试相关知识:https://www.aichudan.com/xwzx/

联系电话

17727591462

返回顶部