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

安装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.hqwc.cn/news/333834.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu系统(9):ubuntu 20.02安装pydot

目录 警告信息 1、确保安装了Python和pip 2、安装Graphviz软件包 3、pip安装pydot 验证 在gem5中&#xff0c;pydot库用于生成图形化输出&#xff0c;特别是生成.dot文件和相关的图像文件&#xff0c;如PDF、PNG等。它与gem5结合使用的一个常见用途是生成系统结构图、内存…

多目标loss平衡和多目标融合推理

多目标loss平衡&#xff1a; 优化方法更多的考虑的是在已有结构下&#xff0c;更好地结合任务进行训练和参数优化&#xff0c;它从Loss与梯度的维度去思考不同任务之间的关系。在优化过程中缓解梯度冲突&#xff0c;参数撕扯&#xff0c;尽量达到多任务的平衡优化。 GradNorm …

软件工程:用例图相关知识和多实例分析

目录 一、用例图相关知识 1. 基本介绍 2. 常用符号 二、用例图实例分析 1. 新闻管理系统 2. 医院病房监护系统 3. 实验上机安排系统 4. 远程网络教学系统 一、用例图相关知识 1. 基本介绍 用例图&#xff08;use case diagram&#xff09;是用户与系统交互的最简表示…

Python 安卓开发:Kivy、BeeWare、Flet、

kivy&#xff1a;https://github.com/kivy python-for-android &#xff1a;https://python-for-android.readthedocs.io/en/latest/ BeeWare&#xff1a;https://docs.beeware.org/en/latest/ Flet&#xff1a;https://github.com/flet-dev/flet 把 PySide6 移植到安卓上去&a…

【Python机器学习】决策树——树的特征重要性

利用一些有用的属性来总结树的工作原理&#xff0c;其中最常用的事特征重要性&#xff0c;它为每个特征树的决策的重要性进行排序。对于每个特征来说&#xff0c;它都是介于0到1之间的数字&#xff0c;其中0代表“根本没有用到”&#xff0c;1代表“完美预测目标值”。特征重要…

猫头虎分享:Linux 如何安装最新版的Docker和Docker-Compose 教程 ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

【SkyWant.[2304]】路由器操作系统,移动【Netkeeper】使用教程校园网

目录 步骤一&#xff1a;正确连接网线&#xff0c;插电开机正确连接网线&#xff1a; 认识系统灯&#xff1a; 插电开机&#xff1a; 步骤二&#xff1a;开机之后&#xff0c;系统的基本设置 1.进入设置界面&#xff1a; 2.设置辅助热点wifi&#xff1a; 3.设置日常…

现代 C++ 及 C++ 的演变

C 活跃在程序设计领域。该语言写入了许多新项目&#xff0c;而且据 TIOBE 排行榜数据显示&#xff0c;C 的受欢迎度和使用率位居第 4&#xff0c;仅次于 Python、Java 和 C。 尽管 C 在过去二十年里的 TIOBE 排名都位居前列&#xff08;2008 年 2 月排在第 5 名&#xff0c;到…

React Native集成到现有原生应用

本篇文章以MacOS环境开发iOS平台为例&#xff0c;记录一下在原生APP基础上集成React Native React Native中文网 详细介绍了搭建环境和集成RN的步骤。 环境搭建 必须安装的依赖有&#xff1a;Node、Watchman、Xcode 和 CocoaPods。 安装Homebrew Homebrew是一款Mac OS平台下…

二叉树题目:好叶子结点对的数量

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;好叶子结点对的数量 出处&#xff1a;1530. 好叶子结点对的数量 难度 6 级 题目描述 要求 给定二叉树的根结点 root \texttt{root} root 和整数 …

基于Github官方教程的快速入门学习

GitHub 是一个用于版本控制和协作的代码托管平台。 它允许您和其他人随时随地协同处理项目。 创建仓库 在任何页面的右上角&#xff0c;使用 下拉菜单选择“新建存储库”。 之后会进入创建仓库的界面&#xff0c;需要我们进行如下操作&#xff1a; 写仓库的名字写对于本仓库…

Mate X5对应用进行专门适配,刷视频和文章的体验比直板机强太多

虽然说折叠机是否适合当主力机使用一直是一个有争议的问题&#xff0c;但折叠机在阅读浏览方面的体验真的是要比直板机强太多。 比如办公时&#xff0c;各种表格报单、海报PPT都是更大更清晰&#xff0c;一览无遗&#xff0c;体验过基本就回不去了。 而华为的最新折叠屏&…