【appium】app特殊手势操作、滑动 |殊场景元素定位、toast元素、不定时弹窗 Popups

目录

一、手势操作------滑动

1、实战示例:向上滑动

[1.2 应用:滑动停止判断](#1.2 应用:滑动停止判断)

问题:怎么判断加载完成,不能一直没停止的滑动呀,怎么停止滑动呢

二、特殊场景元素定位

1、toast元素定位

获取方式:

[toast定位实例:(显示等待 等待元素存在:presenceOfElementLocated)](#toast定位实例:(显示等待 等待元素存在:presenceOfElementLocated))

[⚠️在我们等待元素可见的时候,不要用 visibility_of_element_located,因为它对 Toast 的可见处理并不支持,会直接报错命令无法执行。](#⚠️在我们等待元素可见的时候,不要用 visibility_of_element_located,因为它对 Toast 的可见处理并不支持,会直接报错命令无法执行。)

「也就是等待的时候,要用元素存在的条件------presenceOfElementLocated。不能用元素可见的条件。」

[2、不定时弹窗 Popups](#2、不定时弹窗 Popups)

解决方案:

实例:


说明:以下均以java示例

一、手势操作------滑动

1、实战示例:向上滑动

java 复制代码
/**
     * 向上滑动
     * @param seconds 滑动时长 秒级
     */
    public static void SlideUp(int seconds) {
        //滑动
        int height = driver.manage().window().getSize().height;
        int width = driver.manage().window().getSize().width;
        //定位开始滑动的位置
      //⚠️每个app滑动的开始滑动和结束滑动的相对位置不一样,有的是1/4有的是1/5有的是1/7,需要试
        PointOption startPoint = PointOption.point(width/2,height*3/4);
        PointOption endPoint = PointOption.point(width/2,height/4);
​
        TouchAction action = new TouchAction(driver);
        //⚠️如果滑动操作很快,就不起滑动操作,需要慢一点滑动
        //不设置滑动时长 没有滑动的效果
        //action.press(startPoint).moveTo(endPoint).release().perform();
        //设置滑动时长
        //⚠️配置问题:Duration需要maven1.8
        WaitOptions wait = WaitOptions.waitOptions(Duration.ofSeconds(seconds));
        //从startPoint 滑动到 endPoint 需要 wait时间
        action.press(startPoint).waitAction(wait).moveTo(endPoint).release().perform();
    }
​

1.2 应用:滑动停止判断

问题:怎么判断加载完成,不能一直没停止的滑动呀,怎么停止滑动呢

------方法一:判断加载后的pagesource是否包含"全部加载完成",如果出现了,跳出滑动的循环

------方法二: 判断页面源过码是否有变化,如果有变化证明还在加载新的内容

java 复制代码
//滑动问题:怎么判断加载完成,不能一直没停止的滑动呀,怎么停止滑动呢
解决方法一:判断加载后的pagesource是否包含"全部加载完成",如果出现了,跳出滑动的循环
        while (true){
//            String pageSource1 = driver.getPageSource();
//            if(pageSource1.contains("全部加载完成")){
//                break;
//            }
            滑动前后/或者滑动之后加一个判断
            SlideUp(2);
            String pageSource2 = driver.getPageSource();
            if(pageSource2.contains("全部加载完成")){
                break;
            }
        }
解决方法二: 判断页面源过码是否有变化,如果有变化证明还在加载新的内容,
        //如果滑动前和滑动后源码一致,说明已经到最底,没有新的内容加载停止滑动。
        while (true){
            String beforePageSource = driver.getPageSource();
            SlideUp(2);
            //防止无效滑动,所以等2秒,滑2秒 等2秒
            Thread.sleep(2000);
            String afterPageSource = driver.getPageSource();
            if(beforePageSource.equals(afterPageSource)){
                break;
            }
        }

二、特殊场景元素定位

1、toast元素定位

Android中的Toast是一种简易的消息提示框。 当视图显示给用户,在应用程序中显示为浮动。和Dialog不一样的是,它永远不会获得焦点,无法被点击。

获取方式:

//匹配所有的元素,找对应的text属性值中有包含tips关键字

java 复制代码
androidDriver.findElement(MobileBy.xpath("//*[contains(@text, 'tips')]"));
​
等同于
​
androidDriver.findElement(MobileBy.xpath("//*[@text='tips')]"));
toast定位实例:(显示等待 等待元素存在:presenceOfElementLocated)
⚠️在我们等待元素可见的时候,不要用 visibility_of_element_located,因为它对 Toast 的可见处理并不支持,会直接报错命令无法执行。
「也就是等待的时候,要用元素存在的条件------presenceOfElementLocated。不能用元素可见的条件。」
java 复制代码
定位toast元素  特点:n秒后消失
          
方式一: 硬等待 Thread.sleep(3000);不好控制时长,5秒就报错了
       WebElement toast = driver.findElement(By.xpath("//*[@text=\"手机号码或密码不能为空\"]"));
       System.out.println(toast);

方式二1:显式等待 ------ elementToBeClickable等待页面元素可被单击 ------!!!无法定位
        WebDriverWait wait = new WebDriverWait(driver,5);
        WebElement toast = wait.until(ExpectedConditions
               .elementToBeClickable(By.xpath("//*[@text=\"手机号码或密码不能为空\"]")));
        System.out.println(toast);

方式二2: 显示等待 等待元素存在  可以定位 ok
        WebDriverWait wait = new WebDriverWait(driver,5);
        WebElement toast = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[contains(@text,'手机号码或密码不能为空')]")));
              //.presenceOfElementLocated(By.xpath("//*[@text=\"手机号码或密码不能为空\"]")));
        System.out.println(toast);

方式二3: 显示等待 visibilityOfElementLocated 页面元素在页面存在并且可见 ------ !!!无法定位
        WebDriverWait wait = new WebDriverWait(driver,5);
        WebElement toast = wait.until(ExpectedConditions.
                visibilityOfElementLocated(By.xpath("//*[@text=\"手机号码或密码不能为空\"]")));
        System.out.println(toast);

2、不定时弹窗 Popups

App运行时,页面不定时会有弹窗出来(评价弹窗、升级弹窗、广告弹窗、提示弹窗),如果不对其进行处理就会出现正常元素定位超时导致自动化脚本执行中断。

解决方案:

try...catch...异常捕获,正常元素定位 超时进入到异常处理机制,在其内部处理掉弹窗再继续后续的流程

try里面放正常流程 ,元素定位 catch里面放可能会引起元素抓取有问题的弹窗处理,不定时的弹窗,不定时弹窗的定位

实例:

⚠️当有好几个弹窗在每次重启app的时候弹出的话,可以设置⚠️记录app用户信息,使其不去重置

java 复制代码
capabilities.setCapability("noReset", true);
java 复制代码
//try里面放正常流程
//catch里面放可能会引起元素抓取有问题的弹窗处理,不定时的弹窗
 try {
         driver.findElementByXPath("//*[@text=\"天猫新品\"]").click();
}catch (Exception e) {
         driver.findElementByXPath("//*[@text=\"同意\"]").click();
         Thread.sleep(1000);
         driver.findElementByXPath("//*[@text=\"同意\"]").click();
         Thread.sleep(1000);
         driver.findElementByXPath("//*[@text=\"好的\"]").click();
         Thread.sleep(1000);
         driver.findElementByXPath("//*[@text=\"天猫新品\"]").click();
     }
相关推荐
yinshuilan34 分钟前
第2节-Test Case如何调用Object Repository中的请求并关联参数
测试工具
互联网杂货铺2 小时前
Postman接口测试:全局变量/接口关联/加密/解密
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·postman
waicsdn_haha2 小时前
Postman最新详细安装及使用教程【附安装包】
测试工具·api·压力测试·postman·策略模式·get·delete
美团测试工程师13 小时前
Postman接口测试工具使用详解
测试工具·postman
测试杂货铺15 小时前
如何用postman做接口自动化测试及完美的可视化报告?
自动化测试·软件测试·测试工具·职场和发展·jenkins·压力测试·postman
一二小选手16 小时前
Postman接口测试工具
java·测试工具·postman
测试老哥20 小时前
Jmeter测试脚本编写技巧
自动化测试·软件测试·功能测试·测试工具·jmeter·职场和发展·性能测试
爱学测试的李木子21 小时前
从0到1搭建 Android 自动化 python+appium 环境
android·软件测试·python·测试工具·自动化
霍格沃兹测试开发学社测试人社区1 天前
软件测试丨性能测试工具-JMeter
软件测试·测试开发·测试工具·jmeter·性能测试
小张认为的测试1 天前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试