pytthon自动化代码大全

pytthon自动化代码大全,第1张

pytthon自动化代码大全

1.1 自动化测试简介

自动化测试:

利用一些工具或者编程语言,通过录制或者编程的方法,设定特定的测试场景,模拟用户业务使用流程,自动寻找缺陷

自动化测试优点:

1. 对程序的回归测试更方便,提升回归效率,节约人力。

2. 可以执行一些手工测试困难或不可能进行的测试。

3. 更好地利用资源。将繁琐的任务自动化,可以提高准确性和测试人员的积极性,将测试技术人员解脱出来,投入更多精力设计更好的测试用例

4. 测试具有可重复性。

5. 增加软件信任度,由于测试是自动执行的,所以不存在执行过程中的疏忽和错误,完全取决于测试的设计质量。

自动化测试缺点:

1. 不能取代手工测试,工具本身并无想像力。

2. 对自动化测试人员要求较高。

3. 对被测试系统质量的依赖性极大,维护成本高。

4. 测试脚本本身也可能存在缺陷。

5. 编写的测试脚本工作量有时也很大,甚至会有超过手动测试的时间。

适合自动化测试的产品:

1. 软件需求变动不频繁。

2. 项目周期长,规划性强。

3. 回归测试任务重。

4. 项目进度压力不大。

自动化测试分类:

功能自动化测试

性能自动化测试

安全自动化测试

1.2 selenium简介

Selenium  实际上不是一个工具,而是一个工具集。

Selenium在2.0之前主要包括四个工具:

Selenium IDE(火狐的一个插件,可以快速的实现录制和回放脚本)

Selenium RC (Selenium 1.0的核心,实现对浏览器的控制但是有很多限制)

Selenium Webdriver (Selenium 2.0 以后的核心,用于控制浏览器)

Selenium Grid(支持脚本在多台机器上并行执行脚本,提升执行效率)

Selenium3.0版本,由以下3核心组件组成:

Selenium IDE

Selenium Grid

Selenium Webdriver

Selenium IDE:

IDE是嵌入到 Firefox 浏览器 的一个插件,实现了简单的录制和回放功能。为了快速的创建bug,重现脚本,在测试过程中,测试人员可以在发现了bug后把相应的 *** 作步骤给录制和回放下来。便于开发人员快速的定位与修复bug,节省项目的开发周期。

Selenium Grid:

Selenium Grid是一种自动化测试辅助工具,利用Grid可以方便的实现在多台机器上和异构环境中运行测试用例。

Selenium Webdriver:

WebDriver用于 *** 作浏览器,通过WebDriver设计的API来实现的。Webdriver是一套标准库,不依赖于任何测试框架,除了必要的浏览器驱动,不需要启动其他进程或安装其他程序。

1.3 selenium安装

webdriver下载地址:

Firefox:Releases · mozilla/geckodriver · GitHub

IE:Microsoft Edge Driver - Microsoft Edge Developer

Chrome:https://sites.google.com/a/chromium.org/chromedriver/

其它驱动:Downloads | Selenium

webdriver安装:将插件放入python安装路径下(D:PythonPython37)(Firefox版)

1.4 辅助工具

选择自己想要的web测试工具 ,如:Web Developer、xPath Finder等点击【添加到Firefox】

网页开发者(Web Developer)是Mozilla Firefox浏览器上一个强大的扩展插件。它加入了几个菜单与一条工具栏以及多种网页开发者工具,上面集成了大量的网页开发工具,可以调试CSS、清理cookie、对表单图片等对象进行 *** 作等。

第二章 WebDriver API

2.1 WebDriver API介绍

 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。API 接口属于一种 *** 作系统或程序接口.

分类:Windows API、linux API

    基于Python的Webdriver  API是Python语言通过调用API来 *** 作浏览器。API库针对多种语言实现,所以可以支持Python、Java、Ruby、C#等语言调用。

2.2 浏览器 *** 作  

get(url):打开指定页面

set_window_size(x,y)  :设置窗口大小

maximize_window():放大浏览器为全屏模式

minimize_window()   最小化

forward():前进 

back():后退

refresh():页面刷新

close() 关闭窗口

2.3 界面元素 *** 作

click() :点击界面元素按钮

clear() :清除元素内容

send_keys(参数1,参数2,……) :发送文字,参数:字符串

submit():用于提交表单form、信息,相当于回车 *** 作。

2.4 元素定位

常见的元素定位方式:

元素的定位与 *** 作是自动化测试的核心部分,其中 *** 作又是建立在定位的基础上的,因此元素定位就显得比较重要。

