selenium+python实现基本自动化测试的示例代码


Posted in Python onJanuary 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, "登录跳转失败")

selenium+python实现基本自动化测试的示例代码

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)
class RanzhiLib():
   # 构造方法
   def __init__(self, driver):
     self.driver = driver

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

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

详情请查看:http://www.ibm.com/developerworks/cn/linux/l-pyunit/

# 构造测试集
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()

melody109,melody101,m,1,3,123456,@qq.com
melody106,melody101,f,2,5,123456,@qq.com
melody107,melody101,m,3,2,123456,@qq.com

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

Python 相关文章推荐
Python文件夹与文件的操作实现代码
Jul 13 Python
Python求解平方根的方法
Mar 11 Python
Python3指定路径寻找符合匹配模式文件
May 22 Python
python中模块的__all__属性详解
Oct 26 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
python使用Plotly绘图工具绘制柱状图
Apr 01 Python
python制作图片缩略图
Apr 30 Python
python pandas生成时间列表
Jun 29 Python
django中forms组件的使用与注意
Jul 08 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
Python实现汇率转换操作
May 03 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
Python开发.exe小工具的详细步骤
Jan 27 #Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 #Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 #Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 #Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 #Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 #Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 #Python
You might like
php strtotime 函数UNIX时间戳
2009/01/14 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
专科毕业生求职简历的自我评价
2013/10/12 职场文书
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
司机职责范本
2014/03/08 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
计算机毕业生求职信
2014/06/10 职场文书
八一建军节演讲稿
2014/09/10 职场文书
打架赔偿协议书范本
2014/10/26 职场文书
投标单位介绍信
2015/05/05 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
红领巾广播站广播稿
2015/08/19 职场文书