一、定义:
PageObject,即页面对象。PO设计模式,是selenium中一种重要的设计模式。
二、原理:
就是把一个页面中的所有页面元素和页面操作,封装成一个页面类,这样在测试用例类中。只负责手工测试的业务逻辑。所以,要将原来的测试用例类拆分成page和case两部分。
三、作用:
如果前端页面发生变化,在某一个页面中,有某个页面元素的定位也随之发生变化。如果在几十甚至几百个测试用例中,都用到了这个页面元素,这样代码无法修改,PO的设计解决了这个问题
四、总结:
1、case
只包含测试用例方法,对该方法进行数据驱动测试。
每一行代码,对应一个操作
2、 page
- 元素定位:声明一个包含两个元素的元祖,存放操作方式及内容【By、Value】
login_link_loc = (By.LINK_TEXT, "登录")
- 元素操作:声明一个方法,封装对元素的操作
def click_login_link(self):
# self.driver.find_element(By.LINK_TEXT, "登录").click()
# find_element()需要接受两个参数by和value.但是login_link_loc只是一个元组,是一个参数
self.driver.find_element(*self.login_link_loc).click()
- 构造方法:接受测试用例类,传入浏览器,并和测试用例类使用同一浏览器
def __init__(self, driver):
self.driver = driver
五、代码结构:
(一)base_testcase类包
import time
import unittest2
from selenium import webdriver
class BaseTestCase(unittest2.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(5)
def tearDown(self):
time.sleep(20)
(二)page类包
- login_page.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from page_object.my_dash_page import MyDashPage
class LoginPage:
# login_link_loc的类型是元组,元组类似于数组
# int a[2] = {2,3}
# a = 2 和 3么?
login_link_loc = (By.LINK_TEXT, "登录")
username_input_loc = (By.ID, "loginform-identity")
password_input_loc = (By.ID, "loginform-password")
login_button_loc = (By.NAME, "login-button")
url = "https://www.xueqingyun.com/"
def __init__(self, driver):
self.driver = driver
def open(self):
self.driver.get(self.url)
def click_login_link(self):
# self.driver.find_element(By.LINK_TEXT, "登录").click()
# find_element()需要接受两个参数by和value.但是login_link_loc只是一个元组,是一个参数
self.driver.find_element(*self.login_link_loc).click()
def input_username(self, username):
self.driver.find_element(*self.username_input_loc).send_keys(username)
def input_password(self, password):
self.driver.find_element(*self.password_input_loc).send_keys(password)
def click_login_button(self):
self.driver.find_element(*self.login_button_loc).click()
return MyDashPage(self.driver)
- my_dash_page,py
from selenium import webdriver
from selenium.webdriver.common.by import By
class MyDashPage:
true_name_loc = (By.XPATH, '//*[@id="w7"]/li[2]/a')
def __init__(self, driver):
self.driver = driver
def get_ture_name(self):
return self.driver.find_element(*self.true_name_loc).text
(三)case类包
import time
import unittest2
from selenium import webdriver
from selenium.webdriver.common.by import By
from base.baseTestCase import BaseTestCase
from page_object.login_page import LoginPage
from page_object.my_dash_page import MyDashPage
class TestLogin(BaseTestCase):
def test_login(self):
lp = LoginPage(self.driver)
lp.open()
lp.click_login_link()
lp.input_username("username")
lp.input_password("111111")
# 直接在点击登录按钮后,返回一个文本,就不需要单独的类获取这个文本
mdp = lp.click_login_button()
#通过一个单独的类实现,获取返回登录后的文本
#mdp = MyDashPage(self.driver)
#断言
self.assertEqual("管理员AAA", mdp.get_ture_name())
if __name__ == '__main__':
unittest2.main()