一个元素的定位,他会有各种的特征(属性),比如我们可以通过一个人的身份z号码、姓名或者他的地址找到这个人。那么元素也是有类似的属性的,我们可以通过这个唯一区别于其他元素的属性来定位这个元素。当然,除了要 *** 作的元素需要定位,有的时候我们需要获得元素的具体text的值或者属性值时,也需要先定位元素,再进行进一步的 *** 作。

id:find_element_by_id() #通过id来查找元素

name:find_element_by_name() #通过name来查找元素

class name:find_element_by_class_name() #通过类名查找元素

link text:find_element_by_link_text() #通过某个超链接的文本字符进行查询

partial link text:find_element_by_partial_link_text()

xpath:find_element_by_xpath()#通过路径定位

css selector:find_element_by_css_selector()#通过选择器定位

tag name:find_element_by_tag_name())#通过标签名定位

使用id、name定位:id和name定位方式是最常见的2种定位方式,因为大多数标签都有这2种属性。

使用class name定位:为了弥补前端开发人员没有使用id和name属性时的情况,可以使用class属性来进行定位。   

注意:class属性为复合类(即包含空格)时,可取其一或选择其他定位方式。

使用link text或partial link text定位:有时需要 *** 作的元素是一个文字链接,可以通过link text或者 partial link text进行定位 *** 作。

注意:定位标签才能使用

使用xpath定位:

  有时候无法查到测试对象较为完善的属性和属性值的时候,selenium提供了一个更为全面的方法,通过元素在被测页面中的位置属性来进行查找,即xpath路径定位。

  前面几种元素都无法定位的情况下,才使用xpath路径定位。xpath是某个元素的位置。

  路径:是xpath识别对象的一种方式,即设置测试对象在页面中的路径地址,然后通过该地址进行元素查找。

  xpath 是html的一种路径标记语言,目的是为了能标记并快速定位文件中的某个元素(标签)。

xpath的常用语法:

通过绝对路径定位元素(不推荐使用): find_element_by_xpath("/html/body/div/form/input");

通过相对路径定位元素:

find_element_by_xpath("//div/input");#选取所有的div下面的input

使用索引定位元素:

find_elements_by_xpath("//input[4]"); #全页面查找,查找这个页面上所有的第4个input

find_elements_by_xpath("//input")[3]; #全页面查找所有的input,取第4个input

(find_elements_by_xpath 定位一组元素,返回列表)

xpath的常用语法:

使用xpath及属性值定位元素:

语法:xpath = "//标签名[@属性='属性值']"

find_element_by_xpath("//input[@id='kw']"); # 全文查找id = kw的这个input标签

部分属性值匹配:

find_elements_by_xpath("//*[contains(@href, 'news.baidu')]")匹配包含属性的值 #全文查找所有标签,href属性包含news.baidu的标签

find_elements_by_xpath("//*[starts-with(@href,'https')]")匹配开始字段,ends-with方法不可用 #全文查找所有标签,href属性以https开头的标签

Xpath定位方式的缺点:

由于xpath需要遍历页面,所以定位元素的性能要比其它的方式差

不够健壮,xpath会随着页面元素的改变而改变

兼容性不好,在不同的浏览器下对xpath的实现不一样

CSS”表示该属性是在哪个CSS版本中定义的

使用css定位:相较于xpath,使用css选择器定位写法更简洁。

.名字   类选择器 class

# id 选择器

全部

前3后1

[attribute|=value] 选择器用于选取属性值以指定值开头的元素。

注释:value 该值必须是整个单词,比如 lang="en",或者后面跟着连字符,比如 lang="en-us"。 lang="en us" 取不到

^=     子串

$=     子串

*=     子串

|=      单词(只能以 - 为分隔符,单独只有en)

~=    单词(只能以空格为分隔符)

前3后1

5~7   最后2个

^=     子串

$=     子串

*=     子串

|=      单词(只能以 - 为分隔符)

~=    单词(只能以空格为分隔符)

2.5 获取界面元素内容

size:获取元素的尺寸

text:获取元素的文本

title:获取页面标题

current_url:获取当前url地址

get_attribute:获取元素属性值

2.6 键盘

*** 作键盘使用from selenium.webdriver.common.keys import Keys的Keys类,一般send_keys函数联用,常见的方法:

send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

send_keys(Keys.SPACE) 空格键(Space)

send_keys(Keys.TAB) 制表键(Tab)

send_keys(Keys.ESCAPE) 回退键(Esc)

send_keys(Keys.ENTER) 回车键(Enter)

send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)

send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)

send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)

send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)

2.7 鼠标

常见鼠标 *** 作包含在 selenium.webdriver.common.action_chains的ActionChains 类中,常用的方法:

context_click() 右击

double_click() 双击

click_and_hold()  左击悬停

move_to_element()  鼠标悬停

drag_and_drop() 拖动

perform() 执行ActionChains中存储的行为

click() 单击(点击鼠标左键一次)

