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读写ini文件示例(python读写文件)
Mar 25 Python
python操作redis的方法
Jul 07 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
python调用系统ffmpeg实现视频截图、http发送
Mar 06 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
我就是这样学习Python中的列表
Jun 02 Python
详解python实现交叉验证法与留出法
Jul 11 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Python中zip函数如何使用
Jun 04 Python
Python学习之time模块的基本使用
Jan 17 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 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
一段php加密解密的代码
2007/07/16 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
浅析JavaScript中的类型和对象
2013/11/29 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
javascript中的作用域和闭包详解
2016/01/13 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
django允许外部访问的实例讲解
2018/05/14 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
Python get获取页面cookie代码实例
2018/09/12 Python
ipython和python区别详解
2019/06/26 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
video实现有声音自动播放的实现方法
2020/05/20 HTML / CSS
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
医学类导师推荐信范文
2013/11/19 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
教师年度个人总结
2015/02/11 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
Java基础——Map集合
2022/04/01 Java/Android
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js