【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();
     }
相关推荐
小码哥说测试2 小时前
接口测试用例设计的关键步骤与技巧解析!
自动化测试·测试工具·jmeter·职场和发展·测试用例·接口测试·postman
awonw17 小时前
[java][框架]springMVC(1/2)
测试工具·postman
迃幵chen1 天前
wireshark-网络分析工具
网络·测试工具·wireshark
孤蓬&听雨1 天前
RabbitMQ自动发送消息工具(自动化测试RabbitMQ)
分布式·测试工具·自动化·rabbitmq·自动发送消息
土小帽软件测试1 天前
jmeter基础01-2_环境准备-Mac系统安装jdk
java·测试工具·jmeter·macos·软件测试学习
qq_433716951 天前
测试分层:减少对全链路回归依赖的探索!
自动化测试·软件测试·功能测试·测试工具·回归·pytest·postman
qq_433716951 天前
Postman断言与依赖接口测试详解!
自动化测试·软件测试·功能测试·测试工具·mysql·接口测试·postman
如光照1 天前
Linux与Windows中的流量抓取工具:wireshark与tcpdump
linux·windows·测试工具·网络安全
土小帽软件测试1 天前
jmeter基础03_汉化jmeter界面
测试工具·jmeter·软件测试学习
学知识拯救世界1 天前
appium启动 install driver安装驱动
appium