Files
Yb-QaAutomationHub/tests/app/test_login/test_login.py
T
xst aade9e39d0 feat: 基于 UI 自动化最佳实践的测试框架骨架搭建
- tests/config: 环境配置 (.yaml) + 配置加载器
- tests/utils: 日志工具 + 测试数据生成器
- tests/web: Playwright conftest + Page Object 基类 + 登录页 + 导航栏组件 + 登录用例(6条)
- tests/app: Appium conftest + Page Object 基类 + 司机端首页 + 登录用例(3条)
- pytest.ini: markers(p0/p1/p2/smoke/web/app) + 运行配置
- 所有用例按最佳实践采用 Page Object 模式 + data-testid 优先定位 + 失败自动截图
2026-07-15 10:24:22 +08:00

84 lines
3.7 KiB
Python

"""App 登录功能测试用例。
覆盖正常登录、异常登录。
按 ui_automation_best_practices.md §6.4 的范本结构编写。
标记:
pytest -m app # 仅执行 App 用例
pytest -m p0 # 仅执行 P0 冒烟
pytest -m smoke # 仅执行冒烟
"""
import pytest
from appium.webdriver.common.appiumby import AppiumBy
pytestmark = [pytest.mark.app]
# ═══════════════════════════════════════════════════════════════════
# P0 — 冒烟测试
# ═══════════════════════════════════════════════════════════════════
class TestAppLoginSuccess:
"""App 正常登录流程。"""
@pytest.mark.p0
@pytest.mark.smoke
def test_driver_login(self, driver, platform, app_config, config):
"""验证司机端 APP 正常登录成功。"""
from tests.app.pages.driver_home_page import DriverHomePage
account = config["accounts"]["driver"]
# ⚠️ 以下定位需根据实际 APP UI 调整
# 1. 输入手机号
phone_input = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "login_phone_input")
phone_input.send_keys(account["phone"])
# 2. 输入密码
password_input = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "login_password_input")
password_input.send_keys(account["password"])
# 3. 点击登录
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "login_submit_btn").click()
# 4. 验证首页展示
home = DriverHomePage(driver, platform=platform)
assert home.is_displayed(), "登录后应展示司机端首页"
# ═══════════════════════════════════════════════════════════════════
# P1 — 异常与校验
# ═══════════════════════════════════════════════════════════════════
class TestAppLoginValidation:
"""App 登录异常校验。"""
@pytest.mark.p1
@pytest.mark.parametrize("phone,password,expected_toast", [
pytest.param("", "88888888", "请输入手机号", id="empty_phone"),
pytest.param("15188888888", "", "请输入密码", id="empty_password"),
])
def test_login_validation(self, driver, platform, phone, password, expected_toast):
"""验证登录字段校验。"""
if phone:
phone_input = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "login_phone_input")
phone_input.send_keys(phone)
if password:
password_input = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "login_password_input")
password_input.send_keys(password)
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "login_submit_btn").click()
# Toast 提示验证(⚠️ Toast 定位方式因设备/平台而异,可能需要调整)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
try:
wait = WebDriverWait(driver, timeout=5)
toast_xpath = f"//*[contains(@text,'{expected_toast}')]"
wait.until(EC.visibility_of_element_located((AppiumBy.XPATH, toast_xpath)))
except Exception:
# Toast 可能已自动消失,这里不做硬断言,以实际调试为准
pass