如果你对软件测试、面试经验交流感兴趣欢迎加入软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

【python+selenium07篇】:PO模型,PageObject模式!

上一篇 / 下一篇  2020-06-10 19:57:27 / 个人分类:WEB自动化

一、前言
最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新!
这是python+selenium实现Web自动化第七篇博文

二、Selenium之-PO模型
PO 模型:将测试的每个页面看作一个对象,将这些对象抽象成类,完成页面元素和业务操作;将测试类和 page 类区分开来,需要调用什么类去取即可,降低耦合。当页面元素发生变化时,只需修改对应页面类部分,其他部分极可能做到最小修改。
PO 模型的分层结构(以**页面作为page对象):
(1)register_page(页面元素查找类) --->
(2)register_handle(操作层:将查找到的元素上传递数据) --->
(3)register_business(业务层:调用操作层,根据操作层传递的数据进行测试业务场景判断,如验证码输入错误场景等) 
(4)register_cases(测试模块:封装业务层,进行测试用例业务组装)。

1. 元素查找
此页面主要是查找**页面中正常的元素和异常的元素(错误的提示信息)。
register_email_error = id>register_email-error
register_nickname_error = id>register_nickname-error
register_password_error = id>register_password-error
captcha_code_error = id>captcha_code-error

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""
from basic.find_element import FindElement
from selenium import webdriver
class RegisterPage(object):
    # 初始化元素查找类,执行该类的时候就会加载
    def __init__(self, driver):
        self.fe = FindElement(driver)
 
    # **邮箱
    def get_register_email(self):
        return self.fe.get_element('register_email')
 
    # 用户昵称
    def get_register_nickname(self):
        return self.fe.get_element('register_nickname')
 
    # 密码
    def get_register_password(self):
        return self.fe.get_element('register_password')
 
    # 验证码输入框
    def get_getcode_num(self):
        return self.fe.get_element('getcode_num')
 
    # 验证码图片
    def get_captcha_code(self):
        return self.fe.get_element('captcha_code')
 
    # **邮箱框文本提示语
    def get_register_email_placeholder(self):
        print(self.fe.get_element('register_email').get_attribute('placeholder'))
        return self.fe.get_element('register_email').get_attribute('placeholder')
 
    # 用户昵称框文本提示语
    def get_register_nickname_placeholder(self):
        print(self.fe.get_element('register_nickname').get_attribute('placeholder'))
        return self.fe.get_element('register_nickname').get_attribute('placeholder')
 
    # 密码框文本提示语
    def get_register_password_placeholder(self):
        print(self.fe.get_element('register_password').get_attribute('placeholder'))
        return self.fe.get_element('register_password').get_attribute('placeholder')
 
    # 验证码框文本提示语
    def get_captcha_code_placeholder(self):
        print(self.fe.get_element('captcha_code').get_attribute('placeholder'))
        return self.fe.get_element('captcha_code').get_attribute('placeholder')
 
   # 不合法**邮箱错误提示语
    def get_register_email_error(self):
        return self.fe.get_element('register_email_error')
 
    # 不合法**用户错误提示语
    def get_register_nickname_error(self):
        return self.fe.get_element('register_nickname_error')
 
    # 不合法密码错误提示语
    def get_register_password_error(self):
        return self.fe.get_element('register_password_error')
 
    # 不合法验证码错误提示语
    def get_captcha_code_error(self):
        return self.fe.get_element('captcha_code_error')
 
 
if __name__ == "__main__":
    register_url = 'http://www.5itest.cn/register'
    driver = webdriver.Chrome('../tools/chromedriver.exe')
    driver.get(register_url)
    rp = RegisterPage(driver)
    rp.get_register_email_placeholder()
    rp.get_register_nickname_placeholder()
    rp.get_register_password_placeholder()
    rp.get_captcha_code_placeholder()
    driver.close()

2.操作层
上一层我们获取到**页面中主要元素信息,接下来就该给这些元素进行数据上的操作处理(赋值)。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Contact :   软件测试技术群:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""
from page_object_model.regitser_page import RegisterPage
from selenium import webdriver
from time import sleep
class RegisterHandle(object):
    def __init__(self, driver):
        self.rp = RegisterPage(driver)
 
    # 输入**邮箱
    def send_register_email(self, email):
        self.rp.get_register_email().send_keys(email)
 
    # 输入用户昵称
    def send_register_nickname(self, nickname):
        self.rp.get_register_nickname().send_keys(nickname)
 
    # 输入**密码
    def send_register_password(self, password):
        self.rp.get_register_password().send_keys(password)
 
    # 输入验证码
    def send_register_captcha(self, captcha):
        self.rp.get_getcode_num().send_keys(captcha)
 
    # 获取错误信息
    def get_user_text(self, error_info, error_value):
        text = None
        if error_info == "register_email_error":
            text = self.rp.get_register_email_error().send_keys(error_value)
        elif error_info == 'register_nickname_error':
            text = self.rp.get_register_nickname_error().send_keys(error_value)
        elif error_info == 'register_password_error':
            text = self.rp.register_password_error().send_keys(error_value)
        elif error_info == 'captcha_code_error':
            text = self.rp.captcha_code_error().send_keys(error_value)
        else:
            print("error element not found")
        return text
 
    # 点击**按钮
    def click_register_btn(self):
        self.rp.get_register_btn().send_keys()
 
 
