教你怎么用python selenium实现自动化测试


Posted in Python onMay 27, 2021

一、安装selenium

打开命令控制符输入:pip install -U selenium

火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能

Selenium IDE 是嵌入到Firefox 浏览器中的一个插件,实现简单的浏览器操 作的录制与回放功能,IDE 录制的脚本可以可以转换成多种语言,从而帮助我们快速的开发脚本,下载地址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/

如何使用IDE录制脚本:点击seleniumIDE——点击录制——开始录制——录制完成后点击文件Export Test Case——python/unittest/Webdriver——保存;

二、安装python

安装的时候,推荐选择“Add exe to path”,将会自动添加Python的程序到环境变量中。然后可以在命令行输入 python -V 检测安装的Python版本。

浏览器内壳:IE、chrome、FireFox、Safari

1、webdriver:用unittest框架写自动化用例(setUp:前置条件,tearDown清场) 

import unittest
from selenium import webdriver
 
class Ranzhi(unittest.TestCase):
  def setUp(self):
    self.driver = webdriver.Firefox() #选择火狐浏览器
  def test_ranzhi(self):
    pass
  def tearDown(self):
    self.driver.quit()#退出浏览器

2、断言,检查跳转的网页是否和实际一致

断言网址时需注意是否为伪静态(PATH_INFO)或者GET,前者采用路径传参数(sys/user-creat.html),后者通过字符查询传参数(sys/index.php?m=user&f=index)

当采用不同方式校验网址会发现变化。

self.assertEqual("http://localhost:8080/ranzhi/www/s/index.php?m=index&f=index",
         self.driver.current_url, "登录跳转失败")

教你怎么用python selenium实现自动化测试

3、定位元素,在html里面,元素具有各种各样的属性。我们可以通过这样唯一区别其他元素的属性来定位到这个元素.

WebDriver提供了一系列的元素定位方法。常见的有以下几种:id,name,link text,partial link text,xpath,css seletor,class,tag.

self.driver.find_element_by_xpath('//*[@id="s-menu-superadmin"]/button').click()
self.driver.find_element_by_id('account').send_keys('admin')
self.driver.find_element_by_link_text(u'退出').click()

定位元素需注意的问题:

a.时间不够,采用两种方式(self.implicitly_wait(30),sleep(2))

b.函数嵌套(<iframe></iframe>)

# 进入嵌套
 self.driver.switch_to.frame('iframe-superadmin')
#退出嵌套
 self.driver.switch_to.default_content()

c.flash,验证码(关闭验证码或使用万能码)

d.xpath问题:最好采用最简xpath,当xpath中出现li[10]等时需注意,有时页面定位会出现问题

4、采用CSV存数据

CSV:以纯文本形式存储表格数据(数字和文本),CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。大量程序都支持某种CSV变体,至少是作为一种可选择的输入/输出格式。

melody101,melody101,m,1,3,123456,@qq.com
melody102,melody101,f,2,5,123456,@qq.com
melody103,melody101,m,3,2,123456,@qq.com
import csv
# 读取CSV文件到user_list字典类型变量中
user_list = csv.reader(open("list_to_user.csv", "r"))
# 遍历整个user_list
for user in user_list:
  sleep(2)
  self.logn_in('admin', 'admin')
  sleep(2)
  # 读取一行csv,并分别赋值到user_to_add 中
  user_to_add = {'account': user[0],
          'realname': user[1],
          'gender': user[2],
          'dept': user[3],
          'role': user[4],
           'password': user[5],
           'email': user[0] + user[6]}
   self.add_user(user_to_add)

5、对下拉列表的定位采用select标签

from selenium.webdriver.support.select import Select
# 选择部门
dp =self.driver.find_element_by_id('dept')
Select(dp).select_by_index(user['dept'])
# 选择角色
Select(self.driver.find_element_by_id('role')).select_by_index(user['role'])

6、模块化代码

需要对自动化重复编写的脚本进行重构(refactor),将重复的脚本抽取出来,放到指定的代码文件中,作为共用的功能模块。使用模块化代码注意需倒入该代码。

#模块化代码后引用,需导入代码模块
from ranzhi_lib import RanzhiLib
self.lib = RanzhiLib(self.driver)
# 点击后台管理
self.lib.click_admin_app()
sleep(2)
# 点击添加用户
self.lib.click_add_user()
# 添加用户
self.lib.add_user(user_to_add)
sleep(1)
# 退出
self.lib.logn_out()
sleep(2)

7、自定义函数运行的先后顺序:完整的单元测试很少只执行一个测试用例,开发人员通常都需要编写多个测试用例才能对某一软件功能进行比较完整的测试,这些相关的测试用例称为一个测试用例集,在PyUnit中是用TestSuite类来表示,采用unittest.TestSuite()。

PyUnit使用TestRunner类作为测试用例的基本执行环境,来驱动整个单元测试过程。Python开发人员在进行单元测试时一般不直接使用TestRunner类,而是使用其子类TextTestRunner来完成测试。

# 构造测试集
suite = unittest.TestSuite()
suite.addTest(RanzhiTest("test_login"))
suite.addTest(RanzhiTest("test_ranzhi"))
  
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)

以下代码为登录“然之系统”,进入添加用户,循环添加用户并检测添加成功,再退出的过程。以下程序分别为主程序,模块化程序,执行程序,CSV文件

import csv
import unittest
from time import sleep
 
