我的目标是打开我的软件,
输入账号密码
登录成功
退出成功
第一步打开我的eclipse
1.创建项目:跟正常创建javaproject 一样
2.导入jar包,有的没的我都导进去,肯定没错。
3.写启动软件的主函数
这里的代码是固定写法,在网上一查一堆。

package com.run; import java.net.MalformedURLException; import java.net.URL; import org.openqa.selenium.remote.DesiredCapabilities; import com.mysql.jdbc.Driver; import com.toolkit.Swipe; import com.toolkit.andriodAction; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.AndroidElement; import io.appium.java_client.remote.MobileCapabilityType; import java.net.URL; public class Run { public static void main(String[] args)throws MalformedURLException, InterruptedException { // TODO 自动生成的方法存根 //1.添加配置,创建DesiredCapabilities对象 DesiredCapabilities desiredCapabilities = new DesiredCapabilities(); //指定测试设备的名称 desiredCapabilities.setCapability("deviceName", "JQYNW18C12004061"); //添加操作系统配置 desiredCapabilities.setCapability("platformName", "Android"); //添加操作系统版本设置 desiredCapabilities.setCapability("platformVersion", "9"); //指定想要测试应用的包名 desiredCapabilities.setCapability("appPackage", "com.hlzt.commercial"); //指定想要测试应用的入口activity desiredCapabilities.setCapability("appActivity", "com.hlzt.flutter_commercial_app.MainActivity"); //2.创建驱动...URL是appium的固定地址;指定appium通讯的地址,将相对应的配置传入到驱动里边 AndroidDriver androidDriver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),desiredCapabilities); //加线程等待 Thread.sleep(5000); //退出 // androidDriver.quit(); } }
如果不报错,并且通过真机看到软件打开。证明你相当于,执行了java中的hello world的一步。
app自动化已经向你敞开了大门,接下来只需要完成一点点代码就OK了
4.接下来我开始分析我的APP步骤,你可以通过借鉴我的思路来分你的要测试的APP步骤
1.进入之后是3张广告业,需要向右滑动。
2.第三张广告业需要点击图片进入APP默认界面。
3.点击APP默认界面的“消息”按钮,进入登录页面(不要问为啥这么设计,老板喜欢,干就完了)
4.点击登录注册按钮
5.点击其他登录文字
6.点击账号密码登录文字
7.输入账号密码
8.点击登录
9登录成功进入主页,确认主页进入正确
10.退出
5.好我们一步一个坎的往下走
第一步 3张广告业,需要向右滑动
第一个坑。由于appium Java-client 新版本不支持swipe,所以没有官方API来管滑动 WTF
还好网上大神多,查询到代码,使用后好使 出处:https://www.cnblogs.com/tianyumuhe/p/9123350.html

package com.toolkit; import java.time.Duration; import io.appium.java_client.TouchAction; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.touch.WaitOptions; import io.appium.java_client.touch.offset.PointOption; public class Swipe { static Duration duration=Duration.ofSeconds(1); //向上滑动 public void swipeToUp(AndroidDriver driver) { int width = driver.manage().window().getSize().width; int height = driver.manage().window().getSize().height; TouchAction action1=new TouchAction(driver).press(PointOption.point(width/2, height*3/4)).waitAction(WaitOptions.waitOptions(duration)) .moveTo(PointOption.point(width/2, height/4)).release(); action1.perform(); } //向下滑动 public void swipeToDown(AndroidDriver driver) { int width = driver.manage().window().getSize().width; int height = driver.manage().window().getSize().height; TouchAction action2=new TouchAction(driver).press(PointOption.point(width/2, height/4)).waitAction(WaitOptions.waitOptions(duration)) .moveTo(PointOption.point(width/2, height*3/4)).release(); action2.perform(); } //向左滑动 public void swipeToLeft(AndroidDriver driver) { int width = driver.manage().window().getSize().width; int height = driver.manage().window().getSize().height; TouchAction action3=new TouchAction(driver).press(PointOption.point(width*3/4, height/2)).waitAction(WaitOptions.waitOptions(duration)) .moveTo(PointOption.point(width/4,height/2)).release(); action3.perform(); } //向右滑动 public void swipeToRight(AndroidDriver driver) { int width = driver.manage().window().getSize().width; int height = driver.manage().window().getSize().height; TouchAction action4=new TouchAction(driver).press(PointOption.point(width / 4, height / 2)).waitAction(WaitOptions.waitOptions(duration)) .moveTo(PointOption.point(width*3/4,height/2)).release(); action4.perform(); } }
然后循环2次,进入到最后一个广告业,一定要有sleep,让系统缓一会

for(int i = 0 ; i<2; i++){ swipe.swipeToLeft(androidDriver); Thread.sleep(2000); }
第二步,第三张广告业需要点击图片进入APP默认界面
第二个坑:一整张广告业没有ID XPATH也没法用。因为整个屏幕就是一个图片,点击这个图片才能进入首页
解决办法:使用className定位:androidDriver.findElementByClassName("android.widget.ImageView").click();
可算点击图片好使了。
第三步.点击APP默认界面的“消息”按钮,进入登录页面(不要问为啥这么设计,老板喜欢,干就完了)
还没开始就遇到坑。因为会弹出系统弹窗提示问你是不是,同意APP使用相机,使用文件等等
这里经过我百般考证最后解决办法:androidDriver.switchTo().alert().accept(); 出处http://www.cnblogs.com/xiaoxi-3-/
终于关闭了系统弹窗。
第四步。第五步。第六步一起说了。因为是三个相同的内容
逻辑就是定位到手机元素位置。然后点击他
使用的定位方法是xpath,关于XPATH的用法可以参考https://www.cnblogs.com/cnkemi/p/9180525.html 和selenium大同小异
大概的样子就是这个格式:androidDriver.findElementByXPath("//*[contains(@content-desc,'登录/注册')]").click();
这里有一个好用的tip就是
第七步:7.输入账号密码
这里遇到了一个惊天深坑,看起来平平淡淡,但是无法解决:我无法使用sendkey向输入框内输入任何数据
然后我开始填坑之旅:根据百度查询
1.加一个clear动作,把输入框里的原始内容删除就好了-----------------失败
2.有时候clear动作不好使,可以手动写一个方法进行删除-------------失败
3.在输入之前点击一下,我就是这么正好的------------------------------失败
4.使用安卓自带的定位方式:uiautomator,来定位就好了,我又找jar,又学习如何写,-------------失败
5.把uiautomator改成uiautomator2就好了---------------------------失败
6.卸载华为自带的百度输入法,就好了-------------------------失败
7.问其他公司同事,发现他们从来遇到过这个问题--------------失败
最后我实在是没招了,我合计用一下别的APP看看是不是都这样,还就只是我这个APP这样。
选择飞猪------------登录页面在模拟器无法加载出来,应该是保护模式
选择学而思----------好使!!!!好使!!!!好使!!!!好使!!!!
最终结果是:是因为我测试的软件的开发语言是flutter,虽然可以在安卓手机上安装这个软件。但是本质上他不是android语言开发的。所以导致。无法在输入框输入内容
这里我要表扬一下学而思APP的安卓开发和他们的开发领导,代码写的是真的好,清晰明了,每一个元素都有ID,我之前一直在粪坑蝶泳,突然发现这么好的代码习惯,让我感觉到原来还真的有写的好的APP,爱了。
所以接下来自动化的测试工作我打算放在学而思了
而且就当我已经登录成功了。接下来会开新章进行下面的尝试工作
说一个飞猪让我学习的新知识点
他们的软件下面的
在定位的时候非常不好定位,隐藏的非常深而且是嵌套。
而且他们的ID都是:com.taobao.trip:id/fixed_bottom_navigation_icon
所以需要吧这些ID保存成list然后选择某一个进行点击
实现方法是
ArrayList<AndroidElement> eleList = new ArrayList<AndroidElement>();
eleList = (ArrayList<AndroidElement>) androidDriver.findElementsById("com.taobao.trip:id/fixed_bottom_navigation_icon");
eleList.get(3).click();
不能直接androidDriver.findElementsById("com.taobao.trip:id/fixed_bottom_navigation_icon").get(3).click;这样会报错