一、摘要

Page Object模式,后面简称PO,他是一种设计思想,在上一章节中,曾经列举了一些在编写自动化测试过程中随着代码量的增加导致的大量代码难以维护、难以扩展、可读性极差等灾难性的事件;那么PO模式是能够帮我们解决一部分问题的解决方案; 在此笔者更愿意将其称之为一种设计模式,一种设计思想;所谓Page Object及页面对象,页面对象是哪些东西呢?比如一个按钮是一个对象,一个页面也是一个对象,这种设计模式有什么好处呢?

如果我们以页面为单位,将页面中的控件一一提炼,甚至为某些页面中的控件封装相应的方法,我们便可以在测试代码中直接使用它,从而实现了页面对象和测试代码的分离;

提炼出来之后再多个脚本使用到同一个页面对象时,也不需要再重新写直接调用它即可大大提高了代码的复用性和可读性;

如果UI经常发生变化,无疑也提高了测试代码的可维护性,页面对象变动那么只需要修改一处便多处生效;

二、实例代码

# encoding = utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep class Page(object):
"""
基础类,用于页面对象类的继承
"""
login_url = 'http://mail.163.com' def __init__(self, driver, base_url=login_url):
self.base_url = base_url
self.driver = driver
self.timeout = 30 def target_page(self):
return self.driver.current_url == self.base_url def _open(self, url):
url = self.base_url
self.driver.get(url)
print(self.driver.current_url) def open(self):
self._open(self.base_url) def find_element(self, *loc):
return self.driver.find_element(*loc) class LoginPage(Page):
"""
126邮箱登陆页面,页面对象类
"""
url = '/'
"""
此处我们暂时称页面元素为对象,虽然本代码并非那么像对象,后续的框架中我们更高度的封装它便是个可操作的对象
"""
username_loc = (By.NAME, "email") # 页面控件对象:输入用户名的input控件
password_loc = (By.NAME, "password") # 页面控件对象:输入密码的input控件
submit_loc = (By.ID, "dologin") # 页面控件对象:登陆按钮的button控件 """
为每个页面元素对象封装其相对应的方法
"""
def input_username(self, username):
self.find_element(*self.username_loc).send_keys(username) # 输入用户名 def input_password(self, password):
self.find_element(*self.password_loc).send_keys(password) # 输入密码 def click_submitbutton(self):
self.find_element(*self.submit_loc).click() # 点击登陆按钮 def user_login(driver, username, password):
login_page = LoginPage(driver)
login_page.open()
sleep(5)
driver.switch_to.frame(driver.find_element_by_xpath("//*[@id='loginDiv']/iframe"))
login_page.input_username(username)
sleep(3)
login_page.input_password(password)
sleep(3)
login_page.click_submitbutton() def main():
try:
driver = webdriver.Chrome()
username = 'xxxxxx' # 登陆邮箱需要的真实账号
password = 'xxxxxx' # 登陆邮箱需要的真实密码
user_login(driver, username, password) # 调用前面封装好的user_login方法
sleep(3) # 等待3秒
driver.switch_to.default_content() # 切换出iframe
assert_string = driver.find_element_by_xpath("/html/body/div[1]/nav/div[1]/ul/li[1]/span[2]").text
print(assert_string)
assert (assert_string == '收 信') # 断言关键字
finally:
driver.quit() # 关闭浏览器窗口 if __name__ == '__main__':
main()

Python&Selenium自动化测试之PO设计模式的更多相关文章

  1. python selenium自动化测试之路(1)--分层测试概念、selenium工具介绍

    1.分层自动化测试概念 传统的自动化市场更关注产品UI层的自动化测试,而分层的自动化测试倡导产品开发的不同阶段都需要自动化测试 大多公司与研发团队其实是忽略了单元测试与集成测试阶段的自动化测试工作,所 ...

  2. Python+selenium自动化测试之浏览器基础操作

    **​​前言** 本文主要讲解webdriber框架,Selenium 就像真实用户所做的一样,Selenium 测试可以在 Windows.Linux 和 Macintosh上的 Internet ...

  3. python+selenium自动化测试之登录

    selenium_login.py import unittest from selenium import webdriver class LoginTest(unittest.TestCase): ...

  4. python selenium自动化点击页面链接测试

    python selenium自动化点击页面链接测试 需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回 ...

  5. selenium自动化测试之整合测试报告

    selenium自动化测试之整合测试报告 标签(空格分隔): 整合报告 如下截图我们添加一个文件叫做:latest_report.py文件, import time import os import ...

  6. Selenium自动化测试之结果处理

    Selenium自动化测试之结果处理 一.断言 断言相当于性能测试中的检查点,常用断言种类很多,具体可以查看断言API:判断预期结果和实际结果是否一致,断言成功,程序继续处理,失败则终止运行,示例如下 ...

  7. Selenium自动化测试之数据驱动及用例管理

    Selenium自动化测试之数据驱动及用例管理 一.TestNg注解介绍 @Test:表示一个测试方法,在运行测试用例过程中,会自动运行@Test注解的方法. 例:

  8. Selenium自动化测试之基本控件使用

    Selenium自动化测试之基本控件使用 1.输入框input: 在Html中样式: <input id="username" type="text"&g ...

  9. Selenium自动化测试之启动浏览器

    Selenium自动化测试之启动浏览器 一.Eclipse新建java工程 1.新建java工程:File->New->Java Project,输入Project name:如AutoT ...

随机推荐

  1. 搭建IIS CA DC Exchange TMG SQL (CA DC篇)

    搭建IIS CA DC Exchange TMG SQL (CA DC篇)   步骤 1: 在“下一步(N) > (按下按钮)”(位于“添加角色向导”中)上用户左键单击   步骤 2: 在“Ac ...

  2. manjaro Docker环境配置记

    1.系统配置如下: ‘by: /home/inkhin/桌面/深度截图_选择区域_20191004145104.png [吐槽: ChromeLinux版居然不能用博客园TinyMce的上传图片功能] ...

  3. MongoTemplate 使用 _id 查询

    MongoTemplate mt; DBObject lisi = new BasicDBObject(); lisi.put("_id", new BasicDBObject(& ...

  4. TF-IDF算法之关键词提取

    (注:本文转载自阮一峰老师的博文,原文地址:http://www.ruanyifeng.com/blog/2013/03/tf-idf.html) 这个标题看上去好像很复杂,其实我要谈的是一个很简单的 ...

  5. C#进阶系列—WebApi

    参考学习优秀博客地址:http://www.cnblogs.com/landeanfen/p/5177176.html

  6. 冲刺Noip2017模拟赛4 解题报告——五十岚芒果酱

    题1 韬韬抢苹果(apple) [问题描述] 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹 果.每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了 ...

  7. LeetCode. 矩阵中的最长递增路径

    题目要求: 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向上移动或移动到边界外(即不允许环绕). 示例: 输入: nums = [ ...

  8. 为什么要使用 SPL中的 SplQueue实现队列

    今天看php的SPL标准库部分里面涉及到数据结构其中有 SplQueue 来实现队列效果,但是我刚接触php的时候学习到的是 使用array的 array_push 和 array_pop 就可以实现 ...

  9. vc++6.0中查看函数栈的结构

    栈:一种后进先出的数据结构   比如:弹夹 函数调用的约定 传参顺序 传参媒介 如何传递返回值 平衡参数(堆栈平衡):有且只有被调方(callee)和调用方(caller)一方执行 _cdell (c ...

  10. k8s-PV和PVC使用

    上节课我们学习了 PV 的使用,但是在我们真正使用的时候是使用的 PVC,就类似于我们的服务是通过 Pod 来运行的,而不是 Node,只是 Pod 跑在 Node 上而已,所以这节课我们就来给大家讲 ...