Skip to content

第 8 课:Selenium 进阶——PO 模式 + 框架

一、为什么需要 PO 模式

没有 PO:元素定位散落在各处,ID 变了要改几十处。

PO 模式:一个页面 = 一个类,元素和方法都封装在类里。

二、BasePage 基类

python
class BasePage:
    def __init__(self, driver):
        self.driver = driver
        self.wait = WebDriverWait(driver, 10)

    def find_element(self, locator):
        return self.wait.until(EC.visibility_of_element_located(locator))

    def click(self, locator):
        self.wait.until(EC.element_to_be_clickable(locator)).click()

    def input_text(self, locator, text):
        el = self.find_element(locator)
        el.clear()
        el.send_keys(text)

三、登录页面

python
class LoginPage(BasePage):
    USERNAME = (By.ID, "username")
    PASSWORD = (By.ID, "password")
    LOGIN_BTN = (By.ID, "login-btn")

    def login(self, username, password):
        self.input_text(self.USERNAME, username)
        self.input_text(self.PASSWORD, password)
        self.click(self.LOGIN_BTN)

四、测试用例

python
def test_login_success(driver):
    LoginPage(driver).login("admin", "123456")
    assert "首页" in driver.title

五、数据驱动 + PO

python
@pytest.mark.parametrize("user,pwd", [
    ("admin", "123456"), ("admin", "wrong")
])
def test_login(driver, user, pwd):
    LoginPage(driver).login(user, pwd)
    # 断言...

六、项目结构

ui_test_project/
├── page_objects/base_page.py
├── page_objects/login_page.py
├── tests/conftest.py
├── tests/test_login.py
└── config/config.yaml
💬 给清秀留言