1、什么是自动化测试?
一、什么是自动化?css
自动化谷歌使用驱动对应的版本地址:https://blog.csdn.net/huilan_same/article/details/51896672
概念:由机器设备代替人为自动完成指标的过程
1.一、优势:
a.减小人工劳动力
b.工做效率提升
c.产品规格统一标准
d.规模化(批量生产)
二、什么是自动化测试?
概念:让程序代替人为去验证程序功能的过程
2.1为何要进行自动化测试?
a.解决--回归测试
b、解决--压力测试
c、解决--兼容性测试
d、提升测试效率、保证产品质量
回归测试:项目在发新版本以后对项目以前的功能进行验证;
压力测试:能够理解为多用户同时去操做软件,统计软件服务器处理多用户请求的能力
兼容性测试:不一样浏览器(IE/Firefox/Chrome)等
2.2自动化测试相关知识
自动化测试在什么阶段开始?
功能测试完毕(手工测试)
手工测试:就是由人一个一个输入用例,而后观察结果;
自动化测试所属分类
常见的测试分类
a.黑盒测试(功能测试)
b.灰盒测试(接口测试)
c.白盒测试(单元测试)
提示:web自动化测试属于黑盒测试(功能测试)
优势:
a.较少的时间内运行更多的测试用例
b、自动化脚本可重复运行
c、减小人为错误
d、测试数据存储
缺点:
a.不能取代手工测试
b、手工测试比自动化测试发现的缺陷更多
c、测试人员技能要求(比手工测试高)
误区:
1)、自动化测试彻底替代手工测试
2)、自动化测试必定比手工测试厉害
3)、自动化能够挖掘更多的BUG
3.自动化测试分类
a.Web_(UI)自动化测试(本阶段学习)
b、接口-自动化测试
c、移动(app)-自动化测试
d、单元测试-自动化测试
注意:什么是web?
a.基于HTTP开发的项目
b.基于浏览器访问的项目
Web自动化测试
1.什么是web自动化测试?
概念:让程序代替人为自动验证Web项目功能的过程
二、什么Web项目适合作自动化测试?
a.需求变更不频繁
b.项目周期长
c.项目须要回归测试
三、如何进行Web自动化测试?(主流测试工具)
a、QTP(收费)
QTP是商业的功能测试工具,收费,支持web,桌面自动化测试
b、Selenium(开源)【本阶段学习】
Selenium是开源的web自动测试工具,免费,主要作功能测试
c、Jmeter(开源,Web,接口,性能)
Jmeter是由Apache公司使用Java平台开发的一款测试工具,支持(Web,接口测试,性能测试)
d、Loadrunner(收费、web、性能)
Loadrunner是商业性能测试工具,收费,功能强大,适合作复杂场景的性能测试
e、Rob framework
Rob framework是一个基于Python可扩展地(关键字驱动)的测试自动化框架
3.1主流工具-汇总:
Web自动化测试:selenium .rob framework
App端自动化测试:Appium、MonkeyRunner、UIautomation
PC客户端(win32桌面程序)自动化测试:QTP
接口自动化测试:Jmeter,Postman,httpUnit,RESTClient
云测试平台:Testin Testbird
性能测试:Jmeter,LoadRunner
四、什么是selenium?
概念:selenium是一个用于Web应用程序测试的工具,中文的意思(硒 拼音:xi,第一声)
4.1Selenium特色
A、开源软件:源代码开发能够根据需求来增长工具的某些功能
B、夸平台:linux、windows、mac
C、核心功能:就是能够在多个浏览器上进行自动化测试
D、多语言:Java、Python、C#、JavaScript、Ruby等
E、成熟稳定:目前已经被谷歌、百度、腾讯等公司普遍使用
F、功能强大:可以实现相似商业工具的大部分功能,由于开源性,能够实现定制化功能
4.1 Selenium家族(发展史)【了解】
(1)Selenium1.0
a.seleniumIDE
a.1 一个Friofox插件,能够录制用户的基本操做,生成测试用例(记住这个就能够了)
a.2测试用例在Friofox浏览器里回放;
a.3测试用例能够转化成为其余语言的自动化脚本;
b.selenium Grid
容许selenium-RC针对规模庞大的测试案例或者须要在不一样环境中运行的测试案例集进行扩展
c.selenium RC
c.1RC是remote contro的缩写,他的功能就是用来模拟一个浏览器,主要测试的就是web方面(使用JS脚本注入到浏览器中,模拟一个浏览器,使用者向被测软件中请求输入数据时,RC会拦截全部的信息,经过这种方式定位操做元素)
c.2支持多平台(Windows,Linux,Solaris)和多种浏览器(IE,Firefox,Opera,Safari)能够用多种语言(JAVA,Ruby,Python,Perl,PHP,C#)编写测试用例
d.缺陷
d.1不支持本机键盘和鼠标事件
d.2不支持同源策略XSS/HTTP(S)(自身安全协议)
d.3不支持弹出框,对话框(基自己份证,自签名的证书和文件上传、下载)
(2)selenium
A.selenium2.0=selenium1.0+WebDriver
WebDriver经过浏览器的驱动来控制浏览器,它把控制浏览器驱动的方法,封装成一个库,简称API(把传统的JS注入给替换掉了)
B、基于调用WebDriver Api来模拟用户操做
C、webDriver的速度更快,由于它直接交互使用
D、支持更多编程语言
(3)Selenium 3.0
A.去掉了对selenium rc的支持
B、全面拥抱java8
C、支持masOS(Sirerra or later),支持官方的safaridirver
D、经过ms官方的webdriver server支持Edge浏览器
E、支持ie9.0版本以上
F、经过Mozilla官方的geckodriver来支持firefox
重点:
1.SeleniumIDE
2.WebDriver
WebDriver
目标:
掌握WebDriver元素定位方法
1.什么是WebDriver?
a.WebDriver是一种用于Web应用程序的自动测试工具;
b.它提供了一套友好的API;
c.WebDriver彻底就是一套类库,不依赖于任何测试框架,除了必要的浏览器驱动;
说明:
API:应用接口编程说明(WebDriver类库内封装很是多的方法,要使用这些方法,就须要友好的调用命名规则,说白了API就是这些方法的使用说明书)
1.1WebDriverAPI支持的浏览器
a.Fire(FirefoxDriver)【推荐-本阶段学习使用】
b.IE(InternetExplorerDriver)
c.Opera(OperaDriver)
d.Chrome(ChromeDriver)谷歌浏览器
e.safari(SafariDriver)苹果
f.HtmlUnit(HtnlUnit Driver)
提示:
Friefox、Chrome:对元素定位和操做有良好的支持,同时对JavaScript支持也很是好。
IE:只能在windows平台运行,全部浏览器中运行速度最慢
HtmlUnit:无GUI(界面)运行,运行速度很是快
1.2 WebDriverAPI支持的开发语言
a.java
b.Python
c.PHP
d.JavaScript
e.Perl
f.Ruby
g.C#
2.
a.自动化测试概念
b.WebDriver提供了8中定位元素方法
c.WebDriver提供了丰富的操做元素方法
3.环境搭建
3.1为何要环境搭建?
a.盖房子(地基很重要)
b.MP3(有MP3播放器才能播放)
c.开发语言
3.2基于Python环境搭建
a.windows系统(这里以windows7为案例)
b.Python3.5(以上版本)注意:安装时必须把添加到PATH的选项选中,安装后在dos窗口中输入python能够看到版本号,输入pip能够看到使用说明便可
c.安装selenium包
d.浏览器
e.安装PyCharm
四、selenium安装
说明:安装selenium时,前提是Python3.5以上版本安装完毕且能正常运行
4.1 selenium安装、卸载、查看命令【重点】
安装指定版本的:在dos窗口下输入
pip install selenium == 版本号
1).pip通用的Python包管理功能。提供了对Python包的查找,下载,安装,卸载的功能
2)install :安装命令
3)selenium==版本号:指定安装对应版本的selenium(若是不指定版本,默认安装为最新版本)
卸载:pip uninstall selenium
查看:pip show selenium
4.2火狐浏览器【推荐】
a.FireFox48以上版本,Selenium 3.X+FireFox驱动---geckodriver
b.Firefox 48 如下版本,Selenium 2.X 内置驱动
个人电脑--》右键--》属性--》高级系统设置--》高级选项卡--》环境变量按钮--》复制PATH的值
4.3IE浏览器(了解)
a.IE 9以上版本 Selenium3.X+IE驱动
b.IE 9如下版本 Selenium2.X+IE驱动
4.4谷歌浏览器
selenium2.X/3.X+Chrome驱动
谷歌浏览器于驱动版本必须一一对应
注意:
a.浏览器的版本和驱动版本要一致!(若是是32bit浏览器而驱动是64bit则会致使脚本运行失败)
b.浏览器驱动下载好后须要添加到Path环境变量中,或者直接放到Python安装目录,由于Python已经添加到Path中
c.推荐使用火狐,谷歌浏览器
5.总结
a.WebDriver是什么?
测试Web项目的自动化测试工具
一套友好的API
只须要浏览器驱动
b.为何要搭建环境?
工具包
解释器
c.selenium 安装、卸载、查看命令
安装:
安装指定版本
pip install selenium==版本号
安装最新版本
pip install selenium
查看:pip show selenium
卸载:pip uninstall selenium
4.为何推荐火狐浏览器
由于对WebDriver有良好的支持
小技巧:如何查看selenium有哪些版本
在dos命令下输入pip install selenium==不存在的版本号
导入包:打开pyChram--》Settings--》选择Project XXXX--->Project Interpreter
WebDriver-元素定位
页面元素分析:
输入框
选择框
文本连接
悬浮
单选框
下拉框
按钮
滚动条
弹窗
文件操做
1.为何要学习元素定位方式?
a.让程序操做指定元素,就必须先找到此元素;
b.程序不想人类用眼睛直接定位到元素;
c.WebDriver提供了八种定位元素的方法
2.WebDriver元素定位方式
a.id:经过元素的id属性,定位元素
b.name:经过元素的name属性,定位元素
c.class_name:经过元素的class属性,定位元素,这里name指的是class的值,一个元素能够有多个class属性,就像人在不一样人口中称呼不同。
d.tag_name:经过元素的标签名称
e.link_text:只对连接有效(精确匹配)
f.partial_link_text:对link_text的扩展,只要输入表明这个标签的,不重复的信息,便可对该连接生效(能够理解为模糊匹配)
g.Xpath:路径定位
h.Css选择器定位
注意:若是元素没有id和name、class属性,则id和name、class不生效
定位方式分类-汇总:
1)id、name、class_name:为元素属性定位
2)tag_name:为元素标签名称
3)link_text,partial_link_text:为超连接定位
4)Xpath:为元素路径定位
5)CSS:为CSS选择器定位
练习:
1)打开百度页面,使用id定位,搜索栏输入123456,暂停3秒后关闭
id定位方法
find_element_by_id()
语法:
driver.find_element_by_id(“id的值”)
元素定位方法:
1.使用浏览器的开发者工具
打开方法:
a,F12
b.在打开菜单中选择“开发者”,查看器
2.在开发者工具中,选择查看器,点击查看器旁边的“选择页面中的元素”按钮(鼠标图标)
3.把鼠标放在须要定位的元素上,点击一下,便可在查看器中看到该元素对应的源码
id定位实现,步骤分析
1.导入selenium包-->from seleium import webdriver
2.导入time包 import time
3.实例化一个浏览器,把实例化的浏览器赋值给一个变量
driver=webdriver.Firefox()
4.输入网址-->driver.get("http://www.baidu.com")
语法:driver.get("网址")
5.调用id定位的方法,定位到浏览器中须要操做的元素,把元素赋值给一个变量
element=driver.find_element_by_id("kw")
6.使用send_keys()方法输入数据-->element.send_keys("123456")
语法:元素.send_keys("要输入的数据")
7.time.sleep(3)
语法:time.sleep(要暂停的时间),时间单位:秒
8.关闭浏览器-->driver.quit()
url的书写方式:
a.url="网址"
b.url=r"file://E:\课程大纲\自动化"
r的做用:被r修饰的字符串后面的转义符,不作转义使用
c.url="file://E:\\课程大纲\\自动化"
定位于传值的语句能够合在一块儿写的
driver.find_element_by_id('kw').send_keys("123456")
快速导包方式
Ctrl+Alt+空格
反斜杠与斜杠的区别:
\:反斜杠为转义字符,因此必须在它以前在加一个\进行转义,计算机中反斜杠作目录结构使用
/:斜杠,计算机中作除法使用,5/3
2、8种元素定位html
name定位
说明:html规定name属性来指定元素名称,所以它的做用更像人名,name的属性值在当前文档中能够不是惟一的,name定位就是根据name属性来定位
前提:元素有name属性
name定位方法:
find_element_by_name()
语法
driver.find_element_by_name("name的值")
class_name定位
说明:html规定了class来指定元素的类名,用法和name、id相似
前提:元素有class属性
方法:find_element_by_class_name('class属性值')
tag_name定位
说明:html本质就是由不一样的tag(标签)组成,而每一个tag指同一类,因此tag定位效率低,通常不建议使用;tag_name定位就是经过标签名来定位;
方法:find_element_by_tag_name('标签名')
做用:返回符合条件的第一个标签
link_text定位
说明:link_text定位与前面4个定位有所不一样,它专门用来定位超连接文本(<a>XXXXXXX</a>)
方法:
find_element_by_link_text('超连接对应的完整的文本内容')
partial_link_text定位
说明:partial_link_text定位是对link_text定位的补充,partial_link_text为模糊匹配:link_text所有匹配
方法
find_element_by_partial_link_text('超连接对应的部分文本内容')
说明:须要传入a标签局部文本-能表达惟一性的
练习:
1.分别使用class_name定位百度搜索栏,并在搜索栏中,输入123456,暂停三秒,关闭
2.打开Untitlred-2.html页面,使用tag_name定位,手机号码栏,输入18811112222,暂停三秒,关闭
3.使用link_text定位百度的,hao123超连接,点击(点击的方法是:click())
4.使用partial_link_text定位百度的hao123超连接,点击
6种元素定位梳理【重点】
1.id
说明:经过元素的id属性来定位
前提:元素必须有id属性
方法:find_element_by_id("id值")
2.name
说明:经过元素的name属性来定位
前提:元素必须有name属性
方法:find_element_by_name("name值")
3.class_name
说明:经过元素的class属性来定位
前提:元素必须有class属性
方法:find_element_by_class_name("class值")
4.tag_name
说明:经过元素的标签名称,如<input><a>……
前提:元素标签名在当前页面必须为惟一元素,或者定位为第一个元素
方法:find_element_by_tag_name("标签名")
返回:符合条件的第一个元素
5.link_text
说明:只定位超连接<a>标签
注意:必须为所有匹配文本
方法:find_element_by_link_text(所有文本值)
6.partial_link_text
说明:它为link_text定位的补充说明
注意:为模糊匹配
方法:find_element_by_partial_link_text(局部文本)
find_elements_by_XXXXX()
做用:
1)查找定位全部符合条件的元素
2)返回的定位元素格式为数组(列表)格式:
说明:
1)列表数据格式的读取须要指定下标(下标从0开始)
tag_name如何获取第二个元素
Xpath、CSS定位
为何学习Xpath、CSS定位?
a.在实际项目中标签没有id、name、class属性
b.id、name、class属性值为动态获取,随着刷新或者加载而变化
1.什么是Xpath?
a.XPath即为XML Path的简称,它是一种用来肯定XML文档中某部分位置的语言
b.HTML能够看作是XML的一种实现,因此Selenium用户可使用这种强大的语言在 Web应用中定位元素
XML:一种标记语言,用于数据的存储和传递,后缀.xml结尾
提示:Xpath为强大的语言,那是由于它有很是灵活的定位策略;
1.路径-定位
1)绝对路径
2)相对路径
二、利用元素属-定位
与相对路径结合使用
3.层级与属性结合
给出上一个标签,父元素与属性结合
4.属性与逻辑结合-定位
多个属性经过逻辑语言结合,符合条件的元素会被筛选出来 and
方法:
find_element_by_xpath("路径或路径+属性")
2.1路径(绝对路径、相对路径)
绝对路径:从最外层元素到指定元素之间全部通过元素层级的路径;
好比:/html/body/div/div/div/div/div/form/span/input
1)绝对路径以/开始
2)使用开发者工具,能够查看到对应的路径
相对路径
1)相对路径以//开始,以第一个符合条件的元素开始
2)为了方便练习Xpath,能够安装扩展插件 Try XPath插件
火狐浏览器-->组件管理器-->搜索Try XPath
2.2利用元素属性
说明:快速定位元素,利用元素的惟一属性
例子://*[@id='kw']
其中*表示全部的路径,[]里面填写: 属性='值',属性必须使用@修饰
若是要重要input标签且id属性为111的元素,则输入//*input[@id='111']
注意事项:
1.绝对路径以单斜杠/开头,中间不能跳跃元素
2.相对路径以双斜杠//开头;后面必须跟标签名称或者*
3.Xpath路径内使用属性时,必需要使用@修饰
2.3层级与属性结合
说明:要找的元素没有属性,可是它的父级有;
例子://*[@class='bg s_ipt_wr iptfocus quickdelete-wrap']/input
2.4属性与逻辑结合
说明:解决元素之间相同属性重名问题(属性名同样,属性值也同样)
例子://*[@class='txt1' and @placeholder='手机号码']
2.5Xpath-延伸
//*[text()="xxx"]文本内容是xxx的元素
//*[starts-with(@attribute,'xxx')]属性以xxx开头的元素
//*[contains(@attribute,'xxx')]属性种含有xxx的元素
2.6Xpath-总结
1.如何经过开发者工具快速生成绝对路径
a.使用开发者功能定位元素,在开发者工具下方查看路径,而且用Try XPath确认路径
b.选中定位到的元素的上一级元素,右键复制XPATH一般能够获得上一级元素的绝对路径
弊端:局限性很大,有些路径生成不了
练习:使用XPATH定位
1.使用绝对路径在百度搜索中搜索123456
2.使用相对路径在百度搜索中搜索123456
3.使用层级与属性结合在百度搜索中搜索123456
4.使用属性与逻辑合在百度搜索中搜索123456
5.使用属性在百度搜索中搜索123456
3.XPATH策略有哪些?
a.路径
1)绝对路径,以单斜杠开头
2)相对路径,以双斜杠开头,后边必须跟标签或者*
b.属性
1)全部属性必须以@修饰
2)例子://*[@id='id']
c.层级与属性
层级:父子标签
d.属性与逻辑
两个属性以上时使用,使用逻辑符号and链接
3.CSS定位
3.1什么是CSS?
CSS(Cascading Style Sheets)是一种语言,它用来描述HTML和XML的元素显示样式;
CSS语言书写的两个格式:
a.写在HTML语言中<style type="text/css">
b.写在单独文件中,后缀.css
2.而在CSS语言中有CSS选择器(根据不一样策略选择元素),在Selenium中也可使用这种选择器;
提示:
a.在selenium中极力推荐CSS定位,由于它比XPATH定位速度要快
b.Css选择器语法很是强大,在这里咱们只学习测试中经常使用的几个CSS定位方法
方法:find_element_by_css_selector("传入路径或元素")
3.2 CSS定位经常使用策略(方式)
a.id选择器
b.class选择器
c.元素选择器
d.属性选择器
e.层级选择器
Id选择器
说明:根据元素的id属性来选择
格式:#id值
例子:#userA<选择全部id属性为userA的元素>
在开发者工具搜索栏中输入,便可定位到元素
class选择器
说明:根据元素class属性来选择
格式:.class值
例子:.telA<选择全部class属性为telA的元素>
元素选择器
说明:根据元素的标签名选择
格式:element
例子:input<选择全部input元素>
层级选择器
说明:根据元素的父子关系来选择
格式:element1>element2
例子:p>input<返回全部p元素下全部的input元素>
属性选择器
说明:根据元素的属性名和值来选择
格式:[属性名=值]
例子:[type="password"]<选择全部type属性值为password的元素>
3.3CSS延伸
a.input[type^='p']说明:定位type属性以p字母开头的元素
b.input[type$='d']说明:定位type属性以d字母结束的元素
c.input[type*='w']说明:定位type属性包含w字母的元素
练习:CSS定位
使用id定位,在百度搜索栏中搜索123456
使用class定位,在百度搜索栏中搜索123456
使用元素定位,在百度搜索栏中搜索123456
使用属性定位,在百度搜索栏中搜索123456
使用层级定位,在百度搜索栏中搜索123456
3、如何打开不一样的浏览器java
driver=webdriver.Chrome()打开谷歌浏览器
driver=webdriver.Firefox()打开火狐浏览器
driver=webdriver.Ie()打开ie浏览器
driver=webdriver.Edge()打开win10的浏览器
try:
代码块1:
except:
代码块2:
若是程序没有抛出异常,则执行代码块1,不然执行代码块2
浏览器操做
最大化:maxmize_window()
最小化:minimize_window()
设置大小:set_window_size(x,y)
后退:back()
前进:forward()
刷新:refresh()
关闭浏览器:quit()
host:
网页的域名 对应的IP地址
www.baidu.com 111.111.111.111
如何判断页面是否正确
driver.title():获取页面的title
EC.title_is()
功能:对title进行精确匹配,若是匹配返回true不然返回false
要求:导入from selenium.webdriver.support import expected_conditions as EC
语法:
变量名=EC.title_is("须要校验的标题")
变量名(浏览器对象)
1.title_is()是一个类,使用它会建立一个title_is的对象
2.若是须要判断传入的title是否正确,还须要在这个对象中传入浏览器对象
EC.title_contains()
功能:对title进行模糊查询,若是匹配返回true不然返回false
要求:导入from selenium.webdriver.support import expected_conditions as EC
语法:
变量名=EC.title_contains("须要校验的标题")
变量名(浏览器对象)
3.title_contains()是一个类,使用它会建立一个title_contains的对象
4.若是须要判断传入的title是否正确,还须要在这个对象中传入浏览器对象
如何实现多窗口的切换
窗口的惟一表示用句柄表示
函数
1.获取当前页面的句柄:driver.current_window_handle
所谓句柄,请理解为窗口的身份证号码,它是惟一的
当前句柄,就是当前程序所操做的窗口的句柄
2.获取全部句柄:driver.window_handles
3.切换窗口:switch_to.window(i)
其中i为目标句柄,若是你想从窗口1切换到窗口2,i必须为窗口2的句柄
#for循环,从全部句柄中随机取一个赋值给i
for i in handl_list:
#判断i是否等于当前句柄,若是不等于,则切换到句柄i所在窗口,若是等于则进入下一次循环
if i!=current_handle:
#切换到句柄i所在窗口
driver.switch_to.window(i)
driver.find_element_by_id('userId').send_keys('test')
4、对复选框状态进行判断python
焦点定位:
方法:swith_to.active_element
checkbox(复选框)操做
方法:element.is_selected()
功能:判断复选框是否被选中,若是选中,则返回true,不然返回false
需求:如何把这个功能封装起来
需求分析:
chenkbox有一个默认的状态:勾选or没有勾选
咱们对该控件也有一个操做,要求选中,或者要求不要选中,那么如何用一个方法知足咱们的所有要求
思路:
获取复选框
对复选框状态进行判断
传入check,若是check值为t,表示要选中复选框,不然取消选中
使用if进行两次判断,第一次对复选框状态进行判断,查看是否选中
第二次则是在第一次判断的基础上,判断check参数,查看是否要求选中复选框
根据判断结果,处理代码
在自动化测试过程当中,网络缘由,页面加载时间好久,致使要操做的元素没有显示出来,此时若是加入等待时间,咱们没法肯定等待时间是多久。可是咱们能够经过is_displayed()判断,被操做元素是否存在,若是存在,在进行下一步操做
方法:
is_displayed():判断元素是否可见,若是可见返回True
语法:driver.find_element_by_xxx(xxx).is_displayed()
方法:append(元素)
功能:将元素添加到数组中
如何读取配置文件
首先,setting->Plugins->marketplace搜索ini,而后进行安装,重启pycharm
读取配置文件,须要安装插件cmd->pip install ConfigParser
新建一个ini文件,文件中配置以下:
[节点名称]:好比element
变量名=定位方式<定位值
其中‘<’分割符
如何对文件进行读取
须要导入import configparser
建立configparser实例
cf=configparser.ConfigParser()
调用read方法读取文件
cf.read('文件所在路径')
5、复选框方法定位linux
http://192.168.10.47:8081/aaa/index2.jsp
复选框方法
2.复选框默认选中,要求不选中
3.复选框默认不选中,要求选中
is_selected():判断复选框是否被选中,若是选中,则方法返回True,不然返回False
判断元素是否可见方法:
is_displayed():判断元素是否可见,若是可见,返回True
get_elements改造思路
如何将判断元素是否可见的函数与get_elements函数结合
1.定义一个数组(列表)用于接受可见元素
2.在定位到元素后,使用for循环,遍历定位到的每个元素
3.在遍历的过程当中,对元素进行判断,使用element_isdisplay判断元素是否可见
1)若是元素不可见,就使用continue跳出本次循环,进入下一次for循环
2)若是元素可见,使用append()方法将元素添加到事先定义好的列表中
4.将可见元素列表返回到调用get_elements函数的地方
新老代码容错处理
修改send_value方法
修改click_element方法
修改check_box_isselected方法
缘由:元素必须可见,才能进行输入,点击操做,因此要修改这些对元素操做的方法,先判断元素是否可见,而后才能对元素进行操做,不然一旦报错,你没法定位问题所在
读取配置文件:
为何?
方便测试数据的维护
使测试数据与测试脚本分离
例子:不使用读取配置文件的方法写了六百个脚本,这六百个脚本里面,都用到了同一个用户名,密码,后续若是该用户名,或密码被删除或修改,咱们就要手动修改这600个脚本
可是一个使用读取配置文件的方法,那么咱们只要把这600个脚本对应的一个配置文件里面的用户名,密码改一改便可
C:/Users/Administrator.USER-20190219YL/PycharmProjects/untitled1/fengzhuang01/a
如何将读取配置文件的类与封装好的方法结合在一块
方法1:
导入类ReadIni
from fengzhuang01.peizhi01 import ReadIni
而后实例化后直接用
弊端:这样会让内存中存在多个ReadIni对象
方法2:单例模式,在编写ReadIni类的下面进行实例化,导入文件时,直接导入实例化的对象
from fengzhuang01.peizhi01 import read_ini
应为读取到的数据是以by<value的格式存储的,全部咱们使用的时候,须要先把by和value分割出来,封装方法,分割读取到的数据,
def get_local_element(self,info):
#定义一个变量,接收读取到的数据
data=read_ini.get_value(info)
#定义一个列表,接收分割收的多个数据
data_list=data.split('<')
#将分割后的数据返回到调用该方法的地方
return data_list
改造get_element方法,将传入的by和value参数,改为配置文件中的变量info,而后调用分割数据的方法,根据传入的info信息,将定位控件所须要的by和value分割出来
自动化中如何处理下拉框
方法1:经过下拉框的腹肌定位到下拉框,而后经过标签名称结合数组定位到要选择的元素
方法2:使用Select
1.须要导入:from selenium.webdriver.support.select import Select
语法:Select(element).select_by_index(n)
其中
element为要操做的下拉框元素
n为要选择的下拉框选项的下标,下标从0开始
功能,根据传入的下标n,在下拉框列表中选择对应的选项
其余方法:
Select(element).select_by_value('value值')
经过value定位选项
Select(element).select_by_visible_text('文本值')
经过文本定位下拉框
封装思路
咱们对下拉框选择功能,进行封装时,可能会遇到以下问题,定位下拉框元素时,可能定位到一个数组,也可能定位到一个元素
封装时要对传入的父元素下标给予一个默认值None,而且进行判断,若是父元素为空,表示程序只会定位到一个元素,不须要指定父元素的下标。此时调用get_element方法定位元素便可
若是父元素下标非空,表示定位的元素是一个表,此时使用get_list_element去处对应下标的元素
将定位的父元素赋值给一个变量,而后直接使用
Select(selected_element).select_by_index(子元素标签)的方法,选择下拉项
C:\\Users\\Administrator.USER-20190219YL\\Desktop\\1559176560(1)
对于非input类型上传文件操做,须要使用键盘事件
Python3使用:PyUserInput扩展包
依次执行以下命令:顺序不可逆
pip install pywin32-224-cp36-cp36m-win32.whl
pip install pyHook-1.5.1-cp36-cp36m-win32.whl
pip install PyUserInputweb
6、鼠标滑动事件编程
键盘事件须知方法
1.实例化
pykey=PyKeyboard()
方法1:
type_string('要上传的文件路径')
功能,输入字符串
方法2:tap_key()
语法1:tap_key(enter_key)
功能:点击回车键
语法2:pykey.tap_key(pykey.shift_key)
功能:敲击键盘上的shift键
C:\\Users\\Administrator.USER-20190219YL\\Desktop\\1559176560(1).png
先完成基本功能,而后在进行抛出异常,if判断,循环等强化工做
下载文件
经过设置浏览器配置完成
参数:
1.download.default_diretory:设置下载路径
2.profile.default_content_settings.popups:表示是否弹出下载的窗口,0表示不弹出(这个设置不必定生效)
函数:
options.add_experimental_option('prefs',prefs)
功能:添加下载配置(路径,是否弹窗)
语法:
options.add_experimental_option('变量名',变量值)
ActionsCharins鼠标滑动事件
有些控件只有鼠标放到上面后,才能出现,要定位这类控件须要书法鼠标滑动事件
前提:
须要导入:from selenium.webderiver.common.action_chains import ActionChains
方法:
move_to_element('元素'):把鼠标放到指定元素上面,可是注意,这个函数只是把这个操做记录下来,须要结合perform()才能执行
perform():提交,执行鼠标的操做
例子:
ActionChinas(浏览器对象).move_to_element(传入元素).perform()
强制刷新
从功能角度,咱们须要同时按下Ctrl和F5
这里须要使用键盘事件,须要导入包:
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
方法:
key_down(Keys.xxx):按下XXX按钮
key_up(Keys.xxx):放开xxx按钮
富文本操做iframe
方法:switch_to.frame('能够传入属性值或元素')
功能:切换到指定的富文本
注意:切换须要时间,执行该代码后须要等待几秒
方法:switch_to.default_content()
功能:将鼠标从富文本中切换出来
滚动条自动化
1.设置滚动条滚动的距离(幅度)
js='document.documentElement.scrollTop=滚动距离';
2.执行滚动操做
deriver.execute_script(js)
练习:在慕课网手记页面找到指定(Java必学只是,引用篇)的课程,点击打开
思路:建立两个循环,外层一个while循环,只要循环条件为真,则获取当前页面全部的课程,并将获取的课程元素放到一个list变量中,而后嵌套FOR循环,在FOR循环中对获取到的页面元素进行遍历,使用被遍历的元素的text属性进行比较,查看是不是咱们要选择的元素。若是是,进行点击操做,而且将while循环条件改成False,不然继续遍历。FOR循环完毕,若是尚未找到元素,则使用driver.execute_script(js)滑动滚动条
深刻SourceMap原理
C:\Users\Administrator.USER-20190219YL\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/Administrator.USER-20190219YL/PycharmProjects/untitled1/jiaoxue01/cookie01.py
[{'domain': '.imooc.com', 'expiry': 1592392577, 'httpOnly': False, 'name': 'zg_f375fe2f71e542a4b890d9a620f9fb32', 'path': '/', 'secure': False, 'value': '%7B%22sid%22%3A%201560856567301%2C%22updated%22%3A%201560856577369%2C%22info%22%3A%201560856567306%2C%22superProperty%22%3A%20%22%7B%5C%22%E5%BA%94%E7%94%A8%E5%90%8D%E7%A7%B0%5C%22%3A%20%5C%22%E6%85%95%E8%AF%BE%E7%BD%91%E6%95%B0%E6%8D%AE%E7%BB%9F%E8%AE%A1%5C%22%2C%5C%22Platform%5C%22%3A%20%5C%22web%5C%22%7D%22%2C%22platform%22%3A%20%22%7B%7D%22%2C%22utm%22%3A%20%22%7B%7D%22%2C%22referrerDomain%22%3A%20%22%22%2C%22cuid%22%3A%20%22GwndWsS_9fo%2C%22%7D'}, {'domain': '.imooc.com', 'httpOnly': False, 'name': 'apsid', 'path': '/', 'secure': False, 'value': 'g0NTZmYjI0MmY5NzU3ZThhOTZhYmRhN2VkOWNiMjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzg3MDIyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIzYjUzZGQ4YTcxM2QyMjNhNzY1NWY2ZWFkMTY3NWMzAsgIXQLICF0%3DMT'}, {'domain': '.imooc.com', 'httpOnly': False, 'name': 'Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968', 'path': '/', 'secure': False, 'value': '1560856578'}, {'domain': '.imooc.com', 'expiry': 1592392577, 'httpOnly': False, 'name': 'zg_did', 'path': '/', 'secure': False, 'value': '%7B%22did%22%3A%20%2216b6a4d1dfe84-02a8e16d8b274a-591d3314-15f900-16b6a4d1dff3b8%22%7D'}, {'domain': '.imooc.com', 'httpOnly': False, 'name': 'loginstate', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.imooc.com', 'expiry': 1592392577, 'httpOnly': False, 'name': 'Hm_lvt_f0cfcccd7b1393990c78efdeebff3968', 'path': '/', 'secure': False, 'value': '1560856567'}, {'domain': '.imooc.com', 'expiry': 1592392566.62759, 'httpOnly': False, 'name': 'imooc_isnew_ct', 'path': '/', 'secure': False, 'value': '1560856569'}, {'domain': '.imooc.com', 'httpOnly': False, 'name': 'cvde', 'path': '/', 'secure': False, 'value': '5d08c7f93b5e0-5'}, {'domain': '.imooc.com', 'expiry': 1592392566.627548, 'httpOnly': False, 'name': 'imooc_isnew', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.imooc.com', 'expiry': 1560942977, 'httpOnly': False, 'name': 'IMCDNS', 'path': '/', 'secure': False, 'value': '0'}, {'domain': '.imooc.com', 'expiry': 1592392566.627463, 'httpOnly': False, 'name': 'imooc_uuid', 'path': '/', 'secure': False, 'value': '3a3c1561-8d40-4afb-ae86-3dd84608464a'}]
Process finished with exit code 0
7、获取服务器返回的cookiewindows
在自动化测试中,若是直接访问某一个功能地址,可能会报错,缘由是由于用户没有登陆,为了不这样的现象,咱们在用户登陆后须要获取服务器返回的cookie,并将其种植到本地页面
方法:
1.get_cookies()
语法:浏览器对象.get_cookies()
功能:获取所有cookie
2.delete_all_cookies()
语法:浏览器对象.delete_all_cookies()
功能:删除全部的cookies
3.add_cookie(cookie)
功能:在当前页面植入cookie
语法:浏览器对象.add_cookie(cookie)
其中cookie是要植入浏览器的cookie
截图自动化
方法:save_screenshot('路径\\图片名.png')
功能:截取浏览器图片,以指定图片名命名,以png格式保存到指定路径
注意:若是不指定路径,则保存的当前指定的python.file所在文件夹下
方法:time.strftime("时间格式")
功能:将时间戳按照指定格式转化为字符串
例子:time.strftime('%Y%m%d,%H%M%S)
程序会按照“年月日,时分秒”的格式将数据保存到字符串
若是截取到的时间戳是2019年6月15日12时13分11秒
则字符串为‘20190615121311’
帐号:lxl
密码:123
[{'domain': '192.168.10.101', 'httpOnly': False, 'name': 'username', 'path': '/aaa', 'secure': False, 'value': 'lxl'},{'domain': '192.168.10.101', 'httpOnly': True, 'name': 'JSESSIONID', 'path': '/aaa', 'secure': False, 'value': '928BDB14DD02A77E9B3759113FF09FDE'}]
八录制web操做脚本数组
Selenium IDE
1.Selenium IDE是什么?
Selenium IDE:是一个Firefox插件,用于记录和播放用户与浏览器的交互(录制web操做脚本)
1.1为何学习selenium IDE?【重点】
使用SeleniumIDE录制的脚本能够转换为代码语言
环境
1.火狐浏览器使用35版本的
2.SeleniumIDE使用2.9.1版本的
3.Firebug
测试网址:
1号店(测试滚动条):http://192.168.10.85:8081/aaa/index2.htm
1号店登陆:http://192.168.10.85:8081/aaa/Login.jsp
富文本:
http://192.168.10.85:8081/aaa/kindeditor/examples/default.html
Selenium IDE如何运行的?
1.Ctrl+Alt+S
2.工具栏中选择SeleniumIDE
若是看不到工具栏怎么办:网页标签旁边的空白处,右键-->菜单栏
Selenium IDE菜单说明
1.文件:建立、打开和保存测试案例或测试案例集
2.编辑:复制、粘贴、删除、撤销和选择测试案例中的全部命令
3.Base URL:用来填写被测网站的地址
4.Fast Slow:速度控制,控制案例的运行速度,最快是Fast,最慢是slow
5.Play entire test suite 运行一个测试案例集中的全部案例
6.Play current test case:运行当前所选定的测试案例
7.Step单步:能够运行一个案例中的一行命令
8.Click to Record录制:点击以后,开始记录你对浏览器的操做。
9.Test Case:案例集列表
10.测试脚本:
table标签:用表格形式展示命令及参数(至关于测试用例中的测试步骤)。
source标签:用原始的方式展示,默认是HTML语言格式,也可使用其它展现。
11.RunsFailures:查看脚本运行/失败的个数
12.Commadn/Target/Value:描述的步骤使用了哪些命令,以及命令对应的参数
13.Log 日志:将Selenium脚本的运行状况记录下来,咱们能够经过日志,查看脚本出问题的地方
Refernerce:参考
UI-ELEMENT:UI 元素
脚本重点分析:
1.录制:录制时红色录制按钮必定要打开->按下状态
2.回放:因为网络延迟缘由,建议选择最慢的回放速度
3.浏览器:回放时浏览器要保持打开状态(不然点击回放,弹出提示框报错)
重点说明:
1.css=input.s_ipt:是1号店搜索框的class属性和值还有定位方式呀
如何将SeleniumIDE录制的脚本转化为代码语言?
文件->Export Test Case As->Python 2/unittest/WebDriver
SeleniumIDE脚本编辑与操做【了解】
目的:手动修改或者编写脚本(由于采用录制方式很容易记录出多余的操做)
a.编辑一行命令
在Table标签下选中某一行命令,命令有command、Target、value组成,能够对着三部份内容进行编辑
b.插入命令
在某一条命令上右击,选择“Insert new Command”命令,就能够插入一个空白命令行,而后对空白行进行编辑
c.插入注释
在SeleniumIDE某一行命令上,鼠标右击,选择“Insert new Comment”命令插入注释空白行,本行内容不被执行,可是能够帮咱们理解脚本,插入的内容以紫色字体显示。
d.移动命令
有时候咱们须要移动某行命令的顺序,咱们只须要左击鼠标拖动到相应的位置便可。
e.删除命令
选择单个或多个命令,而后点击鼠标右键选择“Delete”
f.命令执行
选定要执行的命令行双击便可
注意:有一些命令必须依赖于前面命令的运行结果才能成功执行,不然会大体执行失败
Selenium IDE经常使用命令【了解】
a.open(url)命令
做用:打开指定的URL,URL能够相对或是绝对的URL
Targert:要打开的URL:value为空
1)当Target为空,将打开Base URL中填写的页面;
2)当Target不为空且值为相对路径,将打开Base URL+Target页面。例子:假设Base URL为http://www.zhi97.com而Target为/about.aspx,则执行open命令时,将打开http://www.zhi97.com//about.aspx
3)当Target以http://开头时,将忽略Base URL,直接打开Target的网址;
b.pause(waitTime)
做用:暂停脚本运行
waitTime:等待时间,单位ms(1秒等于1000毫秒)
设置:
在Command中输入pause
在Target中输入等待时间,好比等待5秒则输入5000
value不须要输入值
c.refresh()
做用:刷新当前页面
提示:因为没有参数,因此Target和Value可不填
设置:
在Command中输入refresh
d.goBack()
做用:模拟单击浏览器的后退按钮
提示:因为没有参数,因此Target和Value可不填
设置:
在Command中输入goBack
e.click(locator)
做用:点击一个链接、按钮、复选框或单选按钮
提示:若是该点击事件致使新的页面加载,命令将会加上后缀“AndWait”,即“clickAnd wait”或“waitForPage Toload”命令;(其实就是多了一个加载的等待时间而已)
f.type(locator,value)
做用:向指定输入域输入指定值;也能够为下拉框,复选框和单选按钮赋值
注意:locator也是定位器的意思,和Target一个意思
value表示要输入的值
g.close()
做用:模拟用户单击窗口上的关闭按钮;
提示:因为没有参数,因此Target和Value可不填
经常使用命令总结
1.open-打开网页
2.pause-暂停,一般于等待页面加载元素
3.goback-后退 (注意:必须是同一个窗口打开2个以上url才生效)
4.refresh-刷新
5.click-点击
6.type-输入
7.close-关闭
浏览器