PO模式

介绍

PO是Page Object(⻚⾯对象),将⾃动化涉及的⻚⾯或模块封装成对象,是一种思想。

解决的问题:

  1. 解决代码冗余
  2. 便于维护(脚本层与业务分离)-- 如果元素信息发⽣变化了,也不⽤去修改脚本。

非PO代码实现

# 非po模式实现登录
import time

from selenium import webdriver
from selenium.webdriver.common.by import By


class TestLogin:
    def setup_class(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get("http://127.0.0.1/Home/user/login.html")
        self.driver.implicitly_wait(10)


    def teardown_class(self):
        time.sleep(4)
        self.driver.quit()

    def test_login(self):
        # 在用户名输入框中输入13600000001
        # driver.find_element(By.ID,"username").send_keys("13600000001")
        self.driver.find_element(By.XPATH, "//*[contains(@placeholder,'手机号')]").send_keys("13600000001")

        # 在密码输入框输入123456
        # driver.find_element(By.ID,"password").send_keys("123456")
        self.driver.find_element(By.XPATH, "//*[contains(@placeholder,'密码')]").send_keys("123456")

        # 在验证码输入框输入8888
        # driver.find_element(By.ID,"verify_code").send_keys("8888")
        self.driver.find_element(By.XPATH, "//*[contains(@placeholder,'验证')]").send_keys("8888")

        # 点击登录按钮
        self.driver.find_element(By.XPATH, "//*[@name='sbtbutton']").click()

PO设计

以登录为例介绍PO模式,其中

  1. base: 存放所有Page页面公共方法
  2. page: 将页面封装为对象
  3. script: 测试脚本

image-20251223125210458

base

base.py:分析要实现页面公共方法

'''
    存放所有page页面的公共方法
'''
from selenium.webdriver.support.wait import WebDriverWait


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

    # 查找元素
    def base_find(self, loc, timeout = 10, poll_frequency = 0.5):
        # 采用显示等待的方法获取元素
        # 显示等待 -> 查找元素  loc = (By.ID,"userA")  *loc=loc[0],loc[1]
        el = WebDriverWait(self.driver,timeout,poll_frequency).until(lambda x:x.find_element(loc[0],loc[1]))
        return el

    # 输入方法
    def base_input(self,loc,value):
        # 1.获取元素
        el = self.base_find(loc)
        # 2.清空
        el.clear()
        # 3.输入
        el.send_keys(value)

    # 点击方法
    def base_click(self,loc):
        # 先找到元素再点击
        self.base_find(loc).click()

    # 获取元素文本方法
    def base_get_text(self,loc):
        # 先找到元素再获取
        return self.base_find(loc).text

page

page_login.py:

'''
模块名:page_模块单词
类名;大驼峰形式,去掉下划线和数字
方法:自动化测试中要用到哪些元素就封装哪些方法
'''
from selenium.webdriver.common.by import By

from base.base import Base

# 配置信息
username = (By.XPATH, "//*[contains(@placeholder,'手机号')]")

pwd = (By.XPATH,"//*[contains(@placeholder,'密码')]")

code = (By.XPATH,"//*[contains(@placeholder,'验证')]")

login_btn = (By.XPATH,"//*[@name='sbtbutton']")

nickname = (By.CSS_SELECTOR,".userinfo")

class PageLogin(Base):
    # 输入用户名
    def page_username_input(self,value):
        self.base_input(username,value)

    # 输入密码
    def page_pwd_input(self,value):
        self.base_input(pwd,value)

    # 输入验证码
    def page_code_input(self,value):
        self.base_input(code,value)

    # 点击登录
    def page_clink_button(self):
        self.base_click(login_btn)

    # 获取昵称
    def page_nickname(self):
        self.base_get_text(nickname)

    # 为了测试业务的时候方便,需要有组合业务
    def page_test_login(self,phone,password,code2):
        self.page_username_input(phone)
        self.page_pwd_input(password)
        self.page_code_input(code2)
        self.page_clink_button()

script

test01_login.py:

import time

from selenium import webdriver

from page.page_login import PageLogin


class TestLogin:
    def setup_class(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get("http://127.0.0.1/Home/user/login.html")
        self.login = PageLogin(self.driver)

    def teardown_class(self):
        self.driver.quit()

    def test01_login(self,phone="13600000001",password="123456",code2="8888"):
        # 调用page_login里面的page_test_login方法来进行测试
        self.login.page_test_login(phone,password,code2)
        # 断言
        nickname = self.login.page_nickname()
        print("nickname:", nickname)
posted @ 2025-12-23 13:03  蜀道,难  阅读(2)  评论(0)    收藏  举报