您的位置:首页 > 编程语言 > Python开发

python+selenium Page Object 设计模式+Unittest单元测试框架

2020-01-14 16:43 405 查看

一、 Page Object 简单介绍
Page Object 是Selenium自动化测试项目开发实践的最佳设计模式之一,它主要体现在对界面交互细节的封装,这样可以使测试案例更关注于业务而非界面细节,从而提高测试案例的可读性。它的优点主要是减少代码的重复性,提高测试用例的可读性以及可维护性,特别是针对UI频繁变化的项目。
二、项目实例
接下来就以登录乐学为例来说明

1、base_page.py,这个部分主要是来定义页面基础类,定义的方法都是页面操作的基本方法。

# Author:Xueyun
# -*- coding:utf-8 -*-
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

'''定义页面基础类,封装所有页面公用的方法'''
class BasePage(object):
# 初始化driver,url,pagetitle
def __init__(self, selenium_driver, base_url, pagetitle):
self.driver = selenium_driver
self.base_url = base_url
self.pagetitle = pagetitle

# 使用title获取当前窗口title,以此来检查输入的title是否在当前title中
def on_page(self, pagetitle):
return pagetitle in self.driver.title

# 打开页面,并检验页面链接是否正确
'''以单下划线开头的方法,在使用import *时,该方法不会被导入,保证该方法为类私有'''

def _open(self, url, pagetitle):
# 打开链接
self.driver.get(url)
# 窗口最大化
self.driver.maximize_window()
# 校验打开的title是否与配置title一致
assert self.on_page(pagetitle), u"打开页面失败 %s" % url

#调用_open方法打开链接
def open(self):
self._open(self.base_url, self.pagetitle)

#元素定位方法
def find_element(self, *loc):
try:
WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc))
return self.driver.find_element(*loc)
except:
print(u"%s 页面中未能找到%s元素"%(self, loc))

#send_keys方法
def send_keys(self,loc,value,clear_first=True,click_first=True):
try:
loc = getattr(self,'_%s'%loc)
if click_first:
self.find_element(*loc).click()
if clear_first:
self.find_element(*loc).clear()
self.find_element(*loc).send_keys(value)
except AttributeError:
print(u"%s 页面中未能找到%s元素" % (self, loc))

2、login_page.py,创建loginpage类,继承基类方法

# Author:Xueyun
# -*- coding:utf-8 -*-
from selenium.webdriver.common.by import By
from po.base_page import BasePage

'''继承基础页面类,包含登录的所有方面'''
class LoginPage(BasePage):
'''定位器,通过元素属性定位元素对象'''
username_loc = (By.ID,'login_username')
password_loc = (By.NAME,'_password')
submit_loc = (By.LINK_TEXT,'登录')
span_loc = (By.CSS_SELECTOR,'#login-form > div.alert.alert-danger')

#操作
#通过继承覆盖overriding方法,如果子类和父类的方法名相同,优先用子类自己的方法
#打开网页
def open(self):
self._open(self.base_url, self.pagetitle)

#输入用户名,调用send_keys
def input_username(self,username):
self.find_element(*self.username_loc).send_keys(username)

#输入密码,调用send_keys
def input_password(self, password):
self.find_element(*self.password_loc).send_keys(password)

#点击登录
def click_submit(self):
self.find_element(*self.submit_loc).click()

#用户名或密码不合理
def show_span(self):
return self.find_element(*self.span_loc).text

3、test_case.py,测试用例的编写,利用Unitest单元测试框架来管理测试用例。

# Author:Xueyun
# -*- coding:utf-8 -*-
import unittest
from po.login_page import LoginPage
from selenium import webdriver

class Case01(unittest.TestCase):
''''登录乐学'''
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(30)
self.url = "http://www.5itest.cn/login"
self.username = "18328379237"
self.password = "123456"

#用例执行体
def test_login_lexue(self):
#声明登录页面类对象
login_page = LoginPage(self.driver,self.url,u"乐学")
#调用打开页面组件
login_page.open()
#调用用户名输入组件
login_page.input_username(self.username)
#调用输入密码组件
login_page.input_password(self.password)
#调用点击登录按钮组件
login_page.click_submit()

def tearDown(self):
self.driver.quit()

if __name__ == '__main__':

unittest.main()

好啦,这就是简单的一个自动化测试框架,接下来我会在此基础上不断加入数据驱动测试、断言等,使自动化框架越来越趋向“成熟”,谢谢。新人一枚,若文中有任何错误,请留言,欢迎指教。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
测试小公主 发布了4 篇原创文章 · 获赞 0 · 访问量 74 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: