1.场景
用户输入不同的token进行登录操作,分别有三种不同的结果。
这三种结果操作步骤都一样,只是输入的数据不一致。
当用户登录成功之后:元素中登录成功提示 获取不到,登录成功使用的是 Android中的一个 Toast 组件。
当用户登陆失败之后:元素中的失败提示获取不到,我们可以截图然后使用图片识别,识别出图片里面的内容,进行判断
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') # 截图
截图: