Page Object设计模式实践
Page Object模式是使用Selenium的广大同行最为公认的一种设计模式。在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织。
Page Object模式,创建一个对象来对应页面的一个应用。故我们可以为每个页面定义一个类,并为每个页面的属性和操作构建模型。体现在对界面交互细节的封装,测试在更上层使用页面对象,在底层的属性或者操作的更改不会中断测试。减少代码重复,提高测试代码的可读性和可维护性。
下面将以登录qq邮箱简单为例,通过Page Object设计模式来实现。代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep #创建基础类
class BasePage(object):
#初始化
def __init__(self, driver):
self.base_url = 'https://mail.qq.com/'
self.driver = driver
self.timeout = 30 #定义打开登录页面方法
def _open(self):
url = self.base_url
self.driver.get(url)
self.driver.switch_to.frame('login_frame') #切换到登录窗口的iframe #定义定义open方法,调用_open()进行打开
def open(self):
self._open() #定位方法封装
def find_element(self,*loc):
return self.driver.find_element(*loc) #创建LoginPage类
class LoginPage(BasePage):
username_loc = (By.ID, "u")
password_loc = (By.ID, "p")
login_loc = (By.ID, "login_button") #输入用户名
def type_username(self,username):
self.find_element(*self.username_loc).clear()
self.find_element(*self.username_loc).send_keys(username) #输入密码
def type_password(self,password):
self.find_element(*self.password_loc).send_keys(password) #点击登录
def type_login(self):
self.find_element(*self.login_loc).click() #创建test_user_login()函数
def test_user_login(driver, username, password):
"""测试用户名/密码是否可以登录"""
login_page = LoginPage(driver)
login_page.open()
login_page.type_username(username)
login_page.type_password(password)
login_page.type_login() #创建main()函数
def main():
driver = webdriver.Edge()
username = '3494xxxxx' #qq号码
password = 'kemixxxx' #qq密码
test_user_login(driver, username, password)
sleep(3) driver.quit() if __name__ == '__main__':
main()
虽然该实现方法看上去复杂多了,但其中的设计好处是不同层关心不同的问题。页面对象只关心元素的定位,测试用例只关心测试数据。
下面将对上面代码加以说明,首先创建一个基础BasePage类,在初始化方法__init__()中定义驱动(driver),基本的URL(base_url)和超时时间(timeout)等。定义open()方法用于打开URL,这里是由_open()方法来实现,而find_element()方法用于元素定位。
接下来的BasePage类中定义的方法都是页面操作的基本方法。LoginPage类并继承BasePage类,这也是Page Object设计模式中最重要的对象层。LoginPage类中主要对登录页面上元素进行封装,使其成为具体的操作方法。如对用户名、密码框和登录按钮都封装成方法。
然后定义test_user_login()函数将单个元素操作组成一个完整的动作,包含打开浏览器、输入用户名、密码并点击登录按钮等。使用时将driver、username、password作为函数的入参,这样的函数具有很强的可重用性。
最后使用main()函数进行用户操作行为,现在只关心用哪个浏览器、登录的用户名和密码是什么,至少输入框、按钮是如何定位的,则不关心。即实现了不同层关心不同问题。如果有多个用户名/密码需要登录,那么只用改写main()方法的参数即可。
Page Object设计模式实践的更多相关文章
- Page Object 设计模式介绍
Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,Page Object 的主要体现于对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案 ...
- Python+selenium之Page Object设计模式
Page Object是selenium自动化测试项目开发实践的最佳设计模式之一,他主要提现在对界面交互细节的封装,这样可以使测试案例隔你给加关注于业务而非界面细节,从而提高测试案例的可读性. Pag ...
- Selenium(十九):unittest单元测试框架(五) Page Object设计模式
1. Page Object设计模式 Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,它主要体现在对界面交互细节的封装,这样可以使测试方案更关注于业务而非界面细节.从 ...
- selenium+Python(Page Object 设计模式实例)
以下实例演示了采用了page Object设计模式的方式登录qq空间: 1.创建基础类page:在初始方法__init__()定义驱动的(driver),基本url(base_url)和超时时间(ti ...
- Selenium+java - Page Object设计模式
前言 Page Object(页面对象)模式,是Selenium实战中最为流行,并且被自动化测试同学所熟悉和推崇的一种设计模式之一.在设计测试时,把页面元素定位和元素操作方法按照页面抽象出来,分离成一 ...
- web端自动化——selenium Page Object设计模式
Page Object设计模式的优点如下: ① 减少代码的重复. ② 提高测试用例的可读性. ③ 提高测试用例的可维护性,特别是针对UI频繁变化的项目. 当为Web页面编写测试时,需 ...
- Selenium 2自动化测试实战39(Page Object设计模式)
Page Object设计模式 Page object是selenium自动化测试项目开发时间的最佳设计模式之一,主要体现在对界面交互细节的封装. 1.认识page object优点如下:1.减少代码 ...
- 18、Page Object 设计模式
Page Object 设计模式的优点如下: 减少代码的重复. 提高测试用例的可读性. 提高测试用例的可维护性, 特别是针对 UI 频繁变化的项目. 当你针对网页编写测试时,你需要引用该网页中的元素, ...
- Page Object设计模式(一)
一.简介 主要特点体现在“对界面交互细节的封装”上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性.解决UI变动问题. page对象的一个基本原则经验法则是:凡是人能做的事,page对象通过 ...
随机推荐
- Python学习之dict和set
#coding=utf-8 # dict dict= {'bob': 40, 'andy': 30} print dict['bob'] # 通过dict提供的get方法,如果key不存在,可以返回N ...
- python中导入模块的本质, 无法导入手写模块的解决办法
最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题. 下面我来分享一下关于python中导入模块的一些基本知识. 1 导入模块时寻找路径 在每一个运行的python程序当中,都维护了 ...
- 喜马拉雅音频下载工具 - xmlyfetcher
xmlyfetcher用于下载喜马拉雅歌曲资源,可以下载单个音频资源,也可以下载整个专辑. 项目地址:https://github.com/smallmuou/xmlyfetcher 安装 安装jsh ...
- Packer piplines and workflow
packer对docker和aws AMI的支持都很好,来上个图: 配套的模版长这样: { "variables": { "name": "webim ...
- Png 图像缩放保持 Alpha 通道
procedure TForm1.Button1Click(Sender: TObject); //uses Winapi.GDIPOBJ, Winapi.GDIPAPI, Winapi.GDIPUT ...
- vue基础特性
在这里我们主要是讲解一些vue实例的属性和一些基础的指令 vue实例属性: 其实和我们之前所学的对象的属性是相似的东西 vue的基础指令: 对于指令,大家可能之前么有接触过相关的概念,其实大家可以这样 ...
- 解决:HTTP 错误 404.0 - Not Found.您要找的资源已被删除、已更名或暂时不可用。(记录帖)
在IIS 上发布web程序时报错,HTTP 错误 404.0 - Not Found.您要找的资源已被删除.已更名或暂时不可用.在网上找了很多资料依然没有解决,后来问了一下同事,他一分钟就帮我搞定了 ...
- [LeetCode] Largest Palindrome Product 最大回文串乘积
Find the largest palindrome made from the product of two n-digit numbers. Since the result could be ...
- java面试2(java技术栈和Hollis面试内容分享)
1.什么是java虚拟机? java虚拟机(JVM)是一个可执行java字节码的虚拟机进程,java源文件被编译成能被java虚拟机可执行的字节码文件. 2.什么是平台无关性,java是如何做到平台无 ...
- 计蒜客NOIP模拟赛(2) D2T3 银河战舰
[问题描述] 瑞奥和玛德利德是非常好的朋友.瑞奥平时的爱好是吹牛,玛德利德的爱好是戳穿瑞奥吹的牛. 这天瑞奥和玛德利德来到了宇宙空间站,瑞奥向玛德利德炫耀这个空间站里所有的银河战舰都是自己 ...