Python+Selenium自动化测试项目实战

第 1 章 自动化测试

1.1、自动化测试介绍

自动化测试就是通过自动化测试工具帮我们打开浏览器,输入网址,输入账号密码登录,及登录后的操作,总的说来自动化测试就是通过自动化测试脚本来帮我们从繁琐重复的手工测试里面解脱出来,把时间和精力花到更好的地方去,去挖掘更多的产品缺陷。

例如网上有一些人提供智慧树网、学习通等网课的刷课及答题的服务就是通过写自动化测试程序去完成的。还有一些高速抢票平台也是通过定时执行自动化程序脚本代替人工去抢票。

1.2、自动化测试优点

1. 更好的利用资源,节约人力成本;

2. 覆盖更全,提高工作效率;

3. 产品规格统一标准,增加软件的稳定性。

1.3、自动化测试缺点

问题:是不是自动化测试一定会取代手工测试?

答:不一定的,自动化测试只是帮我们从繁琐重复的手工测试里面解脱出来,把时间和精力花到更好的地方去,去挖掘更多的产品缺陷。因凡事都有利弊,自动化测试适合的场景是软件需求变更少,周期长,稳定性较强的项目。如果需求变更多,软件经常进行改版就不适合做整个系统的自动化测试了,因为每一次改版都要去维护测试脚本,但可以抽取部分稳定的功能做自动化测试。

1.4、自动化测试能解决的问题

  1. 高效完成回归测试。回归测试就项目在发新版本之后,对项目之前的功能进行验证;每一次小迭代,加了一个小功能可能会影响整个系统的功能,比如淘宝、京东等大型商城有几十万个商品列表,这样手工去回归验证就会非常麻烦。而使用自动化测试脚本,就可以根据迭代功能修改自动化测试的脚本去验证,没问题就上线,有问题就让开发改完再上线,这样就不用手工去一个个验证,这就是自动化测试的好处。

  1. 解决-兼容性测试,更换不同浏览器的驱动就可以解决兼容性测试。

  1. 提高测试效率,保证产品质量。

第 2 章 Python基础

2.1、Python常用快捷键

Python+Selenium自动化测试项目实战_第1张图片

2.2、函数

在开发程序时,使用函数可以提高编写的效率以及代码的重用。

(1)函数的使用包含两个步骤:

1. 定义函数 —— 封装独立的功能;

2. 调用函数 —— 执行函数的代码;

(2)定义函数的格式如下:

Python+Selenium自动化测试项目实战_第2张图片

函数名称应该能够表达函数封装代码的功能,方便后续的调用。

(3)变量作用域:

1. 局部变量只能在函数内部使用,局部变量从调用函数的时候开始在内存出现,函数调用完毕,局部变量从内存消失;

2. 全局变量从定义变量开始在内存中出现,一直到程序运行完成,和程序一起从内存中消失。

Python+Selenium自动化测试项目实战_第3张图片

在其他的开发语言中,大多不推荐使用全局变量,因为可变范围太大,导致程序不好维护!

2.3、面向对象编程

面向对象就是将世间万物抽象成一个类,然后形成相应的对象。

(1)类

类就是一个模板,是对一群具有相同特征或者行为的事物的一个统称,是抽象的模板,不能直接使用。

1.类的特性----属性;

2.类中行为----方法;

比如猫这个类有年龄,姓名,主人等属性,有学习、跑步、吃饭、睡觉等方法。

(2)对象

对象就是类的实例化,比如猫这个类可以实例化,具体是什么猫。

Python+Selenium自动化测试项目实战_第4张图片

(3)面向对象程序设计三大特性:

  1. 封装:根据职责将属性和方法封装到一个抽象的类中,需要用到的时候导包,就可以调用属性和方法了;

  1. 继承:实现代码的重用,子类继承父类就可以拥有父类的属性和方法,这样相同的代码不需要重复的编写;

  1. 多态:不同的对象调用相同的方法,产生不同的执行结果,这样可以增加代码的灵活度。

第 3 章 元素定位方式

3.1、Selenium3.x提供了八种定位元素方式

1. id

2. name

3. class_name

4. tag_name

5. link_text

6. partial_link_text

7. CSS选择器

8. XPath

Python+Selenium自动化测试项目实战_第5张图片

3.2、id选择器

#找到输入框id后,选中输入框,输入"鹰迅课堂"关键词。

driver.find_element_by_id("kw").send_keys("鹰迅课堂")

3.3、name选择器

driver.find_element_by_name("wd")).send_keys("鹰迅课堂")

3.4、class_name选择器

driver.find_element_by_class_name("s_ipt").send_keys("鹰迅课堂")

3.5、tag_name标签名选择器

ind_element_by_tag_name() 通过标签名去定位,页面相同的标签名重复率多,基本不用。

3.6、link_text超链接内容选择器

Python+Selenium自动化测试项目实战_第6张图片

driver.find_element_by_link_text("点击进入所有课程").click()

3.7、partial_link_text模糊查询

driver.find_element_by_partial_link_text("所有课程").click()

3.8、CSS选择器

Python+Selenium自动化测试项目实战_第7张图片

driver.find_element_by_css_selector("div.row:nth-child(5) > div:nth-child(2) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1) > a:nth-child(1)").click()

3.9、XPath定位方式

