webselenium自动化测试

本文详细介绍了自动化测试的发展,特别聚焦于Selenium这一Web自动化测试框架。内容包括Selenium的不同版本、自动化测试的优缺点、适用阶段,以及Selenium的定位方法如ID、name、class等。此外,还探讨了自动化测试无法完全取代手工测试的原因,并提到了自动化测试在回归测试、版本稳定状态和频繁迭代中的应用。
摘要由CSDN通过智能技术生成

这里面写的是以前的一些笔记!和大家分享一下,希望能帮到大家!

自动化_Selenium_5_21
1.自动化测试的发展:
手工测试:以人为驱动的测试;弊端:人长时间进行同一项目的测试,会产生疲劳感,并且后期的bug发现率会降低(做重复性的事情);无法完成所有类型的测试(性能、自动化…)
自动化第一代:录制-回放模式(通过某种工具进行录制所设定的业务流,可以产生对应的脚本,脚本只需要稍加修改相关的参数即可回放:QTP–UFT)
自动化第二代:数据驱动(对象库的操作:对数据的描述(属性)以及对数据的操作(方法),通过元素进行定位获取);根据所设定的业务流进行通过工具所自带的对象库编写脚本
自动化第三代:关键字驱动(相当于对数据驱动的对象库进行封装,将每个操作封装到一个个关键字中,直接调用即可)
2.手工测试能否被自动化测试取代:
否;无法取代,以因为自动化针对的是项目的稳定版本,前期完全无法测试
3.自动化测试优点:a.释放人力资源 b.提高测试效率 c.自动化测试的脚本可以直接应用于性能从测试中
缺点:a.成本高 b.无法适用于所有类型的项目 c.脚本维护(依赖关系、版本迭代、元素的定位方式、分层结构的处理)过于困难
适用阶段:回归测试阶段、版本稳定状态、版本迭代频繁
4.自动化的含义:以工具为驱动所实现的测试;使用工具进行模拟用户业务场景(鼠标、键盘)
自动化的工具(框架):RF、Selenium、Appium、LR、Jmeter(webrunner、QTP、webLoad…)、按键精灵(外挂)
5.自动化的框架:Selenium:是一款web自动化测试框架,它可以实现跨平台、跨浏览器(兼容不同内核的浏览器)、跨语言(兼容python、java…)
selenium版本:selenium1.0和selenium2.0
selenium1.0=seleniumRC+seleniumIDE+seleniumGrid
selenium2.0=selenium1.0+webdriver
SeleniumGrid:它是一款实现多浏览器分布式执行测试用例的工具
seleniumRC(Remote Client):基于某种协议方式客户端(实际脚本)与服务器(浏览器)进行通讯;实际webdriver就是将seleniumRC进行了底层的封装
seleniumIDE:实现浏览器页面操作的录制以及回放的功能;是firefox浏览器(chrome)中的一款组件;安装有两种方式:1)下安装包 2)通过浏览器扩展组件进行安装
注意:1)seleniumIDE的版本必须与浏览器版本相匹配; 2)在实际工作过程中,seleniumIDE基本不用(数据没有分离、只是单纯的操作业务脚本,没有额外扩展的逻辑以及校验) 3)可以用于辅助参照
6.selenium(webdriver):web驱动器:原理实际就是与SeleniumRC相同;
物理层–数据链路层–网络层–传输层(tcp/udp:tcp:面向连接(三次握手机制) udp:面向无连接)----会话层—表示层—应用层(http)
浏览器:内核:IE、Chrome、FireFox、Opera(欧朋)
1.安装:可以通过pycharm直接安装;
2.驱动器下载地址:chrome的地址是:http://chromedriver.storage.googleapis.com/index.html
firefox的地址是:https://github.com/mozilla/geckodriver/releases/
不同的驱动器版本对应不同的浏览器;不同类型的浏览器具有不同类型的驱动器
注意事项:创建驱动器对象时调用各个浏览器是调用它的类,而不是调用对应的文件夹
3.元素的定位:
html文件实际就是由一系列标签所构成的树状结构文件;标签中具有对应属性和属性值
元素定位的八大种:
a.通过id定位:id是唯一的
如果标签中存在id属性是否一定可以使用id完成定位?
不行滴,因为id可能是动态的;
b.通过name定位:
标签中具有name的属性
c.通过class定位:class表示的是类,类的表示可以通过包、模块进行逐级表示;模块名.包名.类名… 但是在html页面中使用空格进行表示所属关系
1)通过class定位的话,其值不能够出现空格,只能够取其中一部分
2)如果需要将整个class类进行表示出来的话,则可以通过点的形式将包、模块、类名进行连接表示出来
例如:
find_element_by_class(“p-o-btn.contrast.J_contrast”)
div:块级标签,会实现换行操作
span:内联标签,不会实现换行操作 在实际定位过程中尽可能少的定位这两个元素
e.通过link_text定位
f.通过link_partial_text定位
g.通过tag_name定位:通常情况下会与find_elements_by进行结合使用;如果是find_element_by的话则会定位到对应标签的第一个
h.通过xpath定位
xpath:是通过xml(eXtended Markup Language 可扩展标记语言:主要实现程序配置从而完成数据交换操作;由根标签以及一系列子标签共同形成的树状结构(与html相比:html的根标签是html,而xml的根标签自定义,但是根标签只有一个;并且xml的语法要比html语法严格))实现的路径定位法;
xpath定位原理:对html页面结构进行树状递归遍历
xpath定位主要包括两种形式:
1)绝对路径定位 :html/body/div/div/div/div/div/form/span[1]/input
注意:当一个父标签下面存在多个相同的子标签,则可以通过索引进行确定,其索引值是从1开始
2)相对路径定位:
 使用xpath的相对路径进行表示
