从零学习安卓自动化(java+appium方向):如何使用java进行手机操作(三)


我的目标是打开我的软件,

输入账号密码

登录成功

退出成功

 

第一步打开我的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();
    }

}
启动APP函数

 如果不报错,并且通过真机看到软件打开。证明你相当于,执行了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();
    }

}
View Code

然后循环2次,进入到最后一个广告业,一定要有sleep,让系统缓一会

            for(int i = 0 ; i<2; i++){
            
                swipe.swipeToLeft(androidDriver);
            
            Thread.sleep(2000);
            
        }
循环2次

第二步,第三张广告业需要点击图片进入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;这样会报错

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM