1.框架搭建

app的框架搭建跟web端的搭建是一样的,首先还是不需要一步做到位,把先需要的东西写出来,流程跑通后,再去优化,补充框架搭建搭建的内容,具体过程就不详细介绍了,可以参照web自动化测试框架UI自动化测试介绍_晒不黑的黑煤球的博客-CSDN博客_ui自动化测试

2.编写自动化测试用例

根据编写的测试用例,进行代码编写,如登录功能

步骤:

  1. 启动app (可以放到夹具中,启动app放到前置,关闭app放到后置)
  2. 点击我的柠檬 id=com.lemon.lemonban:id/navigation_my
  3. 点击头像登录 id=com.lemon.lemonban:id/fragment_my_lemon_avatar_title
  4. 输入手机号码  id=com.lemon.lemonban:id/et_mobile
  5. 输入密码 id=com.lemon.lemonban:id/et_password
  6. 点击登录按钮 id=com.lemon.lemonban:id/btn_login
  7. 断言:手机号码格式不正确(登录失败)/登录后的头像文本=雨泽 id=com.lemon.lemonban:id/fragment_my_lemon_avatar_title(登录成功)

新建conftest.py代码如下:

import pytest
from appium.webdriver import Remote


def get_driver():
    """"启动app"""
    caps = {"platformName": "Android",
            "udid": "emulator-5554",
            "appPackage": "com.lemon.lemonban",
            "appActivity": ".activity.WelcomeActivity",
            "chromedriverExecutableDir": "E:\driver"
            }
    driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',
                    desired_capabilities=caps)
    # 设置隐性等待
    driver.implicitly_wait(10)
    return driver


@pytest.fixture(name='app')  # 设置别名代替init_app
def init_app():
    """启动app"""
    d = get_driver()
    yield d
    d.quit()

新建nativepage.py代码如下:

from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as when


class NativePage:
    def __init__(self, driver):
        self.driver = driver

    def click(self, locator):
        """点击"""
        wait = WebDriverWait(self.driver, timeout=5)
        condition = when.element_to_be_clickable(locator)
        element = wait.until(condition)
        ActionChains(self.driver).click(element).perform()

    def type(self, locator, words):
        """输入"""
        el = self.driver.find_element(*locator)
        el.send_keys(words)

    def get_toast_text(self):
        """获取错误信息"""
        toast = self.driver.find_element('xpath', '//android.widget.Toast')
        return toast.text

    def get_avatar_title(self):
        """获取登录后的头像名称"""
        title = self.driver.find_element('id', 'com.lemon.lemonban:id/fragment_my_lemon_avatar_title')
        return title.text

新建test_login.py代码如下:

from pages.native_page import NativePage


def test_login_failed(app):
    """登录失败"""
    page = NativePage(app)
    # 点击我的柠檬
    locator_my = ('id', 'com.lemon.lemonban:id/navigation_my')
    # 点击头像
    page.click(locator_my)
    locator_avatar = ('id', 'com.lemon.lemonban:id/fragment_my_lemon_avatar_title')
    page.click(locator_avatar)
    # 输入账号
    locator_mobile = ('id', 'com.lemon.lemonban:id/et_mobile')
    page.type(locator_mobile, '123')
    # 输入密码
    locator_pwd = ('id', 'com.lemon.lemonban:id/et_password')
    page.type(locator_pwd, '123')
    # 点击登录按钮
    locator_login = ('id', 'com.lemon.lemonban:id/btn_login')
    page.click(locator_login)
    # 断言
    assert page.get_toast_text() == '手机号码格式不正确'


def test_login_success(app):
    """登录成功"""
    page = NativePage(app)
    # 点击我的柠檬
    locator_my = ('id', 'com.lemon.lemonban:id/navigation_my')
    # 点击头像
    page.click(locator_my)
    locator_avatar = ('id', 'com.lemon.lemonban:id/fragment_my_lemon_avatar_title')
    page.click(locator_avatar)
    # 输入账号
    locator_mobile = ('id', 'com.lemon.lemonban:id/et_mobile')
    page.type(locator_mobile, '18173179913')
    # 输入密码
    locator_pwd = ('id', 'com.lemon.lemonban:id/et_password')
    page.type(locator_pwd, '179913')
    # 点击登录按钮
    locator_login = ('id', 'com.lemon.lemonban:id/btn_login')
    page.click(locator_login)
    # 断言
    assert page.get_avatar_title() == '雨泽'

新建run.py代码如下:

import pytest

pytest.main(['--alluredir=output'])

 运行结果:

总结:

  • 夹具可以设置别名,设置别名后调用别名即可
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