driver.find_element_by_xpath("/html/body/div/main/div/div/div[4]/div[2]/div/div/div/div[1]/a").click()

3.10、总结

  1. 定位到一个网页元素后,有输入框使用send_keys(),没有输入框,如果是按钮就用click()进行点击。

  1. 很多时候页面的元素可能是没有id的,没有唯一标识,需求评审的时候可以跟开发约定,网页的元素尽量要有唯一的id和name。

3.11、selenium4定位方式新写法

Python+Selenium自动化测试项目实战_第8张图片

第 4 章

元素 | 浏览器操作方法

4.1、元素常用操作方法

Python+Selenium自动化测试项目实战_第9张图片

4.2、操作浏览器常用方法

Python+Selenium自动化测试项目实战_第10张图片
Python+Selenium自动化测试项目实战_第11张图片

第 5 章 元素等待

元素等待就是——在定位页面元素时如果未找到,会在指定时间内一直等待的过程。

5.4、为什么要设置元素等待

  1. 网络速度慢

  1. 电脑配置低

  1. 服务器处理请求慢

5.4、强制等待

from time import sleep

sleep(10)

强制等待10秒,再执行下一步,缺点是不管资源是不是完成,都必须等待指定的时间。

5.4、隐式等待

(1)概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待,执行下一步;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常 NoSuchElementException 。

(2)方法:driver.implicitly_wait(timeout) (timeout:为等待最大时长,单位:秒) ,driver.implicitly_wait(10) ,最长等待10秒。

(3)说明:隐式等待只需要设置一次,就会作用于全局所有的元素。

5.4、显式等待

概念:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则程序每隔N秒检查一次,如果检查到目标元素,加载完成,执行下一步,否则继续等待,直到超过设置的最长时间,则抛出超时异常 TimeoutException 。

在Selenium中把显式等待的相关方法封装在WebDriverWait类中。

练习题:打开百度,使用显性等待定位百度输入框,如果元素存在,就输入"www.yxclass.net"。

Python+Selenium自动化测试项目实战_第12张图片

5.4、隐性等待与显性等待的区别

  1. 作用域不同:隐式为全局元素,是设置全局的等待,显式等待为单个元素有效。

  1. 使用方法不同:隐式等待直接通过驱动对象调用,而显式等待方法封装在WebDriverWait类中。

  1. 达到最大超时时长后抛出的异常不同:隐式等待默认检测频率为0.5s,超时异常为NoSuchElementException;显式等待超时异常为TimeoutException。

第 6 章

鼠标和键盘操作

6.1、鼠标操作

常见的鼠标操作有:点击、右击、双击、悬停、拖拽等,对于这些鼠标操作Selenium都封装了相应的操作方法。

6.2、鼠标操作的方法

(1)说明:

在Selenium中将操作鼠标的方法封装在ActionChains类中。

(2)实例化对象:

action = ActionChains(driver)

(3)执行鼠标事件原理:

在ActionChains类中所有提供的鼠标事件方法,在调用的时候,所有的行为都存储在ActionChains对象中,调用ActionChains的方法时不会立即执行,会将所有的操作按顺序存放在一个队列里,当调用perform()方法时,队列中的事件会依次执行,先进先出,后进后出。

(4)强调:必须调用perform()方法才能执行鼠标事件。

(5)支持链式写法或者分步写:

ActionChains(driver).click(ele).perform()

(6)鼠标和键盘常用方法列表:

Python+Selenium自动化测试项目实战_第13张图片

Python+Selenium自动化测试项目实战_第14张图片

(7)鼠标和键盘常用方法:

Python+Selenium自动化测试项目实战_第15张图片

(8)例题

Python+Selenium自动化测试项目实战_第16张图片

6.3、键盘操作练习题

(1)Selenium中把键盘的按键都封装在Keys类中,使用时要导包。

(2)导包:from selenium.webdriver.common.keys import Keys

6.4、常用的键盘操作

Python+Selenium自动化测试项目实战_第17张图片

Python+Selenium自动化测试项目实战_第18张图片

练习题:在百度浏览器搜索框输入www.yxclass.net,然后粘贴到搜狗浏览器的搜索框进行搜索。

Python+Selenium自动化测试项目实战_第19张图片

6.5、自动化测试答题

Python+Selenium自动化测试项目实战_第20张图片

单选框是这样答,多选题也是一样的回答方法。

Python+Selenium自动化测试项目实战_第21张图片

6.6、弹窗处理

应用场景:

  1. 删除在线商城购物车的商品,在删除时,需要选择是否删除。

  1. 在播放视频课程中也会有一些答题窗口,答题后才能继续播放视频。

弹出框处理方法:

  1. 获取弹出框对象:alert = driver.switch_to.alert

  1. 调用:

  • alert.text --> 返回alert/confirm/prompt中的文字信息

  • alert.accept() --> 接受对话框选项

  • alert.dismiss() --> 取消对话框选项

练习题:点击confirm后,弹出页面提示框选择“确定”。

Python+Selenium自动化测试项目实战_第22张图片

答了一题没法自动切换到下一题的话,就要调用switch_to_alert()方法切换窗口。

Python+Selenium自动化测试项目实战_第23张图片

6.7、下拉选择框

(1)说明:

Select类是Selenium为操作select标签特殊封装的。

(2)实例化对象:

select = Select(element)

element: