【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();
     }
相关推荐
测试秃头怪1 天前
Python测试框架Pytest的参数化
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
小旭95271 天前
软件测试核心知识整合(ADB 命令 + Monkey 测试 + 测试流程与工具)
测试工具·adb·压力测试
Wpa.wk1 天前
性能测试 - 性能监控命令top,ps
java·经验分享·测试工具
AI_56781 天前
Postman接口测试极速入门指南
开发语言·人工智能·学习·测试工具·lua
潘晓可1 天前
Bruno(Postman平替):开源 API 测试工具实用指南
测试工具·postman
zuozewei1 天前
7DGroup 开源 AI SSE 流式输出性能测试工具
人工智能·测试工具·开源
卓码软件测评1 天前
第三方软件确认测试机构【性能测试中内存泄漏的迹象:如何利用LoadRunner监控和发现 】
测试工具·ci/cd·性能优化·单元测试·测试用例
未定义.2211 天前
第7篇:跨端拓展!Playwright+Appium实现Web+移动端全覆盖
python·ui·appium·自动化·jenkins·pytest
CeshirenTester1 天前
从Selenium到Playwright:快速入门指南
selenium·测试工具
firstacui1 天前
Tcpdump使用指南
网络·测试工具·tcpdump