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编程中的反模式实例分析
Dec 08 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
Python 占位符的使用方法详解
Jul 10 Python
Python流程控制 if else实现解析
Sep 02 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
python构造函数init实例方法解析
Jan 19 Python
Python socket连接中的粘包、精确传输问题实例分析
Mar 24 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
详解用python -m http.server搭一个简易的本地局域网
Sep 24 Python
python实现磁盘日志清理的示例
Nov 05 Python
用 python 进行微信好友信息分析
Nov 28 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
探讨方法的重写(覆载)详解
2013/06/08 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
jQuery代码实现实时获取时间
2017/01/29 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
如何实现vue的tree组件
2020/12/03 Vue.js
把pandas转换int型为str型的方法
2019/01/29 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
Python如何使用字符打印照片
2020/01/03 Python
详解Python IO编程
2020/07/24 Python
python实现磁盘日志清理的示例
2020/11/05 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
给排水专业应届生求职信
2013/10/12 职场文书
简短的公司员工自我评价分享
2013/11/13 职场文书
秋季运动会活动方案
2014/02/05 职场文书
说明书范文
2014/05/07 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
python中opencv实现图片文本倾斜校正
2021/06/11 Python
MySQL里面的子查询的基本使用
2021/08/02 MySQL