• app自动化测试---用户登录自动化


    1.场景

    用户输入不同的token进行登录操作,分别有三种不同的结果。

    这三种结果操作步骤都一样,只是输入的数据不一致。

    当用户登录成功之后:元素中登录成功提示 获取不到,登录成功使用的是 Android中的一个 Toast 组件。

    当用户登陆失败之后:元素中的失败提示获取不到,我们可以截图然后使用图片识别,识别出图片里面的内容,进行判断

    图片识别api参考:https://cloud.tencent.com/act/event/ocrdemo

    2.代码

    """
      pytest 的配置文件
    """
    import os
    import pytest
    from appium import webdriver
    from appium.webdriver.webdriver import WebDriver
    
    chromedriver= os.path.join(os.path.dirname(os.path.abspath(__file__)),'driver/chrome/75.0.3770.140/chromedriver.exe')
    
    # @pytest.fixture(scope="session",autouse=True)    autouse=True 表示默认执行
    @pytest.fixture(scope="session",autouse=True)
    def driver():
        print("在所有的测试用例执行之前创建driver")
        desired_caps = {
            'platformName': 'Android',                  # 测试Android系统
            'platformVersion': '7.1.2',                 # Android版本 可以在手机的设置中关于手机查看
            'deviceName': '127.0.0.1:62001',            # adb devices 命令查看  设置为自己的设备
            'automationName': 'UiAutomator2',           # 自动化引擎
            'noReset': True,                            # 不要重置app的状态
            'fullReset': False,                         # 不要清理app的缓存数据
            'chromedriverExecutable': chromedriver,     # chromedriver 对应的绝对路径
            'appPackage': "org.cnodejs.android.md",     # 应用的包名
            'appActivity': ".ui.activity.MainActivity"  # 应用的活动页名称
        }
        driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_capabilities=desired_caps)
        driver.implicitly_wait(5)   # 全局的隐式等待时间
        yield driver                # 将driver 传递出来,写测试用case的时候,方法中直接传入driver,即可调用
        print("执行所有的用例执行之后的操作")
    
    
    @pytest.fixture(scope="function",autouse=True)
    def func_run(driver:WebDriver):
        yield
        # 用例执行完成之后清除app的数据
        driver.reset()
        # 启动app
        # driver.start_activity(app_package="org.cnodejs.android.md",app_activity=".ui.activity.MainActivity")
    import os
    import time
    
    import pytest
    from appium.webdriver.webdriver import WebDriver
    
    test_data=[("d1563473-1f0d-4307-9774-6c2ff49c93ab",True,'登录成功'),
               ("d1563473-1f0d-4307-9774-6c2ff49c93a",False,'Access Token 认证失败'),
               ("d134567",False,"Access Token 格式错误")]
    
    
    # py_driver:WebDriver  调用conftest.py 文件中定义的py_driver,并指定类型为WebDriver
    @pytest.mark.parametrize("token,status,excpet_val",test_data)
    def test_user_login(driver:WebDriver,token,status,excpet_val):
        """
        测试用户登陆成功
        :param driver:
        :return:
        """
        toggle_but = driver.find_element_by_android_uiautomator('resourceId("org.cnodejs.android.md:id/toolbar").childSelector(new UiSelector().className("android.widget.ImageButton"))')
        toggle_but.click()
        time.sleep(1)
    
        # 点击头像
        avatar = driver.find_element_by_android_uiautomator('text("点击头像登录").resourceId("org.cnodejs.android.md:id/tv_login_name")')
        avatar.click()
    
        # 输入accesstoken
        accesstoken = driver.find_element_by_id('org.cnodejs.android.md:id/edt_access_token')
        accesstoken.send_keys(token)
    
        # 点击登录按钮
        loginbtn = driver.find_element_by_android_uiautomator(
            'text("登录").resourceId("org.cnodejs.android.md:id/btn_login")')
        loginbtn.click()
    
        if status == True:
            # 获取toast文本值
            toast = driver.find_element_by_xpath('//android.widget.Toast')
            print('登录信息:', toast.text)
            assert toast.text == excpet_val
        else:
            # TODO 编写失败的断言
            # 获取报错信息
            ele = driver.find_element_by_android_uiautomator('resourceId("org.cnodejs.android.md:id/edt_access_token")')
            print("登录结果:", ele.text)
    
            # 截图并保存至文件夹下
            dir = os.path.abspath(os.path.join(os.getcwd(), "../../"))
            image_url = os.path.join(dir, 'image')
            print('图片路径:',image_url)
    
            # 获取当前日期
            new_time_day = time.strftime('%Y-%m-%d')
            new_time_day_url = os.path.join(image_url, new_time_day)
            print('图片路径:',new_time_day_url)
    
            # 判断文件夹是否存在,不存在则创建一个
            if os.path.exists(new_time_day_url) == False:
                os.mkdir(new_time_day_url)
    
            # 获取当前时分秒作为截图的图片名称
            time_s = time.strftime('%H_%M_%S')
            url = os.path.join(image_url, new_time_day)
    
            ele.screenshot(url+'/'+time_s+'.png')    # 截图

    截图:

  • 相关阅读:
    类别的三个作用
    require()
    commonJS
    ng-app&data-ng-app
    《css网站布局实录》(李超)——读书札记
    高性能JS(读书札记)
    两个同级div重叠的情况
    前端性能优化
    正则表达式
    ajax
  • 原文地址:https://www.cnblogs.com/Z-Queen/p/14945316.html
Copyright © 2020-2023  润新知