页面驱动(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'))