页面驱动page object model

本文介绍了页面驱动模型(PageObjectModel)在自动化测试中的使用,通过将页面元素和操作封装在页面对象中,提高代码复用性和维护性。示例展示了如何在Python的selenium库中实现基类`BasePage`和具体页面如`LoginPage`、`MMSPage`,以及如何在测试用例中使用这些页面对象进行登录和会员管理等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

页面驱动(Page Object Model)

页面对象(Page Object)

属性:所有在该页面的测试操作中所会用到的元素对象。比如在登录测试操作中,我们会用到用户名、密码、验证码以及登录按钮这几个页面元素,所以这几个页面元素就是登录页面这个页面对象的属性

方法:所有在该页面能执行的跟测试相关的操作,我们会封装为该页面对象的方法

使用页面对象主要目的是代码复用

测试场景:

登录:有效登录、无效登录

会员管理:需要先登录再来操作会员管理的测试

如果使用传统的测试代码编写方法(不使用PO模型)会导致两个问题:

1.代码量大,无法复用代码,代码编写效率很低

2.代码维护困难,一旦元素属性发生修改,所有涉及该元素的代码都需要改

base_page.py

class BasePage:

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

    def find_element(self,*loc):
        #loc=(id,username)
        return self.driver.find_element(*loc)

    def find_elements(self,*loc):
        return  self.driver.find_elements(*loc)

    '''
    如果有其他的基本操作,可以继续封装
    '''

login_page.py

from pages.base_page import  BasePage
from selenium.common.exceptions import NoSuchElementException


class LoginPage(BasePage):  #定义登录页面对象的属性和方法

    username=('id','username')
    password=('id','password')
    login_btn=('xpath','//input[contains(@onclick,"Login()")]')
    msg=('id','loginName')

    def login_action(self,un,pw):
        self.find_element(*self.username).send_keys(un)
        self.find_element(*self.password).send_keys(pw)
        self.find_element(*self.login_btn).click()

    def check_login_status(self):
        try:
            message=self.find_element(*self.msg).text
        except NoSuchElementException:
            print("============login failed================")
            return False
        else:
            if 'admin' in message:
                print("============文本验证成功================")
                return  True
            else:
                print("============文本验证失败================")
                return False

Myunit.py

import unittest
from selenium import  webdriver


class Myunit(unittest.TestCase):

    def setUp(self) -> None:
        self.driver=webdriver.Chrome()
        self.driver.get('http://localhost:8080/mms')

    def tearDown(self) -> None:
        self.driver.quit()

test_login.py

from common.myunit import Myunit
from pages.login_page import LoginPage

class LoginTest(Myunit):

    def test_login_success(self):
        lp=LoginPage(self.driver)
        lp.login_action('admin','admin123')

        self.assertTrue(lp.check_login_status())

    def test_login_failed(self):
        lp=LoginPage(self.driver)
        lp.login_action('','admin123')
        self.assertFalse(lp.check_login_status())

mms.py

import  unittest
import time
from selenium import  webdriver
class MMS(unittest.TestCase):
    def setUp(self) -> None:
        self.driver=webdriver.Chrome()
        self.driver.get('http://localhost:8080/mms')

    def tearDown(self) -> None:
        self.driver.quit()

    def test_login_success(self):
        self.driver.find_element('id', 'username').send_keys('admin')
        self.driver.find_element('id', 'password').send_keys('admin123')
        self.driver.find_element('xpath','//input[contains(@onclick,"Login()")]').click()
        time.sleep(2)
        result=self.driver.find_element('id','loginName').text
        self.assertTrue('admin' in result)

    def test_login_failed(self):
        self.driver.find_element('id', 'username').send_keys('')
        self.driver.find_element('id', 'password').send_keys('admin123')
        self.driver.find_element('xpath', '//input[contains(@onclick,"Login()")]').click()

mms_page.py

import time

from pages.base_page import BasePage

class MMSPage(BasePage):
    phone=("id","customerphone")
    name=("id","customername")
    add_btn=("xpath","//button[@onclick='addCustomer()']")
    search_btn=("xpath","//button[contains(@onclick,'searchCustomer')]")
    result_list=("xpath","//tbody[@id='customerlist']/tr")
    member_manage_link=('link text','会员管理')

    def goto_member_manage(self):
        self.find_element(*self.member_manage_link).click()


    def add_action(self,phone,name):  #新增会员操作
        self.find_element(*self.phone).send_keys(phone)
        self.find_element(*self.name).clear()
        self.find_element(*self.name).send_keys(name)
        self.find_element(*self.add_btn).click()

    def check_add_action(self,phone):
        self.find_element(*self.phone).clear()
        self.find_element(*self.phone).send_keys(phone)
        time.sleep(1)
        self.find_element(*self.add_btn).click()
        time.sleep(1)
        results=self.find_elements(*self.result_list)

        if results>1:
            return  True
        else:
            return  False


test_member.py

from common.myunit import Myunit
from  pages.mms_page import MMSPage
from pages.login_page import LoginPage
class Member(Myunit):

    def test_add_member_success(self):
        lg=LoginPage(self.driver)
        lg.login_action('admin','admin123','0000')
        mms=MMSPage(self.driver)
        mms.goto_member_manage()
        mms.add_btn('13277777777','tester2')
        self.assertTrue(mms.check_add_action('13277777777'))

Selenium Page Object Model(POM)是一种设计模式,主要用于自动化测试中的页面管理和操作。它将页面元素和相关的交互逻辑封装到独立的类中,让测试代码更清晰、易读且易于维护。以下是使用POM的一个简单实例: ```python # 定义Page对象,代表一个具体的页面 class LoginPage: def __init__(self, driver): self.driver = driver self.username_input = driver.find_element_by_id("username") self.password_input = driver.find_element_by_name("password") self.login_button = driver.find_element_by_css_selector(".login-button") # 登录方法 def login(self, username, password): self.username_input.clear() self.username_input.send_keys(username) self.password_input.clear() self.password_input.send_keys(password) self.login_button.click() # 在测试中使用Page对象 def test_login(): driver = webdriver.Chrome() # 初始化浏览器驱动 page = LoginPage(driver) # 创建LoginPage对象 # 执行登录操作 page.login("test_user", "test_password") # 输入用户名和密码,然后点击登录 # 检查登录后的状态... assert "Welcome" in driver.page_source driver.quit() # 关闭浏览器 # 这样,每次想要登录的时候,只需要调用page.login方法即可,不需要关心底层的DOM查找 ``` 在这个例子中,`LoginPage`类包含了对登录页所有重要元素的操作方法(如`clear`、`send_keys`和`click`)。当实际进行测试时,我们只需要关注如何使用这些方法,而无需反复寻找元素位置。这使得测试代码更具模块性和复用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值