//input[@type=‘submit’]
a.标签中的属性使用xpath表示:
语法://标签名[@属性名=属性值]
注意:1)标签名也可以使用*进行表示,表示的是任意通配
2)[]中不仅可以声明一个属性,还可以同时声明多个属性,多个属性之间使用逻辑运算符进行连接and or not
3)如果当前标签中没有合适的属性进行选择的话,则会寻找上一级父标签是否存在唯一的属性信息
例如://input[@id=‘su’ and @class=‘bg s_btn’]
b.text()实现xpath定位:
语法://标签名[text()=标签的文本值]
注意:1)text()是一个函数,所以不能够加@,@后面只能够接属性名
2)文本值不能够带有标签内容,指的是标签的纯文本
c.contains()实现xpath定位:
语法://标签名[contains(@属性名,属性部分值)]
d.start-with() 、end-with()函数实现xpath定位:
语法://标签名[start-with(@属性名,属性开头部分值)]
//标签名[end-with(@属性名,属性结尾部分值)]
i.通过css定位:css定位的效率要比xpath更高
id定位的方式:#id的值
class定位的方式:.class的值 注意:如果是多个class表示的话则每个空格类前面都添加.
元素:nth-child(索引):表示的是如果当前标签中没有其他属性可以选择的话,并且同时存在多个相同标签则会通过索引进行选择,相当于xpath的绝对路径
html>body>div>div>div>div>div>form>span:nth-child(1)>input
元素:last-child:表示的是指定在父节点底下的最后一个子标签
4.selenium对浏览器的操作:
获取当前屏幕的大小是系统所设置的分辨率大小
#在操作浏览器时,前进以及后退需要注意是否存在历史操作
#浏览器页面的前进#get_driver.forward()
#浏览器页面的后退#get_driver.back()
#浏览器最大化#get_driver.maximize_window()
#浏览器最小化#get_driver.minimize_window()
#get_driver.set_window_size()
对文本框进行清除使用的函数是clear()
通过元素带有的get_attribute方法进行获取其他元素的值
5.通过By的形式进行元素定位:其模块在:from
selenium.webdriver.common.by import By
使用的方式:find_element(By.需要操作的方式,对应方式的值)
6.selenium当中的键盘、鼠标的操作:
键盘:快捷键的操作:回车、上下左右等键操作会频繁
其中需要引用的模块是:from selenium.webdriver.common.keys import Keys
鼠标:引用的模块是:点击(click)、双击(double_click)、右击(context_click)、悬停(move_to_element)、拖拽(drag and drop)
from selenium.webdriver.common.action_chains import ActionChains
注意:在引用鼠标模块时容易出现的两个错误:
1)ActionChains(驱动器对象) 容易将驱动器对象漏掉
2)在调用完相关操作后,没有添加执行步骤即perform()
7.浏览器的滚动条操作:可以通过js完成:javascript脚本;
a.可以通过坐标点的形式进行定位:window.scrollTo(横坐标点,纵坐标点) 其中原点就是(0,0) scrollTo如果执行多次则取的结果是最后一次,相对原点取的是绝对的高度;如果需要在已有的滚动记录上继续滚动的话则需要使用scrollBy
b.通过指定的元素进行显示可见窗口:get_js=arguments[0].scrollIntoView(); 然后通过驱动器对象调用execute_script(js脚本,需要显示的元素对象)
8.浏览器的句柄操作:
如果在一个浏览器窗口中操作过程中产生新的窗口的话,则驱动器对象还停留在第一个窗口,无法操作新的窗口;此时则必须要进行切换窗口
可以通过window_handles进行获取当前浏览器中存在的所有句柄对象,返回的结构是列表
切换句柄:驱动器对象.switch_to.window(window的name) windowName可以通过window_handles进行获取
注意:如果项目中存在多个句柄之间的切换的话,则建议将window_handles进行遍历并赋予对应变量
9.三种等待方式:
a.sleep(time):强制等待;time模块下的方法;只能够针对当前单步操作;缺点:无法很好的控制脚本的执行速度、并且只针对局部一步操作而言、如果每步需要添加则出现过多重复代码
b.implicitly_wait(time):隐式等待;webdriver驱动器对象下的方法;针对是一次会话所有操作,相当于是一个全局等待;只需要声明定义一次,通常在设计脚本中会应用于setUp方法;
c.WebDriverWait(驱动器对象,等待时间):显式等待;
所在模块下的方法:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.wait import WebDriverWait
使用webdriverwait只能够与until和not until两个方法进行使用;
until和not until中传入的参数可以是lambda匿名函数或者预置条件expected_conditions
如果unitl或者not unitl传入的方法定位元素查找到则会返回对应的对象,如果未找到则会抛出TimeoutException异常
注意:1)locator参数必须是一个迭代器,所以传入的时候如果是一个元素定位的话,则必须传入元组的形式的,还是通过By的元素的定位方式
2)EC预置条件模块具有很多类型的判断;判断当前元素是否存在:presence_of_element_located(locator)
10.alert框如何处理:
alert框无法进行元素定位;
可以通过驱动器对象进行调用switch_to.alert;然后在调用方法accept(接受)、dismiss(取消);如果需要获取alert框的文本使用text参数即可
11.iframe框架的切换:
12.文件的上传、下载:
文件的上传:如果标签的type属性是file的话,那么可以直接使用send_keys进行文件上传;如果标签非type类型的话:则可以直接点击文件上传按钮,弹出window窗口,使用第三方库完成操作(AutoIt);
文件的下载:直接定位到对应的元素进行点击即可;如果需要修改浏览器的默认配置:例如默认路径:
get_download={“download.default_directory”:“d:\”}
get_option=webdriver.ChromeOptions()
get_option.add_experimental_option(“prefs”,get_download)
get_dir=webdriver.Chrome(chrome_options=get_option)
注意:1)浏览器不同,其配置参数不同 2)修改参数设置只是针对selenium对文件下载的临时参数;浏览器的默认设置是不会发生变化(只对当前操作)
13.下拉列列表框的处理:
A.使用一组元素定位
B.使用二次定位
C.使用键盘上下键
D.使用Select对象
14.验证码的处理:a.要求开发将验证码进行屏蔽或者固定验证值 b.万能验证码(只需要验证码接口,响应结果) c.人工技术(打码平台完成)、机器学习(大数据处理、耗费的成本高)
验证码类型:1.随机字符(数字+字母+汉字) 2.图片(拼图、通过词语找图片、图片排序)(本地服务器、指向某个网址获取图片)----->设定为唯一值
3.算术题 4.短信、语音验证码
获取验证码图片:使用PIL(python imaging library)是针对python2.X版本;是一个非常简单、易用的python图像管理库;
15.自动化测试框架:
A.第一:同一模块下,编写不同功能点的脚本(相同的操作:登录、打开对应的模块)—>代码重复率极高#不同的功能点放在每一个python文件中#
第二:一个模块的所有操作放在一个文件中:那么所有的代码处于同一文件中,代码过多不好维护#
第三:需要引入测试框架
主流的结合selenium的测试框架(unittest、pytest);java+selenium+testng(junit);
unittest框架是一个单元测试框架(其思想源于Junit);python自带的一个测试框架
单元测试(TDD:测试驱动开发Test-Driven Development):实现对一个模块、一个类、一个函数进行校验其内部逻辑是否正确;因为单元测试的测试思想和设计理念对自动化测试的管理以及维护起到非常大的作用;XP(极限)编程:测试人员根据已有需求进行编写测试框架,然后开发再根据测试所设计好的测试框架编码(开发的编码质量大大的提高);
B .unittest主要包括:test fixture(在每个测试用例之前会进行先做好准备工作(数据连接、资源连接、关闭等操作))、#test case(测试用例)、test suite(测试套件)、test runner(测试运行器)
setUpCalss----setUp—TestCase—tearDown—setUp----testCase—tearDown…很多很多测试用例…tearDownClass
16.access数据库的连接建立:使用access runtime64安装时,需要卸载32的,卸载需要将注册表中HKEY_CLASSES_ROOT\Installer\Products下所有四个0000开头的删除、然后再安装runtime64;
access建立连接的代码:get_conn=pypyodbc.connect("Driver={Microsoft Access Driver (
.mdb)};DBQ=E:\hello\wwwroot\data\#CRM@LSDN26H#.mdb")
17.项目如何开展:1.分析需要进行自动化的业务场景(因为不可能一下子将整个项目全部设计成自动化) 2. 编写自动化测试计划(测试工具、测试策略(需要进行测试的测试类型以及对应的测试方法)) 3.设计测试 用例(自动化测试用例(设计的模板)) 4.编写自动化测试脚本 5.采用框架进行封装 6.执行测试 7.维护脚本
18.自动化测试框架的主要步骤:
a.将需要设计自动化的业务场景设计成脚本
b.对于重复的代码采用类的形式进行封装,使用继承、封装、多态等特征进行应用;
c.采用pageObject模式进行将页面操作的代码与测试代码进行分离;(pageObject:将一个页面的所有元素操作全部放在一个.py文件),采用合适的测试框架进行组织架构(unittest)
d.将对数据连接、I/O操作、资源连接等相关的操作放在公共文件夹
e.将代码与数据进行分离
19.如何实现数据分离?
1.通过python直接操作excel(自动化测试用例----->能否直接引用功能测试用例------>自动化测试用例)
2.通过其他的格式文件(csv、配置文件yaml、xml)、
yaml:是一个数据存储的格式文件;
注意:json格式 json、dict两种类型有啥区别?
dict字典的格式:{‘add’: [1, 2]} 纯字典的数据类型
json表示的话是:"{‘add’: [1, 2]}" 返回的是一个字典类型的字符串
20.unittest中如何实现参数化?
1.unittest框架中本身没有自带参数的模块,但是存在扩展模块、引用模块:ParamUnittests或者模块parameterized
在实际过程中:只有当传入的数据和输出的数据类型相同时才会使用参数化,当前不同也可以,不过实现较为复杂且不易管理,还不如将不同结果类型的设计在每个测试方法中;
2.unittest框架中测试套件(testsuite):一组测试用例的集合
21.PyTest框架:是一款单元自动化测试框架,与unittest框架非常相似(基于其进行衍生扩展);(加钱的)
A .特点:1.简单、简洁、灵活、官方提供丰富的案例
2.pyTest中的断言可以直接引用python中的assert语句,比unittest框架的断言更简洁
3.按照pytest中用例设计规则后,则pytest会自动的发现对应的TestCase(测试用例)
4.pytest主要使用fixture特征进行管理和组织以及可支持参数化
5.pytest能够运行兼容unittest、nose等框架
6.具有良好的python版本兼容性以及可扩展性
B.pytest中不仅可以存在类测试方法还存在函数测试方法(测试用例两种方式)
C.pytest的测试文件执行方式:1.在dos中执行的命令:pytest 测试文件 py.test 测试文件 python -m pytest 测试文件
2.使用pycharm执行:配置settings即可
D.用例的设计规则:
1.测试用例的方法名必须是test+方法名
2.pytest需要识别为一个测试模块的话,那么py文件的命名必须是以test+文件名或者文件名+test的形式;
注意:如果没加并使用pytest运行成功,则pytest配置器自动在该测试文件名称后添加test+文件名
3.如果是以类的形式进行设计测试用例的话,则类名必须格式为:Test+类名
E.断言:pytest如何断言异常:
value、type都是是异常信息对象中的属性值(一个是获取异常的类型、一个是获取异常的信息值)
ec.value值返回的是一个异常信息对象,如果判定信息字符串的话则必须使用str进行强制转换
with语句中如果一旦有语句抛出异常则直接执行pytest.raise进行捕获,with当前后续语句将不执行
注意:如果是程序员进行抛出异常的话,设计的时候添加相对应的value值
F.Skip装饰器的使用:在整个测试脚本中,可能会存在某些用例需要跳过,而跳过是由于某种原因(当前环境、当前上下文关联等)
G.在unittest框架中具有setup和teardown进行在执行每个测试用例之前创建对象、创建资源等操作;同样存在setupclass、teardownclass等类型;
在pytest当中使用的表示是:
1)函数级:
setup_function()、teardown_function;等价于unittest中的setup、teardown;但是如果同时出现则setup_function的执行优先级要高于setup
2)模块级:
setup_module()、teardown_module();针对整个模块所有的测试用例执行之前仅一次
3)方法级:
setup_method()、teardown_method();等价于unittest中的setup、teardown;也可以直接应用(兼容unittest框架)
4)类级别:
setup_class()、teardown_class();等价于与unittest中的setupclass、teardownclass;在当前测试类中,所有的测试用例执行之前执行一次
注意:setup_module是所有setup模块级别中最高的;当一个模块文件中既存在函数用例和类用例的话,根据类与函数的先后顺序执行
H.装饰器(decorator):本质就是一个函数;其作用:给函数进行增加额外的功能;
原理:1)不能改变被装饰函数的调用方式
2)不能改变装饰器函数的源码
装饰器主要分系统定义的装饰和自定义装饰器(重点);装饰器又分带参装饰和不带参装饰器
@classmethod:类方法装饰器
@staticmethod:静态方法装饰器
I.pytest中的fixture应用:
1.了解fixture参数信息:scope:具有四个值:function、class、module、session;默认值是function
params:参数:可以通过该参数实现参数化(列表参数)
autouse:默认值是false;如果将值修改成True,则装饰在类中会自动在每个测试用例之前执行所对应的fixture装饰器
2.调用fixture装饰器的三种方式:
a.直接以参数的形式将装饰的函数名传入
b.对fixture装饰进行参数设置autouse;将其值设置为True,则会针对每个测试用例执行之前按照scope的值进行执行;但是此种情况无法获取到装饰器的返回值(如果需要调用装饰器中的属性或者对象的话则可以将其设置为全局变量)
c.可以通过pytest.mark.userfixtures(传入需要调用的fixture装饰函数名);此种情况同样无法获取到装饰器的返回值
3.conftest配置文件:可以实现fixture装饰器共享;其中conftest文件名不能改,固定;在当前包中,执行其中一个模块的测试用例,会自动的查找是否存在conftest文件,如果存在则匹配对应的传入参数函数名的fixture装饰器
4.框架执行的结果:通过(Pass)、失败的(Failure):预期与实际不符,断言失败、错误(Error):测试框架代码本身出现错误或者抛异常(如果在fixture中断言则抛出的结果也是error)
注意:为了实现编码的可读性,不会再conftest文件中声明函数带有test开头或者test结尾的函数#为了区分测试案例和装饰器函数
J.pytest中的参数化:两种形式:
pytest.fixture() allows one to parametrize fixture functions.(pytest.fixture()可以实现一个参数化函数装饰器)
@pytest.mark.parametrize allows one to define multiple sets of arguments and fixtures at the test function or class. (pytest.mark.parameterize可以实现一个或者多个参数装饰在测试函数或者测试类中)
fixture中携带参数#如果是直接在fixture装饰器中进行设定参数的话则需要通过request参数进行调用#如果需要将yaml文件中的数据批量进行参数化的话#实现步骤:1)先将yaml文件中的数据全部读取出来,设定格式,格式符合参数所需要传入的#数据格式 2)调用读取yaml返回数据格式的函数直接传入
#parametrize中位置参数需要传入参数的名和参数的值#其中参数名的格式可以是一个字符串以逗号为分隔符的形式或者以列表和元组的形式,其元素是字符串#注意:parametrize中的参数是通过测试方法携带参数传入到测试方法体中进行引用
K.pytest的报告生成:直接引用pytest-html模块;安装:pip install pytest-html;可以使用pytest --html=报告所在路径以及名称
pytest中报告的优化:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值