selenium2.0

一、概念
自动化测试,广义上来讲所有借助工具来辅助进行软件测试的方法都可以称为自动化测试;狭义上来讲,主要指基于UI层的功能自动化测试


分层自动化测试
1、单元自动化测试。几乎所有的语言都有其相应的单元测试框架,如Java语言的Junit、python语言的unittest、Javascript的QUnit;code review为代码评审和代码审查,对源代码进行系统性检查,与code review相关的插件,基于eclipse的reviewclipse、针对python的review board
2、接口自动化测试(接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文,服务器接收请求报文后做处理响应给客户端)
大体分为两类:模块接口测试和web接口测试
模块接口测试:主要强调对一个类方法或函数的调用,对返回结果的验证,所用到的测试工具与单元自动化测试相同
web接口测试:分为服务器接口测试和外部接口测试
服务器接口测试:测试浏览器与服务器的接口。用户的操作在前端页面上,需要后端提供服务器接口,前端通过调用这些接口来获得需要的数据,通过HTTP协议实现前后端的数据传递,Loadrunner也能做接口测试
外部接口测试:指用的接口由第三方系统提供
接口测试也有相应的类库或工具,如HTTP的有HttpUnit,Postman等
3、UI功能自动化测试
早期的自动化测试工具主要针对该层设计,目前主流的测试工具:UFT、Watir、Robot Framework、Selenium、Appium
手机功能测试非自动化:借助抓包工具charles、fiddler以及ddms抓包,看接口返回数据以及模拟接口返回数据


UFT(Unified Functional Testing) 由HP公司开发,提供了强大易用的录制回放功能,同时兼容对象识别模式与图像识别模式两种识别方式,支持B/S和C/S两种架构
Robot Framework 基于python语言编写的,可同时测试多种类型的客户端或接口,可以进行分布式测试
Watir(web application testing in ruby) 基于Ruby开发的,用于web应用程序测试的工具
selenium 主要用于web应用程序的自动化测试,支持多平台、多浏览器、多语言


selenium 不是由单独一个工具构成的,而是由一些插件、类库组成
selenium2=selenium1.0+webDriver
webDriver是通过原生浏览器支持或者浏览器扩展来直接控制浏览器。webDriver可以看作是selenium RC的替代品
选择selenium自动化测试语言时不需要考虑与开发语言的一致性


selenium IDE基于Firefox浏览器的一个插件,提供了脚本的录制、回放以及编辑脚本的功能


selenium Grid 可以在不同的主机上建立主节点hub和分支节点node,可以使主节点上的测试用例在不同的分支节点上运行。帮助我们进行分布式测试的工具
python多线程,分布式和并行是两个完全不同的概念,分布式只负责将一个测试用例远程调用到不同的环境下执行,而并行强调同时执行多个任务
python通过两个标准库thread和threading提供对线程的支持,threading支持守护线程


自动化测试模型介绍
线性测试,每个脚本相对独立且不产生其他依赖与调用,每个脚本是一个测试用例
模块化驱动测试,把重复的操作独立成公共模块,
数据驱动测试,数据参数化,实现数据与脚本的分离。参数化方式:定义变量、定义数组、字典、读取文件(txt/csv/xml)
关键字驱动测试,


二、安装
步骤一,下载并安装python
步骤二,下载并安装pip
步骤三,下载并安装selenium,md进入相应的目录下—》python -m pip install --user selenium-3.4.3-py2.py3-none-any.whl
python所安装的第三方类库或框架模块默认存放在C:\Users\Administrator\AppData\Roaming\Python\Python36\site-packages目录下
是否安装成功:pip3 show selenium
步骤四,下载并安装浏览器驱动,解压缩得IEDriverServer.exe—》放在环境目录下,可放于python的环境目录下


遇到的问题:selenium.common.exceptions.WebDriverException:Message:Unexcpected error launching Internet Exceplorer.Protected Mode settings are not the same for all zones.Enable Protected Mode must be set to the same value for all zones.
修改浏览器安全设置—》将Internet/本地Internet/受信任的站点/受限制的站点所有的启用保护模式全部都去掉勾


三、WebDriver API 定位元素
find_element_by_id(“”)  在当前页面中唯一
find_element_by_name(“”)  在当前页面中不唯一
find_element_by_class_name(“”) 可以被多次引用
find_element_by_tag_name(“input”) tag识别某个元素的概率很低
find_element_by_link_text(“hao123”) 通过元素标签对之间的文本信息来定位元素
find_element_by_partial_link_text(“”) 通过元素标签对之间的部分文本信息来定位元素


