PO模式,全称PageObject模式,即页面对象模式。将页面定位与业务操作分离。

po模式有以下几个优点:

1.易读性好

2.扩展性高

3.复用性强

4.维护性好

5.代码冗余率低

 

了解了po模式及po模式的优点,可po模式在实际项目中到底该怎么做呢?接下来我们就来看看:

在本篇中我将po模式分为三层,分别是页面定位层,页面对象层,业务逻辑层;我将对每层逐一介绍。

 

一、页面定位层:每个页面作为一个模块,将页面元素定位表达式统一存放在该页面

 例:登录页面模块部分代码如下

from selenium.webdriver.common.by import By

class LoginPageLoc:

    # 用户名输入框
    user_loc = (By.XPATH, '//input[@name="phone"]')
    # 密码输入框
    passwd_loc = (By.XPATH, '//input[@name="password"]')
    # 登陆按钮
    login_button_loc = (By.TAG_NAME, "button")
    # 错误提示框
    form_error_loc = (By.XPATH, '//div[@class="form-error-info"]')
    # 页面中dialog的提示
    dialog_error_loc = (By.XPATH, '//div[@class="layui-layer-content"]')  

 

二、页面对象层:存放每个页面对象操作

例:登录页面的登录、获取错误信息等操作

from PageLocators.login_page_loc import LoginPageLoc as loc
from Common.basepage import BasePage
# 说明,本框架对selenium库中通用的元素行为方法做了二次封装(添加日志与截图),因此继承封装后的模块basepase

class LoginPage(BasePage):
    # 元素操作 # 登录操作
    def login(self,username,passwd):
        self.input_text(loc.user_loc,username,"登录页面_用户名输入")
        self.input_text(loc.passwd_loc,passwd,"登录页面_密码输入")
        self.click_element(loc.login_button_loc,"登录页面_点击登录按钮")

    # 获取提示信息
    def get_error_msg(self):
        return self.get_element_text(loc.form_error_loc,"登录页面_表单区域错误提示")

    # 获取页面中的错误提示信息
    def get_error_msg_from_dialog(self):
        return self.get_element_text(loc.dialog_error_loc,"登录页面_页面中间toast错误提示")

 

三、业务逻辑层:组合业务操作,即编写测试用例

 例:登录功能,登录成功测试用例

@ddt.ddt
class TestLogin(unittest.TestCase):

    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.get(CD.login_url)
        self.lp = LoginPage(self.driver)

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

    # 正常场景 - 登录成功。
    def test_login_success(self):
        logging.info("******* 登录功能 - 正常场景用例:登录成功 *******")
        # 调用登录页面的登录行为。
        self.lp.login(LD.success_data["user"], LD.success_data["passwd"])
        # 断言 - 首页当中,应该存在 退出元素。
        self.assertTrue(HomePage(self.driver).check_user_exist())
        # 断言2 - 首页url地址
        self.assertEqual(self.driver.current_url,LD.success_data["check_url"])

登录成功用例较简单,未涉及过多流程和元素操作,可以看看下面一个投资成功的测试用例:

@ddt.ddt
class TestInvest(unittest.TestCase):

    def setUp(self) -> None:
        # 1、(前置)登陆页面登陆;
        self.driver = webdriver.Chrome()
        self.driver.get(CD.login_url)
        LoginPage(self.driver).login(CD.user,CD.passwd)
        # 2.首页选标,选择页面第一个标(默认此标符合此次用例投资标准)
        HomePage(self.driver).click_first_bid()
        self.bp = BidPage(self.driver)


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

    # 正常场景 - 投资成功
    def test_invest_success(self):
        logging.info("******* 投资功能 - 正常场景用例:投资1000元成功。用户可用余额减少1000,标余额减少1000 *******")
        # 3、标页面获取用户余额;
        user_money_before_invest = self.bp.get_user_money()
        # 4、标页面获取 标的余额;
        bid_money_before_invest = self.bp.get_bid_left_money()
        # 5、标页面:投标动作;
        self.bp.invest(ID.success["money"])
        # 6、点击投标成功提示框当中:查看并激活按钮
        self.bp.click_activeButton_on_success_popup()
        # 7、个人页面:获取用户余额
        user_money_after_invest = UserPage(self.driver).get_user_left_money()
        # 8、回退到标页面、刷新后:再次获取标的余额
        self.driver.back()
        self.driver.refresh()
        bid_money_after_invest = self.bp.get_bid_left_money()
        # 9、断言
        self.assertEqual(ID.success["money"],int(float(user_money_before_invest) - float(user_money_after_invest)))
        self.assertEqual(ID.success["money"],int((float(bid_money_before_invest) - float(bid_money_after_invest))*10000))

  

关于自动化中的PO模式,大概就讲这么多啦。。。O(∩_∩)O~

 

 

做一棵小草,谁也撼动不了………

 

posted on 2020-11-24 17:19  小草小草随风飘摇  阅读(2063)  评论(0编辑  收藏  举报