UI自动化

一、什么是自动化测试?
1、什么是自动化?

自动化谷歌使用驱动对应的版本地址:https://blog.csdn.net/huilan_same/article/details/51896672
概念:由机器设备代替人为自动完成指标的过程
1.1、优点:
a.减少人工劳动力
b.工作效率提高
c.产品规格统一标准
d.规模化(批量生产)

2、什么是自动化测试?
概念:让程序代替人为去验证程序功能的过程

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项目功能的过程

2、什么Web项目适合做自动化测试?
a.需求变动不频繁
b.项目周期长
c.项目需要回归测试

3、如何进行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

4、什么是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

4、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


二、8种元素定位

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)相对路径

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


三、如何打开不同的浏览器


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')



四、对复选框状态进行判断

焦点定位:
方法: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('文件所在路径')
五、复选框方法定位

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 PyUserInput

六、鼠标滑动事件

键盘事件须知方法
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
七、获取服务器返回的cookie

在自动化测试中,如果直接访问某一个功能地址,可能会报错,原因是因为用户没有登录,为了避免这样的现象,我们在用户登录后需要获取服务器返回的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-关闭


posted on 2019-09-07 12:03  无泪人  阅读(882)  评论(0)    收藏  举报

导航