2.8 定位一组元素

 Webdriver可以很方便的使用find_element方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,WebElement 接口同样提供了定位一组元素的方法 find_elements。

批量 *** 作对象,比如将页面上所有的 checkbox 都勾上,先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个。

2.9 层级定位

先定位某一个元素,再定位该元素下的元素

2.10 多窗口

在页面 *** 作中点击链接有时会d出一个新的浏览器窗口,这就涉及多窗口的切换 *** 作。

current_window_handle   获取当前窗口handle

window_handles  获取所有窗口handle,得到一个列表

switch_to.window(句柄号)   切换窗口

2.11 多表单

Web页面中经常用到frame/Iframe表单嵌套页面,使用frame重载页面时不需要重载整个页面,只需要重载页面中的一个框架页(减少了数据的传输,加快了网页下载速度)。

WebDriver只能在一个页面上对元素识别与定位,如果跨frame定位元素是无法直接定位的,必须先切换到该元素所在的frame才能定位。

switch_to.frame()  切换到指定frame,参数:定位到的Iframe元素

switch_to.parent_frame() 切换到上一层frame

switch_to.default_content() 跳到最外层frame  

2.12 d出框

对js(Javascript)使用的alert、confirm 以及 prompt定位也是项目中常见的,比如d出提示框“确定”等。要定位这类提示框具体思路是switch_to_alert()方法定位alert//confirm/i/prompt,然后使用text/accept/dismiss/send_keys这一系列动作。

text # 获取alert文本内容

accept() # 等同于点击“确认”或“OK”

dismiss() # 等同于点击“取消”或“Cancel”

send_keys(keysToSend) # 发送文本,对有提交需求的prompt框

2.13 下拉框

常见下拉框 *** 作包含在selenium.webdriver.support.select的Select 类中,常用的方法:

select_by_value('value')  通过value值选择

select_by_visible_text('text')  通过文本选择

select_by_index(index)  通过索引选择,索引从0开始

2.14 等待

当浏览器加载页面时,这个页面的很多元素加载的时间可能不一致。此时如果某个要定位的元素还没有加载出来的话,在定位的时候,就会抛出异常。这个时候,合理使用 wait,就可以避免异常的发生。

Selenium Webdriver 提供了两种类型的等待方法:隐式等待(implicit) 和 显示等待(explicit)。

隐式等待:在设定的时间t内等到页面上的元素加载完成。若在时间t内元素加载完成,则剩下的时间不需要再等待,若时间t外,元素还未被加载则系统报错。隐式等待是全局的,作用在整个脚本上,所以在一个脚本中只需要设置一次即可。

显式等待:在设定的时间内,按照固定的时间间隔扫描指定元素是否加载完成,加载完成则剩下的时间不再等待,代码继续往下执行,如果在时间t内没有加载完成则系统报错。

注意:隐式等待和显式等待都可以设置,等待的最长时间取两者之中的大者。

implicitly_wait(max_time) 隐式等待时间

WebDriverWait(driver, max_time, check_time).until(expected_conditions.presence_of_element_located(locator))

max_time最长等待时间,check_time每隔xx时间判断,locator判断的元素,元组

调用driver.implicitly_wait(10)   [ɪmˈplɪsɪtli]  在获取不可用的元素之前,会等待10秒的时间。

WebDriverWait(driver, timeout, check_time,ignored_exceptions).until(expected_conditions.presence_of_element_located(locator),message)

WebDriverWait():

driver: WebDriver的驱动程序(Ie, Firefox, Chrome ),既是传入WebDriver实例,即driver。

timeout: 超时时间,等待的最长时间

check_time: 调用until中方法的间隔时间,默认是0.5秒

ignored_exceptions: 超时后的异常信息,默认情况下抛NoSuchElementException异常。(没有找到元素)。

until():

    method: 在等待期间,每隔一段时间,调用这个方法,直到返回值为True

    message: 如果超时,抛出TimeoutException,将message传入异常

presence_of_element_located()

presence_of_element_located()判断元素是否存在

2.15 文件上传

文件上传:普通的附件上传是将本地文件的路径作为一个值放在input 标签中,通过form 表单将这个值提交给服务器。可以通过send_keys("文件路径")直接上传。

2.16 截图

一般在执行用例时,如果用例失败,需要将当前窗口截图保存

方法:get_screenshot_as_file('imgname')

2.17 验证码

验证码 *** 作方法:

1.去掉验证码 :

开发只要把验证码的相关代码注释掉即可

2.设置万能码

3.验证码识别技术(OCR)(例如Python-tesseract识别图片验证码)

可以通过python-tesseract来识别图片验证码。不过,验证码形式繁多,大多验证码识别技术,识别率很难达到100%

第三章 unittest框架

