python做web自动化_【07篇】python+selenium实现Web自动化:PO模型,PageObject模式!

一、前言

最近问我自动化的人确实有点多,个人突发奇想:想从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@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()

三、Selenium成套博文地址,总有你需要的:

如果你觉得此文对你有帮助,如果你对此文有任何疑问,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣请拉到最上面关注笔者的名字!

一箭三雕:如果你觉得本文对你有帮助,请关注,赞同,分享三连!谢谢!

作者出处:逍遥子:【07篇】python+selenium实现Web自动化:PO模型,PageObject模式!

转载声明:欢迎转载,但未经作者同意请保留此段声明,并在文章明显位置给出原文链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值