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 相关文章推荐
使用IPython来操作Docker容器的入门指引
Apr 08 Python
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
python筛选出两个文件中重复行的方法
May 31 Python
对numpy中shape的深入理解
Jun 15 Python
python环境路径配置以及命令行运行脚本
Apr 02 Python
python中JWT用户认证的实现
May 18 Python
Django QuerySet查询集原理及代码实例
Jun 13 Python
解决Keras 自定义层时遇到版本的问题
Jun 16 Python
python三子棋游戏
May 04 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 删除数组元素
2009/01/16 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
PHP实现的简单sha1加密功能示例
2017/08/27 PHP
动态添加js事件实现代码
2009/03/12 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
2017/11/17 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
vue-cli设置css不生效的解决方法
2020/02/07 Javascript
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
Python实现子类调用父类的方法
2014/11/10 Python
Python通过poll实现异步IO的方法
2015/06/04 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
Python中一行和多行import模块问题
2018/04/01 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
python的setattr函数实例用法
2020/12/16 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
生物科学专业个人求职信范文
2013/12/07 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
i7 6700处理器相当于i5几代
2022/04/19 数码科技
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技