3.1 unittest简介

unittest是一个python版本的单元测试框架,可以用于python的单元测试。相似的其它语言工具Java的Junit,C#的Nunit等。可以使用Unittest做单元测试,也可以完成Web自动化测试。

自动化测试用例的组织和管理

提供丰富的比较方法,完成结果的检查

提供执行过程数据,如:执行时间、执行结果等

3.2 unittest语法

Test Case:一个TestCase实例就是一个测试用例,即一个test开头的测试函数。

Test Fixture:用于测试前的环境初始化和测试后的环境清理,通过setUp函数和tearDown函数完成。

Test Runner:unittest单元测试框架提供了TextTestRunner类来运行多个Test Suite或test case。 

Test Suite:一个功能测试需要很多Test Case,可以多个测试用例统一进行执行,把多个用例加到一个Test Suite中。

3.3 断言

断言方法是 unittest 框架提供的一组方法,可以通过这些方法完成期望结果和实际结果的对比。

assert+空格+要判断语句+逗号+“报错语句”   python提供

assertEqual(a,b,msg=None)  检查a==b,不等则报错

assertNotEqual(a,b,msg=None)  检查a!=b,相等则报错

assertIn(a,b,msg=None)  检查a in b,不在报错

assertNotIn(a,b,msg=None)  检查a not in b,在报错

assertTrue(a,msg=None)  检查表达式a成立,不成立报错

assertFalse(a,msg=None) 检查表达式a不成立,成立报错assertIsInstance(obj,cls,msg=None) 检查obj是cls一个实例,是则pass,不是就报错

assertNotIsInstance(obj,cls,msg=None)检查obj不是cls一个实例,是则pass

 self.assertIsNone(expr,msg)

 self.assertIsNotNone(expr,msg)

3.4 测试用例管理

通过Test Suite 测试集(测试套件)来组装单个测试用例,然后通过addTest方法加载

TestCase添加到TestSuite中。接着调用unittest框架的TextTestRunner( )类,通过

TextTestRunner对象调用Run()方法运行suite中所组装的测试用例。

discover方法批量执行脚本用例。使用discover方法会自动收集指定目录下的测试用例添加到测试套件中,然后通过run()方法执行discover,大大简化了测试用例的查找和执行。

3.5 HTML测试报告

自动化测试执行完成以后,需要输出一个完整的测试报告,供测试人员查看测试执行情况,确认自动化测试执行发现的缺陷情况。

HTMLTestRunner是Python标准库的unittest单元测试框架的一个扩展,可以生成一个可读性很强的HTML格式的测试报告。

下载地址:HTMLTestRunner - tungwaiyip's software

下载HTMLTestRunner.py文件,然后将其复制到 D:PythonPython37Lib 下(以实际安装目录为准)

第四章 自动化测试模型

4.1 线性编程

通过录制或编写对应的程序 *** 作步骤产生的相应的线性脚本,每个测试脚本相对独立,且不产生其他依赖与调用,早期自动化测试的一种形式,其实就是单纯的模拟用户 *** 作场景。

线性脚本缺点:

开发成本高,重复性代码编写多次。

维护成本高,修改代码难度大、工作量大。

4.2 模块化驱动测试

借鉴编程语言中模块化思想,把重复性 *** 作独立成公共模块,使用到的时候直接调用公共模块即可,不用重复的编写,从而降低代码量、提高自动化测试脚本的可维护性。

模块化脚本优点:

提高了开发效率,降低重复性代码的编写。

简化了代码维护的复杂度和工作量。

代码清晰

4.3 代码分层

模块后脚本存在问题:所有测试用例代码在一个文件中,如果测试模块多时测试脚本过大。

解决方法:

每个模块的测试用例代码单独放在一个文件中

新建一个测试运行文件,调用所有测试用例代码

改造后代码分为三层:执行文件、测试用例、页面

4.4 数据驱动测试

模块化解决了测试代码重用性的问题,但是代码中测试的 *** 作与测试数据耦合在一起的,一旦需要对大量不同的数据进行测试时,就需要重新编写大量的测试用例。

数据驱动是可以很好的解决这个问题,数据驱动可以将测试代码与测试数据很好的分离。测试数据存放在另外的文件中进行单独的维护,可以快速增加相似的测试数据,完成在不同的数据下的测试。

1、数据储存在py文件中,使用全局变量、常量

2、数据储存在txt文本中,使用变量赋值、字典、列表等相同形式

3、数据储存在csv文件中

4、数据储存在xls、xlsx文件中

第五章

        静静的思考,慢慢的积累,很多新兴的知识是要不断地复习,才会掌握的更加深刻,视频的人生,还是过于不太充实,更多的是要有思想活动,和生活记忆的记录,让想法变于现实!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5704221.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存