示例常规代码

baidu.py

# _*_ coding:utf-8 _*_
import csv,unittest,time #导入csv模块
from time import sleep
from selenium import webdriver
from module import baidumodule
from parameterized import parameterized, param
from HTMLTestRunner import HTMLTestRunner
from selenium.webdriver.chrome.options import Options
class baidu(unittest.TestCase):
"""百度测试"""
@classmethod
def setUpClass(cls):#类中最先执行)
cls.driver = webdriver.Remote(command_executor='http://192.168.1.8:4444/wd/hub',
desired_capabilities={"browserName": "chrome", })
cls.driver.maximize_window() # 最大化窗口
cls.driver.implicitly_wait(10) # 隐式等待
cls.search = baidumodule(cls.driver) # 将driver传给aidumodule这个类 @classmethod
def tearDownClass(cls): #类中最后执行
cls.driver.quit() @parameterized.expand([
("selenium","selenium_百度搜索"), #此处为file.csv中的数据
# ("selenium2","selenium2_百度搜索"),
# ("selenium31","selenium3_百度搜索"),
# ("webdriver","webdriver_百度搜索"),
])
def test_search(self,search_str,assrt_str):#接收上面的两个参数
'''百度测试用例'''
search = self.search
driver = self.driver
search.login(search_str)
sleep(1)
title = driver.title
self.assertEqual(title,assrt_str)
sleep(2) if __name__ == "__main__":
# unittest.main()
test_script = "./" #需要执行的脚本路径
test_repot = "D:/" #测试报告存放路径
discover = unittest.defaultTestLoader.discover(test_script,pattern="b.py")#传入路径及脚本名称
date = time.strftime("%Y-%m-%d %H-%M-%S")#当前时间
filname = test_repot + date +"result.html" #将报告存放路径、当前时间、文件名称拼接
op = open(filname,"wb")#创建并以二进制写入
runner = HTMLTestRunner(stream=op,#测试报告的昵称
title="百度测试",#标题
description="以下为执行结果建议Chrome打开")#描述
runner.run(discover)#运行
op.close()#关闭文件

module.py

class baidumodule():
def __init__(self,driver,):
self.dr = driver #不能在类中再次导入webdriver 两边的driver等于两个窗口,直接让调用方传入driver即可
def login(self,values):
login_dr = self.dr
login_dr.get("https://www.baidu.com/")
login_dr.find_element_by_xpath("//*[@id='kw']").send_keys(values)
login_dr.find_element_by_xpath("//*[@id='su']").click()

其实上面的代码有一点 Paget Object 的意思了,Paget Object 中元素和操作基本全部是分开整合

Page Object 设计模式

Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,它主要体现在对界面交互细节的封装,这样可以使测试案例更关注于业务而非界面细节,从而提高测试案例的可读性。

##1、认识Page Object

Page Object 设计模式的优点如下:

  • 减少代码的重复。
  • 提高测试用例的可读性。
  • 提高测试用例的可维护性,特别是针对 UI 频繁变化的项目。

当为 Web 页面编写测试时,需要操作该 Web 页面上的元素。然而,如果在测试代码中直接操作 HTML 元素,那么你的代码是极其脆弱的,因为 UI 经常变动。我们可以将一个 page 对象封装成一个 HTML 页面,然后通过提供的应用程序特定的 API 来操作页面元素,而不是在 HTML 中四处搜寻。Page Object 原理如图 8.8 所示。

##2、Paget Object 使用注意

  • 尽量不要暴露Page的内部细节
  • 不要assertion
  • 方法可以返回其他Page Objects
  • Page Objects不用代表整个页面,可以是任意一个部分
  • 一样的操作,不同的结果应该分开(正确登录,错误登录)
  • 一个点击或输入也可写入一个函数

开始改写我们的测试脚本:删除module.py,创建baidu_paget.py,改写baidu.py:

改写后代码示例

baidu.py