from selenium import webdriver
# 模块化代码后引用需导入代码模块
from ranzhi_lib import RanzhiLib
 
 
class Ranzhi(unittest.TestCase):
  def setUp(self):
    self.driver = webdriver.Firefox()
    self.lib = RanzhiLib(self.driver)
 
  # 主函数
  def test_ranzhi(self):
    # 读取CSV文件到user_list字典类型变量中
    user_list = csv.reader(open("list_to_user.csv", "r"))
    # 遍历整个user_list
    for user in user_list:
      sleep(2)
      self.lib.logn_in('admin', 'admin')
      sleep(2)
      # 断言
      self.assertEqual("http://localhost:8080/ranzhi/www/sys/index.html",
               self.driver.current_url,
               '登录跳转失败')
      # 读取一行csv,并分别赋值到user_to_add 中
      user_to_add = {'account': user[0],
              'realname': user[1],
              'gender': user[2],
              'dept': user[3],
              'role': user[4],
              'password': user[5],
              'email': user[0] + user[6]}
      # 点击后台管理
      self.lib.click_admin_app()
      # 进入嵌套
      self.lib.driver.switch_to.frame('iframe-superadmin')
      sleep(2)
      # 点击添加用户
      self.lib.click_add_user()
      # 添加用户
      self.lib.add_user(user_to_add)
      # 退出嵌套
      self.driver.switch_to.default_content()
      sleep(1)
      # 退出
      self.lib.logn_out()
      sleep(2)
      # 用新账号登录
      self.lib.logn_in(user_to_add['account'], user_to_add['password'])
      sleep(2)
      self.lib.logn_out()
      sleep(2)
 
  def tearDown(self):
    self.driver.quit()
from time import sleep
 
from selenium.webdriver.support.select import Select
 
 
class RanzhiLib():
  # 构造方法
  def __init__(self, driver):
    self.driver = driver
 
  # 模块化添加用户
  def add_user(self, user):
    driver = self.driver
    # 添加用户名
    ac = driver.find_element_by_id('account')
    ac.send_keys(user['account'])
    # 真实姓名
    rn = driver.find_element_by_id('realname')
    rn.clear()
    rn.send_keys(user['realname'])
    # 选择性别
    if user['gender'] == 'm':
      driver.find_element_by_id('gender2').click()
    elif user['gender'] == 'f':
      driver.find_element_by_id('gender1').click()
    # 选择部门
    dp = driver.find_element_by_id('dept')
    Select(dp).select_by_index(user['dept'])
    # 选择角色
    role = driver.find_element_by_id('role')
    Select(role).select_by_index(user['role'])
    # 输入密码
    pwd1 = driver.find_element_by_id('password1')
    pwd1.clear()
    pwd1.send_keys(user['password'])
 
    pwd2 = driver.find_element_by_id('password2')
    pwd2.send_keys(user['password'])
    # 输入邮箱
    em = driver.find_element_by_id('email')
    em.send_keys(user['email'])
    # 点击保存
    driver.find_element_by_id('submit').click()
    sleep(2)
 
  # 登录账号
  def logn_in(self, name, password):
    driver = self.driver
    driver.get('http://localhost:8080/ranzhi/www')
    sleep(2)
 
    driver.find_element_by_id('account').clear()
    driver.find_element_by_id('account').send_keys(name)
    driver.find_element_by_id('password').clear()
    driver.find_element_by_id('password').send_keys(password)
    driver.find_element_by_id('submit').click()
    sleep(2)
 
  # 退出账号
  def logn_out(self):
    self.driver.find_element_by_id('start').click()
    sleep(4)
    self.driver.find_element_by_link_text(u'退出').click()
    sleep(3)
 
  # 点击后台管理
  def click_admin_app(self):
    self.driver.find_element_by_xpath('//*[@id="s-menu-superadmin"]/button').click()
    sleep(1)
 
  def click_add_user(self):
    self.driver.find_element_by_xpath('//*[@id="shortcutBox"]/div/div[1]/div/a/h3').click()
    sleep(3)
import unittest
 
from ranzhi import Ranzhi
class RanzhiTestRunner():
  def run_tests(self):
    suite = unittest.TestSuite()
    suite.addTest(Ranzhi('test_ranzhi'))
    runner = unittest.TextTestRunner()
    runner.run(suite)
if __name__ == "__main__":
  ranzhi_test_runner = RanzhiTestRunner()
  ranzhi_test_runner.run_tests()

到此这篇关于教你怎么用python selenium实现自动化测试的文章就介绍到这了,更多相关selenium实现自动化测试内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python利用beautifulSoup实现爬虫
Sep 29 Python
python使用socket向客户端发送数据的方法
Apr 29 Python
python中__slots__用法实例
Jun 04 Python
Python中的zipfile模块使用详解
Jun 25 Python
Python实现高效求解素数代码实例
Jun 30 Python
Python Paramiko模块的使用实际案例
Feb 01 Python
Python docx库用法示例分析
Feb 16 Python
python中property和setter装饰器用法
Dec 19 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
Python 实现使用空值进行赋值 None
Mar 12 Python
python数据抓取3种方法总结
Feb 07 Python
python manim实现排序算法动画示例
Aug 14 Python
Python Django框架介绍之模板标签及模板的继承
May 27 #Python
python 算法题——快乐数的多种解法
May 27 #Python
用Python监控你的朋友都在浏览哪些网站?
Python图片处理之图片裁剪教程
用Python进行栅格数据的分区统计和批量提取
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
You might like
php 缩略图实现函数代码
2011/06/23 PHP
PHP多个版本的分析解释
2011/07/21 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
php常见的页面跳转方法汇总
2015/04/15 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
python颜色随机生成器的实例代码
2020/01/10 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
国旗下的讲话演讲稿
2014/05/08 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
环境卫生倡议书
2014/08/29 职场文书
奉献爱心演讲稿
2014/09/04 职场文书
女儿满月酒致辞
2015/07/29 职场文书
公司车队管理制度
2015/08/04 职场文书
运动会100米广播稿
2015/08/19 职场文书
python脚本框架webpy的url映射详解
2021/11/20 Python