一、前言

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

这是python+selenium实现Web自动化第七篇博文

二、Selenium前六篇博文地址:

【Selenium01篇】python+selenium实现Web自动化:搭建环境,Selenium原理,定位元素以及浏览器常规操作!

【Selenium02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!

【Selenium03篇】python+selenium实现Web自动化:元素三类等待,多窗口切换,警告框处理,下拉框选择

【Selenium04篇】python+selenium实现Web自动化:文件上传,Cookie操作,调用 JavaScript,窗口截图

【Selenium05篇】python+selenium实现Web自动化:读取ini配置文件,元素封装,代码封装,异常处理,兼容多浏览器执行

【Selenium06篇】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
@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!
@Contact : 软件测试技术群:695458161
@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
@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!
@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
@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!
@Contact : 软件测试技术群:695458161
@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
@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!
@Contact : 软件测试技术群:695458161
@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()

四、持续更新中请关注

如果你对此文有任何疑问,如果你觉得此文对你有帮助,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入:

软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

作者:来自公众号:软测之家
出处:https://www.cnblogs.com/csmashang/p/12719127.html
原创不易,欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。

【Selenium07篇】python+selenium实现Web自动化:PO模型,PageObject模式!的更多相关文章

  1. 【Selenium01篇】python+selenium实现Web自动化:搭建环境,Selenium原理,定位元素以及浏览器常规操作!

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 二.话不多说,直接开干,开始搭建自动化测试环境 这里以前在 ...

  2. 【Selenium02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!

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

  3. 【Selenium05篇】python+selenium实现Web自动化:读取ini配置文件,元素封装,代码封装,异常处理,兼容多浏览器执行

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

  4. 【Selenium06篇】python+selenium实现Web自动化:日志处理

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

  5. 【Selenium03篇】python+selenium实现Web自动化:元素三类等待,多窗口切换,警告框处理,下拉框选择

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

  6. 【Selenium04篇】python+selenium实现Web自动化:文件上传,Cookie操作,调用 JavaScript,窗口截图

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

  7. 【python+selenium的web自动化】- 元素的常用操作详解(一)

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html ​ 本篇主要内容:1.元素 ...

  8. 【python+selenium的web自动化】- PageObject模式解析及案例

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html PO模式 ​ Page O ...

  9. 【python+selenium的web自动化】- Selenium WebDriver原理及安装

    简单介绍 selenium ​ selenium是一个用于测试web网页的自动化测试工具,它直接运行在浏览器中,模拟用户的操作.

随机推荐

  1. vs2017 dlib19.3 opencv3.41 C++ 环境配置 人脸特征点识别

    身为一个.net程序员经过两天的采坑终于把人脸特征检测的项目跑通了,然后本文将以dlib项目中人脸特征检测工程为例,讲解dlib与opencv 在vs2017 C++ 项目中的编译与运行路径配置. 1 ...

  2. SpringBoot的启动流程是怎样的?SpringBoot源码(七)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 温故而知新 本篇接 SpringBoot内置的各种Starter是怎样构建的? SpringBoot源码(六) 温故而知新, ...

  3. Web过滤器和监听器

    1.过滤器 1.1什么是过滤器 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servle ...

  4. 牛客练习赛60 A—F题解(缺E题)

    本蒟蒻这次只过了三题 赛后学习了一下出题人巨佬的标码(码风比我好多了 贴的代码有些是仿出题人)现在将自己的理解写下来与大家分享 A这个题一分析就是每个数字都会与所有数字&一下 (a&a ...

  5. Linux上安装配置Keepalived

    Linux上安装配置Keepalived 1.下载 自行去Keepalived官网进行下载,也可以通过如下链接进行下载2.0.18版本(目前的稳定版) 链接:https://pan.baidu.com ...

  6. java物流查询接口测试代码-快递100

    测试代码 返回json格式,xml/html格式自行修改参数 import java.io.IOException; import java.io.InputStream; import java.n ...

  7. 用FME处理物探点表和线表,生成管线和设施

    在项目的数据处理中,客户会提供物探点表和线表. 点表主要包括该点的物探编号.该点的X坐标.Y坐标.点的其他属性 线表主要包括该线的起始点物探编号.终止物探编号.线的其他属性 点表

  8. [算法]合并链表&删除数组重复项

    合并链表 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1-> ...

  9. ConcurrentHashMap红黑树的实现

    红黑树 红黑树是一种特殊的二叉树,主要用它存储有序的数据,提供高效的数据检索,时间复杂度为O(lgn),每个节点都有一个标识位表示颜色,红色或黑色,有如下5种特性:1.每个节点要么红色,要么是黑色:2 ...

  10. 2.1.JVM的垃圾回收机制,判断对象是否死亡

    因为热爱,所以坚持. 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言   我们 ...