import unittest,time
from time import sleep
from selenium import webdriver
from paget import login_page,baidu_test
from HTMLTestRunner import HTMLTestRunner class test(unittest.TestCase):
'''百度测试'''
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome() @classmethod
def tearDownClass(cls):
cls.driver.close() def test1(self):
'''开始搜索第一个值'''
bd = baidu_test(self.driver) # 调用子类,父类拥有的方法他也有所以把driver传给他即可
bd.open()
bd.search("selenium") #传入搜索值
bd.time_out("su") #传入元素,判断是否超时
bd.button() # 点击元素
sleep(1)
title = self.driver.title
self.assertEqual(title,"selenium_百度搜索") def test2(self):
'''开始搜索第一个值'''
bd = baidu_test(self.driver) # 调用子类,父类拥有的方法他也有所以把driver传给他即可
bd.open()
bd.search("webdriver") #传入搜索值
bd.time_out("su") #传入元素,判断是否超时
bd.button() # 点击元素
sleep(1)
title = self.driver.title
self.assertEqual(title,"webdriver_百度搜索") if __name__ == "__main__":
# unittest.main()
test_script = "./" #需要执行的脚本路径
test_repot = "D:/" #测试报告存放路径
discover = unittest.defaultTestLoader.discover(test_script,pattern="baidu.py")#传入路径及脚本名称
date = time.strftime("%Y-%m-%d %H-%M-%S")#当前时间
filname = test_repot + date +"result.html" #将报告存放路径、当前时间、文件名称拼接
op = open(filname,"wb")#创建并以二进制写入
runner = HTMLTestRunner(stream=op,#测试报告的昵称
title="百度测试",#标题
description="以下为执行结果建议Chrome打开")#描述
runner.run(discover)#运行
op.close()#关闭文件

baidu_paget.py

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 初始化使用方法
class login_page:
def __init__(self,driver,url='https://www.baidu.com/'):
self.driver = driver
self.url = url
# 定义url获取,如果传入url就使用传入的url,未传入使用上面的默认url
def open(self,url=None):
self.driver.maximize_window() # 最大化窗口
self.driver.implicitly_wait(10)# 隐式等待
if url is None:
self.driver.get(self.url)
else:
self.driver.get(url)
def time_out(self,element):
'''如需使用需要传入一个元素'''
WebDriverWait(self.driver, 5, 0.5).until( # 测试是否超时
EC.presence_of_element_located((By.ID, element))) # 测试是否超时
# 定义简写元素获取方法
def id(self,id_):
return self.driver.find_element_by_id(id_)
def xpath(self,xpath_):
return self.driver.find_element_by_xpath(xpath_) # 编写测试元素操作
class baidu_test(login_page):
def search(self,search_keys):
self.id("kw").send_keys(search_keys) def button(self):
self.xpath("//*[@id='su']").click()

以上为Paget Object 简单示例

这样分层的好处是,不同的层关心不同的问题。页面对象层只关心元素的定位问题,测试用例只关心测试的数据。

一个有分歧的地方是 page 对象是否应自身包含断言,或者仅仅提供数据给测试脚本来设置断言。在 page 对象中包含断言的倡导者认为,这有助于避免在测试脚本中出现重复的断言,可以更容易地提供更好的错误信息,并且提供更接近只做不问风格的 API。不在 page 对象中包含断言的倡导者则认为,包含断言会混合访问页面数据和实现断言逻辑的职责,并且导致 page 对象过于臃肿。

笔者赞成在 page 对象中不包含断言,虽然我们可以通过为常用的断言提供断言库的方式来消除重复,提供更好的诊断,但从用户的角度去自动化的观点来看,判断是否登录成功是用户需要做的事情,不应该交由页面对象层来完成。

使用 Page Object 模式之后的另一个好处就是有助于降低冗余。如果需要在 10 个用例中输入不同的用户名

/密码登录,那么用 main()方法写将会变得非常简洁。

因此,Page Object 模型的作用在一个测试人员自己写主场景测试案例时是不容易体会到的,因为你不需要和开发、业务交流案例,也不会写很多重复的动作。但是,当你真正开始尝试 ATDD 或 BDD,当你开始写一些重要的异常分支流程时,当你开始为新需求频繁维护修改案例时,就会意识到 Page Object 的作用。

最后,Page Object 不是万灵药,也不是唯一方案,提高测试案例的可读性,避免案例步骤冗余才是终极目标。