XPath定位
1.绝对路径定位 find_element_by_xpath(“html/body/div/div[2]/div/div/div/form/span/input”)
div[2]表示当前层级下的第二个div标签
2.利用元素属性 find_element_by_xpath(“//input[@id=’kw’]”)
//表示当前页面某个目录下,input为标签名,如果不想指定标签名,可用星号(*)代替,不局限于id,能唯一标识元素的任意属性都可以
3.层级与属性结合 find_element_by_xpath(“//span[@class=’bg’]/apan[2]/input”)
4.使用逻辑运算符 find_element_by_xpath(“//input[@id=’kw’ and class=’su’]/span/input”)


CSS定位
1.通过class属性定位(.) find_element_by_css_selector(“.bg”)
2.通过id属性定位(#) find_element_by_css_selector(“#kw“)
3.通过标签名定位 find_element_by_css_selector(“input”)
4.通过父子关系定位 find_element_by_css_selector(“span>input”)
5.通过属性定位  find_element_by_css_selector(“[name=’kw’]”)
6.组合定位 find_element_by_css_selector(“form.fm>span>input.s”)


用By定位元素,更推荐前面介绍的写法
find_element(By.ID,”kw”)
find_element(By.NAME,”wd”)
find_element(By.CLASS_NAME,”s_ipt”)
find_element(By.TAG_NAME,”input”)
find_element(By.LINK_TEXT,”hao123”)
find_element(By.PARTIAL_LINK_TEXT,”hao”)
find_element(By.XPATH,”//*[@class=’bg’]”)
find_element(By.CSS_SELECTOR,”span.bg>input#su”)


360安全浏览器,F12打开开发者选项,可以定位相关的元素,右击有copy css path和copy xpath,非常方便


有时候,F12开发者选项框并不会嵌在页面的右侧,可以用左上方箭头图标定位页面元素




四、WebDriver API 操作元素
driver.set_window_size(480,800)  控制浏览器窗口大小
driver.maximize_window() 打开浏览器全屏
driver.back()  模拟浏览器后退
driver.forward() 模拟浏览器前进
driver.refresh() 刷新当前页面


clear 清除文本
send_keys(“”) 模拟按键输入
click() 单击元素
submit() 提交表单,submit()的应用范围远不及click()广泛


size 返回元素的尺寸
text 返回元素的文本
get_attribut(name) 获得属性值
is_displayed() 设置该元素是否用户可见


perform() 执行所有actionchains中存储的行为,可理解为对整个操作的提交动作
context_click() 右击
double_click() 双击
drag_and_drop(source,target) 拖动
move_to_element()  鼠标悬停
例:
right_click=driver.find_element_by_id(“xx”)
ActionChains(driver).context_click(right_click).perform()


send_keys() 模拟键盘输入,如空格键send_keys(Keys.SPACE),全选send_keys(Keys.CONTROL,’a’)
获得验证信息
1.title 获得当前页面的标题
2.current_url 获得当前页面的URL
3.text


显示等待
WebDriver(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:浏览器驱动
timeout:最长超时时间,秒为单位
poll_frequency:检测的间隔时间,默认为0.5s
ignored_exceptions:超时后的异常信息,默认抛出NoSuchElementException异常
一般配合until()和until_not()方法一起使用
until(method,message=’’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True
until_not(method,message=’’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False
隐式等待
driver.implicitly_wait(10) 并不针对页面上的某一元素进行等待。如果元素可以定位,则继续执行;如果元素定位不到,将以轮询的方式不断地判断元素是否被定位到
sleep(3) 休眠时间


定位一组元素,如checkbox
find_elements_by_id() 此处为elements
......


对于frame/iframe表单内嵌页面上的元素无法直接定位,需要通过switch_to.frame(“id”)
switch_to.parent_frame() 跳到上级frame
switch_to.default_content() 跳回最外层的页面
如果frame下再内嵌着frame需要一级一级到达


swith_to.window() 在页面操作过程中点击链接会弹出新的窗口
current_window_handle 获得当前窗口句柄
window_handle 返回所有窗口的句柄到当前会话


switch_to_alert() 定位到alert/confirm/prompt
text 返回alert/confirm/prompt 中的文字信息
accept() 接受现有警告框
dismiss() 解散现在警告框
send_keys(“text”) 发送文本至警告框


上传文件 send_keys()
AutoIt
下载文件 webdriver.FirefoxProfile()
AutoIt


操作cookie,cookie数据是以字典的形式进行存放的???[{},{}]
get_cookies() 获得所有cookie信息
get_cookie(name) 返回字典的key为name的cookie信息
add_cookie(cookie_dice) 添加cookie,必须有name和value值
delete_cookie() 删除cookie信息
delete_all_cookies() 删除所有的cookie信息


调用javaScript
driver.execute_script(js)


处理HTML5的视频播放
窗口截图并保存 driver.get_screenshot_as_file(“d:\\pyse\img.jpg”) 
关闭窗口 driver.close()


验证码的处理
1.去掉验证码
2.设置万能验证码
3.验证码识别技术,python-tesseract
4.记录cookie 将用户名和密码写入浏览器cookie中,再次访问网站时,服务器将直接读取浏览器的cookie进行登录


WebDriver原理
WebDriver属于selenium体系中设计出来操作浏览器的一套API
1.WebDriver启动目标浏览器,并绑定到指定端口。启动的浏览器实例将作为WebDriver的Remote Server
2.Client端通过CommandExcuter发送HTTPRequest给Remote Server的侦听端口(通信协议the webdriver wire protocol)
3.Remote Server需要依赖原生的浏览器组件来转化浏览器的native调用


五、Selenium IDE
学习selenium IDE的目的不是为了使用它来进行自动化测试,但对新手来讲,可以帮助我们编写自动化测试脚本
1、下载安装插件
2、selenium IDE界面介绍
3、编辑脚本
command命令名称\Target定位的元素\Value输入的值
编辑一行命令或注释、插入命令、插入注解、移动操作、定位辅助
4、selenium IDE命令
open(url) 在浏览器中打开url
click(elementLocator)  单击链接、按钮、复选和单选框
clickAndWait()  单击后需要等待响应
type(inputLocator,value)  模拟键盘输入,向指定的input中输入值
select(dropDownLocator,optionSpecifier) 根据optionSpecifier选项选择器来选择一个下拉菜单选项
goback() 模拟单击浏览器的后退按钮
selectWindow(windowId) 选择一个弹出窗口
pause(millisenconds) 根据指定时间暂停selenium脚本执行
fireEvent(elementLocatore,evenName) 模拟页面元素事件被激活的处理动作
close() 模拟单击浏览器关闭按钮
5、断言和验证
真正的测试用例一定是需要做断言和验证的,一定要有预期结果与实际结果进行比较的过程。
四种命令:assert(断言)、verify(验证)、waitFor(等待)、store(定义变量)
五种验证手段:Title(获取页面的标题)、Value(获得元素的值)、Text(获得元素的文本信息)、Table(获得元素的标签)、ElementPresent(获得当前元素)


使用断言,测试用例将会在断言失败后停止运行;使用验证,当执行验证命令失败后不会终止测试。
waitfor用于在一定时间内等待某一元素显示
store(expression,variableName) expression为变量值,variableName为变量名


六、单元测试
单元测试框架unittest
1、TestCase 一个测试用例,包括测试前准备环境的搭建(setUp)、实现测试过程的代码(run)、测试后环境的还原(tearDown),一个测试用例就是一个完整的测试单元
2、TestSuite 一个功能的验证往往需要多个测试用例,把我个测试用例集合在一起执行,就产生了测试套件TestSuite,可以通过addTest加载TestCase到TestSuite中
3、Test Runner 通过TextTestRunner类提供的run()方法来执行test suite/test case。test runner可以使用图形界面、文本界面或返回一个特殊的值等方法来表示测试执行的结果
4、Test Fixture 对一个测试用例环境的搭建和销毁就是一个fixture,通过覆盖setUp()和tearDown()方法实现。setUpModule/tearDownModule在整个模块的开始与结束时被执行;setUpClass/tearDownClass 在测试类的开始与结束时被执行;setUp/tearDown在测试用例开始与结束时被执行。
例子:
from calculator import Count
import unittest


class TestCount(unittest.TestCase):
    def setUp(self):
        print("test start")
    def test_add(self):
        j = Count(2,3)
        self.assertEqual(j.add(),5)
    def test_add2(self):
        j = Count(41,76)
        self.assertEqual(j.add(),117)
    def tearDown(self):
        print("test end")
    
if __name__=="__main__":
    #构造测试集
    suite = unittest.TestSuite()
    suite.addTest(TestCount("test_add"))
    suite.addTest(TestCount("test_add2"))
    
    #执行测试
    runner = unittest.TextTestRunner()
runner.run(suite)


assertEqual(first,second,msg=None),断言第一个参数和第二个参数是否相等,如果不相等则测试失败。msg为可选参数,用于定义测试失败时打印的信息
assertNotEqual()
assertTrue()
assertFalse()
assertIn()
assertNotIn()
......


TestLoader类负责根据各种标准加载测试用例,并将它们返回给测试套件。unittest提供了可以共享的defaultTestLoader类,可以使用其子类和方法创建实例。discover()方法找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名才能被加载
discover(start_dir,pattern=’test*.py’,top_level_dir=None)
start_dir 要测试的模块名或测试用例目录
pattern 表未用例文件名的匹配原则
top_level_dir = None 测试模块的顶层目录,如果没有顶层目录,默认为None


unittest框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为0-9,A-Z,a-z
unittest.skip(reason) 无条件地跳过装饰的测试,说明跳过测试的原因
unittest.skipIf(condition,reason) 如果条件为真时,跳过装饰的测测试
unittest.skipUnless(condition,reason) 当条件为真时,执行测试
unittest.expectedFailure() 不管执行结是否失败,统一标记为失败


1、通过selenium IDE录制一个测试用例
2、Export Test Case As—》python2/unittest/WebDriver
3、生成web自动化测试用例,利用其组织测试用例、断言预期结果以及批量执行测试用例等功能
4、生成测试报告,HTMLTestRunner类,需下载放到python安装目录下,import导入即可使用


pageObject设计模式,分层
1、Page基础类,在初始化方法__init__()中定义驱动、基本的URL和超时时间等
2、LoginPage类,继承Page类,对登录页面的元素进行封装,页面对象层只关心元素的定位问题
3、test_user_login()函数,将单个元素操作组成一个完整的动作,重用性强
4、创建main()函数,测试用例只关心测试的数据

你可能感兴趣的:(自动化测试)