web端自动化——selenium Page Object设计模式
Page Object设计模式的优点如下:
① 减少代码的重复。
② 提高测试用例的可读性。
③ 提高测试用例的可维护性,特别是针对UI频繁变化的项目。
当为Web页面编写测试时,需要操作该Web页面上的元素。然而,如果在测试代码中直接操作HTML元素,那么你的代码是极其脆弱的,因为UI经常变动。我们可以将一个page对象封装成一个HTML页面,然后通过提供的应用程序特定的API来操作页面元素, 而不是在HTML中四处搜寻。
Page对象的一个基本经验法则是:凡是人能做的事,Page对象通过软件客户端都能够做到。因此,它也应当提供一个易于编程的接口并隐藏窗口中底层的部件。所以访问一个文本框应该通过一个访问方法(accessor method)来实现字符串的获取与返回,复选框应当使用布尔值,按钮应当被表示为行为导向的方法名。Page对象应当将在GUI控件上所有查询和操作数据的行为封装为方法。一个好的经验法则是,即使改变具体的控件,page对象的接口也不应当发生变化。
尽管该术语是“页面”对象,但并不意味着需要对每个页面建立一个这样的对象. 例如,页面有重要意义的元素可以独立为一个page对象。经验法则的目的是通过给页面建模,使其对应用程序的使用者变得有意义。
实例代码如下:
# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep class Page(object): # 实例化Page类时,最先执行的就是__init__方法,
# 该方法的入参,其实就是Page类的入参。
# self指实例本身,相较于类Page而言。
login_url = 'https://www.126.com' def __init__(self, selenium_driver, base_url=login_url):
self.base_url = base_url
self.driver = selenium_driver
self.timeout = 30 def on_page(self):
return self.driver.current_url == (self.base_url + self.url) # 以单下划线_开头的方法,
# 在使用import *时,该方法不会被导入,保证该方法为类私有的。
def _open(self, url):
url = self.base_url + url
self.driver.get(url)
assert self.on_page(), 'Did not land on %s' %url # 定义open方法,调用_open()进行打开链接
def open(self):
self._open(self.url) # loc入参为元组的元素,需要加*。
# Python存在这种特性,就是将入参放在元组里。
def find_element(self, *loc):
return self.driver.find_element(*loc) class LoginPage(Page): # 126邮箱登录页面模型
url = '/'
# 定位器
# 使用复合类名,直接使用会报错
username_loc = (By.CLASS_NAME, "dlemail")
password_loc = (By.CLASS_NAME, "dlpwd")
submit_loc = (By.ID, "dologin") # Action
def switch_frame(self, loc):
return self.driver.switch_to_frame(loc) 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 submit(self):
self.find_element(*self.submit_loc).click() def test_user_login(driver, loc, username, password): #测试获取的用户名/密码是否可以登录
login_page = LoginPage(driver)
login_page.open()
sleep(5)
login_page.switch_frame(loc)
login_page.type_username(username)
login_page.type_password(password)
login_page.submit() def mainTest(): try:
driver = webdriver.Chrome()
username = 'lili1505115417'
password = 'lili123456'
loc = 0
test_user_login(driver, loc, username, password)
sleep(5)
text = driver.find_element_by_id("spnUid").text
assert (text == 'lili1505115417@126.com'), "用户名称不匹配.登录失敗!"
finally:
#关闭浏览器窗口
driver.quit()
print('结束') if __name__ == '__main__':
mainTest()
web端自动化——selenium Page Object设计模式的更多相关文章
- web端自动化——Selenium Grid原理
利用Selenium Grid可以在不同的主机上建立主节点(hub)和分支节点(node),可以使主节点上的测试用例在不同的分支节点上运行. 对不同的节点来说,可以搭建不同的测试环境(操作系统.浏 ...
- web端自动化——selenium测试报告生成、找到测试报告路径、实现发邮件(整合)
有这样的一个场景: 假设生成的测试报告与多人相关,每个人都去测试服务器査看就会比较麻烦,如果把这种主动的且不及时的査看变成被动且及时的査收,就方便多了. 整个程序的执行过程可以分为三个步骤: ① ...
- web端自动化——Selenium Server环境配置
Selenium Server环境配置 下面下载.配置并运行Selenium Server. ① 下载 Selenium Server. 下载地址为:https://pypi.python.or ...
- web端自动化——selenium项目集成HTML测试报告
参考内容: 虫师:<selenium2自动化测试实战——基于python语言> PS:书中的代码,只能做参考,最好还是自己码一码,不一定照搬就全是对的,实践出真知... 随着软件不断迭代功 ...
- Selenium(十九):unittest单元测试框架(五) Page Object设计模式
1. Page Object设计模式 Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,它主要体现在对界面交互细节的封装,这样可以使测试方案更关注于业务而非界面细节.从 ...
- Selenium+java - Page Object设计模式
前言 Page Object(页面对象)模式,是Selenium实战中最为流行,并且被自动化测试同学所熟悉和推崇的一种设计模式之一.在设计测试时,把页面元素定位和元素操作方法按照页面抽象出来,分离成一 ...
- Selenium Page Object(PO)设计模式
Webdriver UI自动化测试火了好几年了,具体怎么设计自动化测试测试工程,组织测试用例完全凭借着自己的经验和习惯. 最近忽然听说了Page Object(简称PO)火了起来,也有面试的时候被问到 ...
- selenium+Python(Page Object 设计模式实例)
以下实例演示了采用了page Object设计模式的方式登录qq空间: 1.创建基础类page:在初始方法__init__()定义驱动的(driver),基本url(base_url)和超时时间(ti ...
- Python+selenium之Page Object设计模式
Page Object是selenium自动化测试项目开发实践的最佳设计模式之一,他主要提现在对界面交互细节的封装,这样可以使测试案例隔你给加关注于业务而非界面细节,从而提高测试案例的可读性. Pag ...
随机推荐
- 洛谷 P2279 [HNOI2003]消防局的设立 题解
每日一题 day34 打卡 Analysis 这道题的正解本来是树形dp,但要设5个状态,太麻烦了.于是我就用贪心试图做出此题,没想到还真做出来了. 考虑当前深度最大的叶子结点,你肯定要有一个消防局去 ...
- 015_Python3 迭代器与生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- 几个方便的基于es 的开源文档索引系统
Apache Tika 比较有名的内容提取工具 FsCrawler 使用java 开发,内部使用了Tika Ambar nodejs,python应用开发,轻量,支持基于docker 的快速部署,同时 ...
- 【概率论】6-3:中心极限定理(The Central Limit Theorem)
title: [概率论]6-3:中心极限定理(The Central Limit Theorem) categories: - Mathematic - Probability keywords: - ...
- 连接linux的几款工具 简介
1.Putty --支持ppk,pub格式密码连接 --支持centos --支持windows操作系统安装,网上去下载直接可以使用,免费的 安装文件在我的百度网盘:putty 安装后如下: load ...
- UOJ#400. 【CTSC2018】暴力写挂 边分治 线段树合并
原文链接 www.cnblogs.com/zhouzhendong/p/UOJ400.html 前言 老年选手没有码力. 题解 先对第一棵树进行边分治,然后,设点 x 到分治中心的距离为 $D[x]$ ...
- Android中活动被回收了怎么办
当一个活动进入到了停止状态,是有可能被系统回收的.按下返回键的时候,活动被重新创建一次,但是里面的数据就没办法重现: 这时Activity中提供了一个onSaveInstanceState()回调方法 ...
- hibernate如何配置自动生成表
hibernate自动生成表有两种方法: 1.直接写代码,通过方法来创建数据库表. 2.通过 hibernate.cfg.xml配置标签来创建数据表. 下面依次实现: 1.直接写代码,通过方法来创建数 ...
- Spring IOC的缓存
1.将上一篇的测试代码修改如下 public class SpringTest { public static void main(String[] args) { ClassPathResource ...
- JVM 类加载器命名空间深度解析与实例分析
一.创建Sample 1.创建实例 public class MyPerson { private MyPerson myPerson; public void setMyPerson(Object ...