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

news2024/12/27 14:23:15

安装selenium

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

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

Selenium IDE 是嵌入到Firefox 浏览器中的一个插件,实现简单的浏览器操 作的录制与回放功能,IDE 录制的脚本可以可以转换成多种语言,从而帮助我们快速的开发脚本,下载地址:Selenium IDE – Get this Extension for 🦊 Firefox (en-US)

如何使用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清场) 

1

2

3

4

5

6

7

8

9

10

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)

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

1

2

self.assertEqual("http://localhost:8080/ranzhi/www/s/index.php?m=index&f=index",

        self.driver.current_url, "登录跳转失败")

 

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

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

1

2

3

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>)

1

2

3

4

# 进入嵌套

 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变体,至少是作为一种可选择的输入/输出格式。

1

2

3

melody101,melody101,m,1,3,123456,@qq.com

melody102,melody101,f,2,5,123456,@qq.com

melody103,melody101,m,3,2,123456,@qq.com

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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标签

1

2

3

4

5

6

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),将重复的脚本抽取出来,放到指定的代码文件中,作为共用的功能模块。使用模块化代码注意需倒入该代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#模块化代码后引用,需导入代码模块

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)

1

2

3

4

class RanzhiLib():

  # 构造方法

  def __init__(self, driver):

   self.driver = driver

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

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

1

2

3

4

5

6

7

8

# 构造测试集

suite = unittest.TestSuite()

suite.addTest(RanzhiTest("test_login"))

suite.addTest(RanzhiTest("test_ranzhi"))

   

# 执行测试

runner = unittest.TextTestRunner()

runner.run(suite)

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

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()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

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)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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()

1

2

3

melody109,melody101,m,1,3,123456,@qq.com

melody106,melody101,f,2,5,123456,@qq.com

melody107,melody101,m,3,2,123456,@qq.com

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1369877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何克隆驱动器,不同的操作系统有不同的推荐软件

