Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素和功能模块的封装减少冗余代码,同时在后期维护中,若元素定位或功能模块发生变化,只需要调整页面元素或功能模块封装的代码,提高测试用例的可维护性。

案例:登录帝国网站(http://localhost)


首先定义一个基础类,用于页面对象的继承

BasePage.py

from time import sleep

class Page():
'''页面基础类''' # 初始化
def __init__(self, driver):
self.driver = driver
self.base_url = 'http://localhost'
self.timeout = 10 # 打开不同的子页面
def _open(self, url):
url_ = self.base_url + url
print("The url is %s" % url_)
# self.driver.maximize_window()
self.driver.get(url_)
sleep(2)
assert self.driver.current_url == url_, 'Did not load on %s' % url_ def open(self):
self._open(self.url) # 元素定位方法封装
def find_element(self, *loc):
return self.driver.find_element(*loc)

代码分析:

首先创建一个基础类Page,在初始化方法__init__()中定义驱动(driver),基本的URL(base_url)和超时时间(timeout)等

定义Open()方法用于打开URL网站,但它本身并未做这件事情,而是交由_open()方法来实现。关于URL地址的断言方法,则交由assert实现,而find_element()方法用于元素定位


之后设计网站登录页面模型

LoginPage.py

from BasePage import *
from selenium.webdriver.common.by import By class LoginPage(Page):
url = "/" # 定位器
username_loc = (By.NAME, 'username')
password_loc = (By.NAME, 'password')
submit_loc = (By.NAME, 'Submit') # 用户名输入框元素
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).clear
self.find_element(*self.password_loc).send_keys(password) # 登录按钮元素
def type_submit(self):
self.find_element(*self.submit_loc).click # 登录功能模块封装
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_submit()

代码分析:

Page类中定义的这些方法都是页面操作的基本方法。上面根据再登录页面的特点再创建LoginPage类并继承Page类

LoginPage类中主要对登录页面上的元素进行封装,使其成为更具体的操作方法,例如用户名,密码和登录按钮都被封装成了方法

test_user_login()函数将单个的元素操作组成一个完整的动作,而这个动作包含了打开浏览器,输入用户名\密码,点击登录等单步操作。在使用该函数时需要将driver、username、password等信息作为函数的入参,这样该函数具有很强的可重用性


最后将用户名和密码传进去

login_test.py

from LoginPage import *
from selenium import webdriver driver = webdriver.Firefox()
username = '用户名'
password = '密码' test_user_login(driver, username, password) sleep(3)
driver.quit()

login_test更接近用户的操作行为。对用户来说,要进行网站的登录,需要关心的就是通过哪个浏览器打开网站网址,登录的用户名和密码是什么。

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

Python (Page Object实例)的更多相关文章

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

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

  2. 19、Page Object 实例

    项目目录介绍: CalcuatorPage.java文件代码: package example; import io.appium.java_client.android.AndroidDriver; ...

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

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

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

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

  5. Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)

            研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...

  6. Python+Selenium使用Page Object实现页面自动化测试

    Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通 ...

  7. Page Object Model (Selenium, Python)

    时间 2015-06-15 00:11:56  Qxf2 blog 原文  http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...

  8. Python+Selenium笔记(十三):Page Object设计模式

    (一) 前言 简单的说就是分为2层,页面class 和测试class. 页面class:分为父类和子类(子类指具体的页面,每一个页面都创建一个类),父类中定义公有的属性和方法(操作). #对面向对象有 ...

  9. Selenium的PO模式(Page Object Model)[python版]

     Page Object Model 简称POM  普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...

随机推荐

  1. asp.net调试技巧

    一眨眼的功夫,自己已经学习asp.net的有一年的功夫了.虽然称不上什么大神,但是也有一点知识的积累.就写一片调试的入门文章给那些刚刚入门迷茫的童鞋们.希望你学习了我这篇文章能从迷茫的生活中找回编程的 ...

  2. 文件操作,Io流。

    private void textBox1_TextChanged(object sender, EventArgs e) { } private void button1_Click(object ...

  3. pay-spring-boot 开箱即用的Java支付模块,整合支付宝支付、微信支付

    关于 使用本模块,可轻松实现支付宝支付.微信支付对接,从而专注于业务,无需关心第三方逻辑. 模块完全独立,无支付宝.微信SDK依赖. 基于Spring Boot. 依赖Redis. 我能做什么 支付宝 ...

  4. Windows Live Writer 2012发博客配置和技巧

    一.软件准备: 最新版的是Windows Live Writer 2012,但是不提供单独的安装包,它是和微软其它软件一起的(包括MSN.Window Move Maker等),软件大小为131M,官 ...

  5. x-shell配置远程连接

    1. 打开x-shell 2. 配置编译属性 3. 配置用户的身份证信息 5. 配置完成之后选择连接

  6. mohout安装

    安装完成之后的环境变量的配置如下: JAVA_HOME=/usr/local/jdk1.8.0_144JRE_HOME=/usr/java/jdk1.8.0_144/jreCLASSPATH=.:$J ...

  7. iOS 随机数(Fixed)

    ios 有如下三种随机数方法: 1.    srand((unsigned)time(0));  //不加这句每次产生的随机数不变         int i = rand() % 5; 2.     ...

  8. Xcode编译工具

    一.关于Other Linker Flags xcode中,在“Targets”选项下有Other Linker Flags选项,在这里可以填写xcode链接器的参数,如:-ObjC.-all_loa ...

  9. idea快速生成实体类Entity

    1)打开idea 2)添加mysql的数据连接 3)生成类

  10. HTML5服务器发送事件(Server-Send Events)

    HTML5服务器发送事件是允许获得来自服务器的更新. server-sent事件-单向传递消息,表示网页自动获取来自服务器的更新. 其中有一个重要的对象,eventsource对象是用来接收服务器发送 ...