Paget Object 设计模式编写selenium测试用例的更多相关文章

  1. 技术分享 | Selenium 测试用例编写

    编写Selenium测试用例就是模拟用户在浏览器上的一系列操作,通过脚本来完成自动化测试. 编写测试用例的优势: 开源,免费. 支持多种浏览器 IE,Firefox,Chrome,Safari. 支持 ...

  2. Selenium+java - Page Object设计模式

    前言 Page Object(页面对象)模式,是Selenium实战中最为流行,并且被自动化测试同学所熟悉和推崇的一种设计模式之一.在设计测试时,把页面元素定位和元素操作方法按照页面抽象出来,分离成一 ...

  3. Selenium(十九):unittest单元测试框架(五) Page Object设计模式

    1. Page Object设计模式 Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,它主要体现在对界面交互细节的封装,这样可以使测试方案更关注于业务而非界面细节.从 ...

  4. web端自动化——selenium Page Object设计模式

    Page Object设计模式的优点如下: ①    减少代码的重复. ②    提高测试用例的可读性. ③    提高测试用例的可维护性,特别是针对UI频繁变化的项目. 当为Web页面编写测试时,需 ...

  5. selenium+Python(Page Object 设计模式实例)

    以下实例演示了采用了page Object设计模式的方式登录qq空间: 1.创建基础类page:在初始方法__init__()定义驱动的(driver),基本url(base_url)和超时时间(ti ...

  6. Python+selenium之Page Object设计模式

    Page Object是selenium自动化测试项目开发实践的最佳设计模式之一,他主要提现在对界面交互细节的封装,这样可以使测试案例隔你给加关注于业务而非界面细节,从而提高测试案例的可读性. Pag ...

  7. Selenium 2自动化测试实战39(Page Object设计模式)

    Page Object设计模式 Page object是selenium自动化测试项目开发时间的最佳设计模式之一,主要体现在对界面交互细节的封装. 1.认识page object优点如下:1.减少代码 ...

  8. Selenium 2自动化测试实战34(编写Web测试用例)

    编写Web测试用例 1.介绍了unittest单元测试框架,其主要是来运行Web自动化测试脚本.简单的规划一下测试目录:web_demo1/------test_case/------------te ...

  9. Page Object 设计模式介绍

    Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,Page Object 的主要体现于对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案 ...

随机推荐

  1. if语句和case语句用法展示

    if语句和case语句用法展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单分支if条件语句 1>.语法格式一 if [ 条件判断式 ];then 源代码 fi 2& ...

  2. 在 chrome 上导出 pdf

    用html+css写出网页,然后在chrome上导出pdf 1. command + p:快捷呼出打印: 2. “目标打印机”:选择“更改”,之后选择“另存为PDF”: 3. 点“更多设置”,可以勾选 ...

  3. Log4net(二)-——关联配置文件的方式总结

    关联配置文件的方式总结 以控制台应用程序为例,在.net mvc项目中默认的配置位置为Web.config,其他的配置都一样 1.配置在AppConfig中 在控制台应用程序中,如果我们把Log4ne ...

  4. Linux系统加固

    iptables 初始化 > iptables -F #清空所有的链 > iptables -X #清空所有自定义的链 关掉全部端口 > iptables -P INPUT DROP ...

  5. contourf和contour用法区别

    import numpy as np import matplotlib.pyplot as plt %matplotlib inline from matplotlib.colors import ...

  6. Gitlab部署

    前言 因部门业务整顿,需将原有的多部门共用的Gitlab环境遗弃,新建部门独立的Gitlab环境! 安装 CE版本安装操作:https://about.gitlab.com/install/#cent ...

  7. git回滚远程仓库代码/错提master分支的恢复

    前言 今天周五了,刚接了个新微服务模块,下班前高高兴兴开发完,提交git代码,jenkins发布到测试环境.突然看到一个提示 我最近提的代码呢?!! 想到可能会提错仓库,转念一想,不对呀,我怎有这么高 ...

  8. HTML5 元素拖拽实现 及 jquery.event.drag插件

    如上图片: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  9. 阿里云3台机器组成集群配置ssh免密码登陆

    1 查询阿里云局网ip 注意:需要配置同一地区同一可用区的机器 才是一个局网 2 配置好hosts文件 3 hostname确认也是正确的 4 生成公钥私钥 三台机器同样操作 ssh-keygen - ...

  10. MHA-Failover(GTID,Auto_Position=0)

    最近一位同学遇到的案例:凌晨数据库意外宕机,要求在一主两从的基础上,搭建MHA做故障切换.在部署测试中遇到一些问题找到我,交流的过程挖出一些之前忽略的坑,感谢这位同学无私分享!• GTID环境,KIL ...