你需要将Windows或macOS安装迁移到新驱动器吗?你可以使用服务备份文件,也可以创建数据的完整一对一副本。通过克隆你的驱动器,你可以创建一个精确的副本。 一些业务级别的备份服务,如IDrive和Acronis,具有内置的磁盘克隆功能,是对正常文件备份的补充。但对于一次性克隆(…

BitMap解析(一)

文章目录 前言数据结构添加与删除操作 JDK中BitSet源码解析重要成员属性初始化添加数据清除数据获取数据size和length方法集合操作&#xff1a;与、或、异或 前言 为什么称为bitmap&#xff1f; bitmap不仅仅存储介质以及数据结构不同于hashmap&#xff0c;存储的key和value也…

在python里面探索web框架

一、常识性知识 python Web框架三巨头&#xff1a;Flask&#xff08;简单易学&#xff09;、Django(复杂庞大)、FastAPI 1. Django&#xff1a;Django是一个高级的Web框架&#xff0c;它提供了强大的功能和工具&#xff0c;用于快速开发复杂的Web应用程序。 2. Flask&#xff…

海外社媒运营为什么需要选择优质IP代理?

跨境电商卖家尤其需要关注海外社媒运营&#xff0c;想要更好地运营Instagram、Facebook、TikTok 或 Twitter等&#xff0c;挖掘社媒潜力需要采取战略方法&#xff0c;而社交媒体IP代理在这一活动中发挥着至关重要的作用&#xff0c;下面为你详细介绍。 一、社交媒体代理IP及其运…

新年喝酒有讲究,怎么喝葡萄酒呢?

中国的新年有着独特又深远的意义&#xff0c;无论人在天涯海角&#xff0c;回家团圆是每个人的心愿。新年亲朋好友欢聚一堂&#xff0c;没有酒哪有气氛&#xff0c;所以喝酒是必不可少的活动项目。云仓酒庄的品牌雷盛红酒LEESON分享那么&#xff0c;新年喝啥酒&#xff0c;葡萄…

C# 一看就懂的装箱拆箱案例

文章目录 装箱&#xff08;Boxing&#xff09;拆箱&#xff08;Unboxing&#xff09;编程语言中的装箱与拆箱优缺点 在C#中&#xff0c;装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;是值类型与引用类型之间相互转换的过程。 装箱&#xff08;Box…

【Qt打包】Qt打包生成可安装exe文件

第三方打包 gitee 项目地址&#xff1a;https://gitee.com/hudejie/universal-software-installation-package 纯净包备份&#xff08;v0.1&#xff09;&#xff1a;https://download.csdn.net/download/weixin_45863921/88720027 1 项目介绍 作者项目介绍&#xff1a; 基于NS…

通用机V8R6集群部署_1主1备1见证_图形化_Centos7

KingbaseES 提供数据库部署工具进行数据库集群的部署。KingbaseES 提供基于图形化和命令行操作的集群部署方式&#xff0c;本文档主要用于指导不支持 GUI 的服务器上的 KingbaseES 集群部署工作。 集群简介 KingbaseES软件能够提供一主一备以及一主多备的高可用集群架构&…

Python轴承故障诊断 (十)基于VMD+CNN-Transfromer的故障分类

目录 1 变分模态分解VMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 故障VMD分解可视化 3 基于VMDCNN-Transformer的轴承故障诊断分类 3.1 定义VMD-CNN-Transformer分类网络模型 3.2 设置参数&#xff0c;训练模型 3.3 模型评估 代码、数据如下&#xff1a…

大图切片预览

文章目录 前言处理流程完整代码前端预览 前言 最近有需求&#xff0c;前端要预览百兆以上的大图&#xff0c;这直接访问应该就不太行了&#xff0c;系统打开都在加载好一会儿&#xff0c;刚好从事的又是 gis 行业&#xff0c;于是打算用类似加载地图的方式来切片加载大图。这里…

【HarmonyOS】掌握 Stage 模型的核心概念与应用

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

谷歌提出「边界注意力」模型,实现超越像素级检测精度!微弱边界也逃不过

有些情况下&#xff0c;当面临分辨率较低的图像时&#xff0c;可能会在进行诸如目标检测和图像分割等任务时遇到一些挑战和阻碍。这是因为低分辨率图像可能丢失了细节信息&#xff0c;使得计算机视觉系统难以准确捕捉和理解图像中的关键特征。在这种背景下&#xff0c;传统的方…

Poi实现根据word模板导出-图表篇

往期系列传送门&#xff1a; Poi实现根据word模板导出-文本段落篇 &#xff08;需要完整代码的直接看最后位置&#xff01;&#xff01;&#xff01;&#xff09; 前言&#xff1a; 补充Word中图表的知识&#xff1a; 每个图表在word中都有一个内置的Excel&#xff0c;用于…

kubernetes 容器监控 Sysdig Falco

开头语 写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 内容较长&#xff0c;页面右上角目录方便跳转 Sysdig 监控容器系统调用 介绍 资料 Sysdig:一个非常强大的系统监控、分…

PostgreSQL的常见错误和解决方法

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 在学习新的东西时&#xff0c;会犯很多的错误&#xff0c;会遇到很多坑。我们在填坑与犯错中不断进步成长。 以下是在学习pgsql中…

【驱动序列】C#获取电脑硬件之CPU信息,以及它都有那些品牌

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是是《驱动序列》文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识…

【深度学习】SDXL tensorRT 推理,Stable Diffusion 转onnx,转TensorRT

文章目录 sdxl 转 diffusers转onnx转TensorRT sdxl 转 diffusers def convert_sdxl_to_diffusers(pretrained_ckpt_path, output_diffusers_path):import osos.environ["HF_ENDPOINT"] "https://hf-mirror.com" # 设置 HF 镜像源&#xff08;国内用户使…

k8s的集群调度:

k8s的集群调度&#xff1a; Scheduler:负责调度资源&#xff0c;把pod调度到node节点 预算策略 优先策略 list-watch k8s集群当中&#xff0c;通过list-watch的机制进行每个组件的协作&#xff0c;保持数据同步&#xff0c;每个组件之间的解耦 Kubectl配置文件&#xff0c…

1.9 day7 IO进程线程

使用消息队列完成两个进程间的通信 进程1 #include <myhead.h> struct migbuf {long a;//消息类型char b[1024];//消息正文 }; #define SIZE (sizeof(struct migbuf)-sizeof(long)) int main(int argc, const char *argv[]) {//创建key值key_t key0;if((keyftok(".…

从文本(.txt)文件中读取数据时出现中文乱码

前言 当需要从记事本中读取数据时&#xff0c;发现读取的数据会出现中文乱码&#xff0c;我尝试了C和C读取文件&#xff0c;发现都是这样。 乱码原因 文本文件的保存默认使用UTF-8编码方式&#xff0c;而VS编译器的编码方式是GBK&#xff0c;所以不同的编码方式导致了乱码。…