• APP自动化测试-5.触屏操作及toast处理


    APP自动化测试-5.触屏操作及toast处理



    前言

    TouchAction主要用来模拟手机页面的触摸点击、滚动、滑动等操作,详情查看官网文档:官方文档


    一、TouchAction常用方法

    • press:按下,后面和release配合使用,否则会一直处于按下的状态
    • release:释放,通常和press配合使用
    • moveTo:移动到指定位置,通常和press+release配合使用
    • tap:点击
    • wait:等待
    • longPress:长按
    • cancel:取消
    • perform:执行

    代码示例:

    from time import sleep
    
    import pytest as pytest
    from appium import webdriver
    from appium.webdriver.common.appiumby import AppiumBy
    from appium.webdriver.common.touch_action import TouchAction
    
    
    class TestTouch:
    
        def setup(self):
            desired_caps = {
                "platformName": "android",
                "appium:deviceName": "b1f37e8e",
                "appium:appPackage": "com.jianshu.haruki",
                "appium:appActivity": "com.baiji.jianshu.ui.splash.SplashScreenActivity",
                # 添加noReset后,会记录该应用之前的操作
                "noReset": True,
                # 设置dontStopAppOnReset后,如果应用已打开,则不会关闭应用重新打开
                "dontStopAppOnReset": True,
                # 跳过安装及权限设置操作,提升执行速度
                "skipDeviceInitialization": True
            }
            self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
            # 设置隐式等待
            self.driver.implicitly_wait(3)
    
        def teardown(self):
            self.driver.quit()
    
        def test_touch(self):
            action = TouchAction(self.driver)
            # 获取屏幕的宽
            window_rect = self.driver.get_window_rect()
            width = window_rect['width']
            height = window_rect['height']
            # 使用中心点作为x坐标
            x1 = int(width/2)
            # 设置y坐标的起始点
            y_start = int(height * 9/10)
            y_end = int(height * 1/10)
            action.press(x=x1, y=y_start).wait(200).move_to(x=x1, y=y_end).release().perform()
            sleep(5)
    
        if __name__ == 'main':
            pytest.main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    二、toast识别处理

    toast是简易的消息提示框,toast特性:

    • 为了给当前视图显示一个浮动的显示块,永远不会获得焦点
    • toast类的思想:尽量不引起注意,同时又要向用户显示他们需要看到的信息
    • toast显示的时间有限,Toast会根据用户设置的显示时间显示后消失
    • toast本身是系统级的控件,它归属于系统settings,当一个app发送消息的时候,不是自己造出来的这个弹框,它是发送给系统,由系统统一进行弹框,这类控件不在app内,需要特殊的控件识别方法

    toast控件类名称:android.widget.Toast

    代码示例:

    from time import sleep
    
    import pytest as pytest
    from appium import webdriver
    from appium.webdriver.common.appiumby import AppiumBy
    from appium.webdriver.common.touch_action import TouchAction
    
    
    class TestTouch:
    
        def setup(self):
            desired_caps = {
                "platformName": "android",
                "appium:deviceName": "b1f37e8e",
                "appium:appPackage": "com.jianshu.haruki",
                "appium:appActivity": "com.baiji.jianshu.ui.splash.SplashScreenActivity",
                # 添加noReset后,会记录该应用之前的操作
                "noReset": True,
                # 设置dontStopAppOnReset后,如果应用已打开,则不会关闭应用重新打开
                # "dontStopAppOnReset": True,
                # 跳过安装及权限设置操作,提升执行速度
                "skipDeviceInitialization": True
            }
            self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
            # 设置隐式等待
            self.driver.implicitly_wait(3)
    
        def teardown(self):
            self.driver.quit()
    
        def test_toast(self):
            self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,
                                     'new UiSelector().resourceId("com.jianshu.haruki:id/iv_mine")').click()
            self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("点击登录")').click()
            self.driver.find_element(AppiumBy.ID, 'com.jianshu.haruki:id/et_account').send_keys('13000000000')
            self.driver.find_element(AppiumBy.ID, 'com.jianshu.haruki:id/et_verification_code_or_password').send_keys('112345')
            self.driver.find_element(AppiumBy.ID, 'com.jianshu.haruki:id/tv_user_cb').click()
            self.driver.find_element(AppiumBy.ID, 'com.jianshu.haruki:id/tv_login').click()
            # 打印当前页面的dom树
            print(self.driver.page_source)
            # 通过classname进行定位
            print(self.driver.find_element(AppiumBy.XPATH, "//*[@class='android.widget.Toast']").text)
            # 通过text进行定位
            print(self.driver.find_element(AppiumBy.XPATH, "//*[contains(@text, '验证码无效')]").text)
            sleep(3)
    
        if __name__ == 'main':
            pytest.main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

  • 相关阅读:
    Java学习笔记(二十一)
    JAVA基础(八)
    不清楚的照片如何变清晰?教你几招变清晰的方法
    ES6迭代器详细介绍
    HTML大学班级活动网页设计 、大学校园HTML实例网页代码 、本实例适合于初学HTML的同学
    Altair:Python数据可视化库的魅力之旅
    ubuntu子系统,挂载win10硬盘;与win10之间访问
    原生js实现图片懒加载
    全智V5+AXP233电源管理芯片调试
    gRPC:以 C++为例
  • 原文地址:https://blog.csdn.net/weixin_42517691/article/details/125855744