if __name__ == "__main__":
    register_url = 'http://www.5itest.cn/register'
    driver = webdriver.Chrome('../tools/chromedriver.exe')
    driver.get(register_url)
    rh = RegisterHandle(driver)
    rh.send_register_email('jjij@163.com')
    rh.send_register_nickname('MiFan')
    rh.send_register_password('123@123abc')
    rh.send_register_captcha('qwer')
    rh.click_register_btn()
    sleep(5)
    driver.close()

3.业务层
业务层,也就是我们要做些什么,做事的逻辑是什么?对于自动化测试来说,就是自动化的测试场景,也就是我们的测试点逻辑。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""
from page_object_model.register_handle import RegisterHandle
from selenium import webdriver
from time import sleep

class RegisterBusiness(object):
    def __init__(self, driver):
        self.rh = RegisterHandle(driver)
 
    # 正常**
    def common_register(self, register_email, nickname, password, captcha):
        self.rh.send_register_email(register_email)
        self.rh.send_register_nickname(nickname)
        self.rh.send_register_password(password)
        self.rh.send_register_captcha(captcha)
 
    # 判断是否**成功
    def success_or_fail(self):
        if self.rh.get_register_btn_text() is None:
            return True
        else:
            return False
 
    # 邮箱错误
    def register_email_error(self, register_email, nickname, password, captcha):
        self.common_register(register_email, nickname, password, captcha)
        if self.rh.get_user_text('register_email_error', "请输入有效的电子邮件地址") is None:
            print("**邮箱输入错误")
            return True
        else:
            return False
 
    # 用户昵称错误
    def register_nickname_error(self, register_email, nickname, password, captcha):
        self.common_register(register_email, nickname, password, captcha)
        if self.rh.get_user_text('register_nickname_error', "字符长度必须大于等于4,一个中文字算2个字符") is None:
            print("用户昵称错误")
            return True
        else:
            return False
 
    # 用户密码错误
    def register_password_error(self, register_email, nickname, password, captcha):
        self.common_register(register_email, nickname, password, captcha)
        if self.rh.get_user_text('register_password_error', "最少需要输入 5 个字符") is None:
            print("用户密码错误")
            return True
        else:
            return False
 
    # 验证码错误
    def captcha_code_error(self, register_email, nickname, password, captcha):
        self.common_register(register_email, nickname, password, captcha)
        if self.rh.get_user_text('captcha_code_error', "验证码错误") is None:
            print("验证码错误")
            return True
        else:
            return False
 
 
if __name__ == "__main__":
    register_url = 'http://www.5itest.cn/register'
    driver = webdriver.Chrome('../tools/chromedriver.exe')
    driver.get(register_url)
    rb = RegisterBusiness(driver)
    rb.captcha_code_error('1243589@163.com', 'pass123', 'test@123', 'sds')
 
    sleep(3)
    driver.close()

4.测试层
经过一些列分层计划,虽然在每一层我们都在进行测试,但是我们最终还是要回归到本质进行测试,将各层模块一同调用起来。基于业务层编写测试用例。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""
from page_object_model.register_business import RegisterBusiness
from selenium import webdriver
import unittest
 
class RegisterTestcase(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.register_url = 'http://www.5itest.cn/register'
        cls.driver = webdriver.Chrome('../tools/chromedriver.exe')
        cls.driver.get(cls.register_url)
        cls.driver.maximize_window()
        cls.rb = RegisterBusiness(cls.driver)
 
    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.close()
 
    # **邮箱错误,但用例执行成功
    def test_register_email_error(self):
        register_email_error = self.rb.register_email_error('23', 'test01', 'test01abc', 'abc4')
        if register_email_error is True:
            print("账号**失败,该用例执行成功")
        else:
            print("账号**成功,该用例执行失败")
 
    # 验证码错误,但用例执行成功‘
    def test_captcha_code_error(self):
        captcha_code_error = self.rb.captcha_code_error('test02@163.com', 'test02', 'test02abc', 'height')
        if captcha_code_error is True:
            print("账号**失败,该用例执行成功")
        else:
            print("账号**成功,该用例执行失败")
 
 
if __name__ == "__main__":
    unittest.main()


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

诸葛_

诸葛_

如果你对软件测试、面试经验交流感兴趣欢迎加入软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

日历

« 2020-07-31  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 8120
  • 日志数: 38
  • 建立时间: 2020-04-01
  • 更新时间: 2020-06-29

RSS订阅

Open Toolbar