Python实现Selenium自动化Page模式


Posted in Python onJuly 14, 2019

Selenium是当前主流的web自动化工具,提供了多种浏览器的支持(Chrome,Firefox, IE等等),当然大家也可以用自己喜欢的语言(Java,C#,Python等)来写用例,很容易上手。当大家写完第一个自动化用例的时候肯定感觉”哇...好牛x“,但是大家用余光扫了一下代码后,内心也许是崩溃的,因为太乱了!像这样:

__author__ = 'xua'

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import unittest

class TCRepeatLogin(unittest.TestCase):
  def setUp(self):

    #webdriver
    self.driver = webdriver.Chrome(r'C:\Users\xua\Downloads\chromedriver_win32\chromedriver.exe')
    self.driver.implicitly_wait(30)
    self.base_url = "http://10.222.30.145:9000/"

  def test_(self):
    driver = self.driver
    driver.get(self.base_url)

    #enter username and password
    driver.find_element_by_id("username").clear()
    driver.find_element_by_id("username").send_keys("sbxadmin")
    driver.find_element_by_id("password").clear()
    driver.find_element_by_id("password").send_keys("IGTtest1"+Keys.RETURN)

    #find dialog and check
    dialogTitle = driver.find_element(By.XPATH,'//html/body/div[7]/div/div/div[1]/h3')
    self.assertEqual("Sign in",dialogTitle.text)

    #find cancel button and click
    cancelBtn = driver.find_element(By.XPATH,'//html/body/div[7]/div/div/div[3]/button[2]')
    cancelBtn.click()

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

if __name__ == "__main__":
  unittest.main()

从几点来分析下上边的代码:

1. 易读性:非常难理解。这么多find element?这难道也是test case?

2. 可扩展性:都是一个个孤立的test case,无扩展性可言

3. 可复用性:无公共方法,很难提到复用

4. 可维护性:一旦页面元素修改,则需要相应修改所有相关用例,effort大

基于以上的问题,Python为我们提供了Page模式来管理测试,它大概是这样子的:(TestCase中的虚线箭头应该是指向各个page,家里电脑没装修改软件,就不改了:))

Python实现Selenium自动化Page模式

关于Page模式:

1. 抽象出来一个BasePage基类,它包含一个指向Selenium.webdriver的属性

2. 每一个webpage都继承自BasePage基类,通过driver来获取本页面的元素,每个页面的操作都抽象为一个个方法

3. TestCase继承自unittest.Testcase类,并依赖相应的Page类来实现相应的test case步骤

利用Page模式实现上边的用例,代码如下:

BasePage.py:

__author__ = 'xua'

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys


#super class
class BasePage(object):
  def __init__(self, driver):
    self.driver = driver


class LoginPage(BasePage):
  
  #page element identifier
  usename = (By.ID,'username')
  password = (By.ID, 'password')
  dialogTitle = (By.XPATH,'//html/body/div[7]/div/div/div[1]/h3')
  cancelButton = (By.XPATH,'//html/body/div[7]/div/div/div[3]/button[2]')

  #Get username textbox and input username
  def set_username(self,username):
    name = self.driver.find_element(*LoginPage.usename)
    name.send_keys(username)
  
  #Get password textbox and input password, then hit return
  def set_password(self, password):
    pwd = self.driver.find_element(*LoginPage.password)
    pwd.send_keys(password + Keys.RETURN)

  #Get pop up dialog title
  def get_DiaglogTitle(self):
    digTitle = self.driver.find_element(*LoginPage.dialogTitle)
    return digTitle.text

  #Get "cancel" button and then click
  def click_cancel(self):
    cancelbtn = self.driver.find_element(*LoginPage.cancelButton)
    cancelbtn.click()

Test_Login.py:

__author__ = 'xua'

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.alert import Alert
import unittest
import time
import BasePage

class Test_Login(unittest.TestCase):

  #Setup
  def setUp(self):
    self.driver = webdriver.Chrome(r'C:\Users\xua\Downloads\chromedriver_win32\chromedriver.exe')
    self.driver.implicitly_wait(30)
    self.base_url = "http://10.222.30.145:9000/"
  #tearDown
  def tearDown(self):
    self.driver.close()

  def test_Login(self):
    #Step1: open base site
    self.driver.get(self.base_url)
    #Step2: Open Login page
    login_page = BasePage.LoginPage(self.driver)
    #Step3: Enter username
    login_page.set_username("sbXadmin")
    #Step4: Enter password
    login_page.set_password("IGTtest1")
    #Checkpoint1: Check popup dialog title
    self.assertEqual(login_page.get_DiaglogTitle(),"Sign in")
    #Step5: Cancel dialog
    login_page.click_cancel()


if __name__ == "__main__":
  unittest.main()

Ok, 那么我们回头来看,Page模式是否解决了上边的四个方面的问题:

1. 易读性: 现在单看test_login方法,确实有点test case的样子了,每一步都很明了

2. 可扩展性:由于把每个page的元素操作都集成到一个page类中,所以增删改查都和方便

3. 可复用性: page的基本操作都变成了一个个的方法,在不同的test case中可以重复使用

4. 可维护性:如果页面修改,只需修改相应page类中的方法即可,无需修改每个test case

总结:

Page模式给我们提供了一个很好的页面和用例实现的分离机制,降低了耦合,提高了内聚,可以使我们在web自动化中做到游刃有余。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
从零学Python之入门(三)序列
May 25 Python
python服务器端收发请求的实现代码
Sep 29 Python
使用Python构建Hopfield网络的教程
Apr 14 Python
python+mongodb数据抓取详细介绍
Oct 25 Python
python高阶爬虫实战分析
Jul 29 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
python中的decimal类型转换实例详解
Jun 26 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
Keras Convolution1D与Convolution2D区别说明
May 22 Python
基于Python绘制个人足迹地图
Jun 01 Python
解析目标检测之IoU
Jun 26 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 #Python
python基于Selenium的web自动化框架
Jul 14 #Python
Django项目使用CircleCI的方法示例
Jul 14 #Python
Python实现最常见加密方式详解
Jul 13 #Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 #Python
简单了解python反射机制的一些知识
Jul 13 #Python
Python3内置模块之base64编解码方法详解
Jul 13 #Python
You might like
德生PL990的分析评价
2021/03/02 无线电
php桥接模式应用案例分析
2019/10/23 PHP
js取值中form.all和不加all的区别介绍
2014/01/20 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
vue货币过滤器的实现方法
2017/04/01 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
vue如何截取字符串
2019/05/06 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
Vue请求java服务端并返回数据代码实例
2019/11/28 Javascript
JavaScript如何操作css
2020/10/24 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
Python使用Supervisor来管理进程的方法
2015/05/28 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
python实现控制台输出彩色字体
2020/04/05 Python
python requests.get带header
2020/05/05 Python
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
Linux上比较文件的命令都有哪些
2012/02/24 面试题
财务会计自荐信范文
2014/02/21 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
信用卡工资证明范本
2015/06/19 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python