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实现比较两个列表(list)范围
Jun 12 Python
python简单商城购物车实例代码
Mar 15 Python
TensorFlow用expand_dim()来增加维度的方法
Jul 26 Python
python 处理string到hex脚本的方法
Oct 26 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
Aug 02 Python
python实现网站用户名密码自动登录功能
Aug 09 Python
python实现飞机大战小游戏
Nov 08 Python
Python sep参数使用方法详解
Feb 12 Python
Python基于Socket实现简单聊天室
Feb 17 Python
python里反向传播算法详解
Nov 22 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
初识php MVC
2014/09/10 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
python操作MongoDB基础知识
2013/11/01 Python
Python中replace方法实例分析
2014/08/20 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
Python实现KNN邻近算法
2021/01/28 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
美国在线购物频道:Shop LC
2019/04/21 全球购物
高中军训感言1000字
2014/03/01 职场文书
父母对孩子的寄语
2014/04/09 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
民事答辩状范本
2015/05/21 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
SpringBoot Http远程调用的方法
2022/08/14 Java/Android