• 字节测开耗时三碗蛋炒饭写下的web自动化测试全流程


     

    【文章末尾给大家留下了大量的福利】

    一.web自动化入门

    1.什么是web自动化测试?
    让程序代替人为自动验证web项目功能的过程
    2.什么web项目适合做自动化测试
    需求变动不频繁
    项目周期长
    需要回归测试
    3.测试工具:
    web自动化测试:selenium
    app端自动化测试:Appium
    接口自动化测试;jemeter,postman
    性能测试:jemeter.loadrunner
    4.selenium webdriver工作原理

    二.WebDriver基础

    1.搭建webdriver环境

    2.webdriver元素定位
    2.1 8大元素定位方式
    1.id
    2.name
    3.class_name
    4.tag_name
    5.link_text
    6.partial_link_text
    7.xpath
    8.css
    2.2 定位方式分类-汇总
    1.id,name,class_name:为元素属性定位
    2.tag_name:为元素标签定位
    3.link_text,partial_link_text:为超链接定位(a标签)
    4.xpath:为元素路径定位
    5.css:为css选择器定位
    2.3 id定位方法
    find_element_by_id()
    ** id定位实现步骤分析**
    1.导入selenium包 from selenium import webdriver
    2.导入time包 import time
    3.实例化火狐浏览器 driver=webdriver.Firefox()
    4.打开页面 driver.get('url’) url使用r转义
    5.调用id定位方法 driver.find_element_by_id(’’)
    6.使用send_keys()发送数据 .send_keys('abc’)
    7.暂停三秒 time.sleep(3)
    8.关闭浏览器 driver.quit()
    2.4 name定位
    find_element_by_name()
    说明:html规定name属性指定元素名称,因此作用更像人名,name属性值并不唯一
    name定位方式与id一致
    2.5 class_name定位
    find_element_by_class_name()
    说明:html规定了class来指定元素类名,用法和id,name类似
    2.6 tag_name定位
    find_element_by_tag_name()
    说明:html本质就是由不同的tag(标签)组成,而每个tag都是同一类,所以tag定位效类低,tag_name定位就是通过标签名来定位
    说明:使用tag_name获取第二个元素
    代码:driver.find_element_by_tag_name('input’)[1].send_keys('123’)
    2.7 link_text定位
    说明:link_text,专门用来定位超链接文本标签
    link-text定位方法
    1.方法:find_element_by_link_text(’’)
    2.说明:需要传入a标签全部文本
    2.8 partail_link_text定位
    说明:partail_link_text是对link_text的补充,partial_link_text为模糊匹配,link_text为全部匹配
    pritail_link_text定位方法
    1.方法:find_element_by_partail_link_text()
    2.说明:需要传入a标签局部文本,能表达唯一性
    2.9 find_elements_by_xxx
    作用:查找所有符合条件的元素
    返回的定位元素格式为列表
    说明:列表数据格式的读取需要指定下标(下标从0开始)

    3.Xpath.CSS定位
    什么时候使用xpath,css
    id,class,name属性值为动态获取,随着刷新或加载而变化
    3.1 Xpath定位策略
    xpath定位方法
    driver.find_element_by_xpath()
    1.路径定位
    绝对路径
    相对路径
    2.利用元素属性
    3.层级与属性结合
    4.属性与逻辑结合
    路径(绝对路径,相对路径)
    绝对路径:从最外层元素到指定元素之间所有经过元素层级路径
    例如:/html/body/div/p[2]
    提示:绝对路径从/开始
    使用firebug可以快速生成,元素xpath绝对路径
    相对路径:从第一个符合条件的元素开始(一般配合属性区分)
    例如://input[@id='kw’]
    提示:相对路径以//开始
    使用firebug拓展可以快速生成,元素相对路径
    利用元素属性
    说明:快速定位元素,利用元素唯一属性
    实例://[@id='userA’]
    层级与属性结合
    说明:要找的元素没有属性,但他的父级有
    实例://
    [@id='p1’]/input
    属性与逻辑结合
    说明:解决元素间相同属性重名问题
    实例://[@id='telA’ and @class='telA’]
    Xpath延伸
    //
    [text()='xxx’] 文本内容是xxx的元素
    //[starts-with(@attribute,'xxx’)] 属性以xxx开头的元素
    //
    [contains(@attribute,'sxxx’)] 属性中含有xxx的元素

    3.2 CSS定位
    1.在selenium中极力推荐css定位,因为它比xpath定位速度要快
    css定位方法
    driver.find_element_by_css_selector()
    css定位常用策略
    1.id选择器
    2.class选择器
    3.元素选择器
    4.属性选择器
    5.层级选择器
    使用css的案例
    通过类名,id,和标签名定位


    层级选择器
    说明:根据元素的父子关系来选择
    格式:元素>元素,例如:P>input 返回所有p元素下的input元素
    提示:> 可以用空格代替 例如 p input
    元素之间的嵌套关系



    通过属性



    通过父子关系



    元素状态



    css总结



    4.xpath和css类试功能对比



    5.元素操作方法
    1.clear() 清除文本
    2.send_keys() 模拟输入
    3.click() 单击元素
    5.1webdriver操作浏览器常用方法
    1.maxmize_window() 最大化
    2.set_window_size(100,100) 浏览器大小,设置浏览器宽高(像素点)
    3.set_window_position(300,200) 浏览器位置,设置浏览器位置
    4.back() 后退
    5.forward() 前进
    6.refresh() 刷新
    7.close() 关闭单个窗口
    8.quit() 关闭所有webdriver启动窗口
    5.2webdriver操作浏览器总结
    最大化浏览器
    driver.maxmize_window()
    刷新
    driver.refresh()
    后退
    driver.back()
    前进
    driver.forward()
    设置浏览器大小
    driver.set_window_size(300,200)
    设置浏览器位置
    driver.set_window_position(300,200)
    关闭单个浏览器窗口
    driver.close()
    关闭所有浏览器
    driver.quit()

    6.webdriver的其他用法
    1.size 返回元素大小
    2.text 返回元素文本
    3.title 获取页面title
    4.current_url 获取当前页面url
    5.is_display() 判断元素是否可见
    6.is_enabled() 判断元素是否可用
    7.get_attribute(’'xx') 获取属性值
    提示:
    1.size,text.title,current_url:为属性,调用时无括号
    2.title,current_url:使用浏览器实例化对象直接调用,例如:driver.title
    6.1webdriver其他常用方法总结:
    获取文本框大小
    size=driver.find_element_by_id('userA’).size
    print('size’:size)
    获取a标签内容
    text=driver.find_element_by_id('fwa’).text
    print('a标签text’:text)
    获取title
    title=driver.title
    获取当前页面url
    url=driver.current_url
    获取a标签href属性值
    href=driver.find_element_by_id('fwa’).get_attribute('href’)
    判断span是否显示
    display=driver.find_element_by_id_css_selector('span’).is_displayed()
    判断取消按钮是否可用
    enabled=driver.find_element_by_id('cancelA’).is_enabled()

    三.中级API

    包括:元素等等,警告框操作,下拉选择框,滚动条,切换frame表单,窗口截图,键盘鼠标操作
    1.webdriver鼠标操作
    说明:webdriver中将操作鼠标的方法封装在ActionChains类中
    1.double_click() 双击
    2.drag_and_drop() 拖动
    3.move_to_element() 悬停
    4.perform() 执行,用次方法执行以上所有鼠标方法
    例如:注册页面A,在用户名文本框上点击鼠标双击
    1.导包:from selenium.webdriver.common.action_chains import ActionChains
    2.实例化ActionChains对象:action=ActionChains(driver)
    3.调用双击方法:element=action.double_click(username)
    4.执行:element.perform()

    2.webdriver键盘操作
    说明:webdriver中将操作键盘的方法封装在keys类中
    导包:from selenium.webdriver.commom.keys import keys
    2.1常用的键盘操作

    1. send_keys(Keys.BACK_SPACE)删除键(BackSpace)
    2. send_keys(Keys.SPACE)空格键(Space)
    3. send_keys(Keys.TAB)制表键(Tab)
    4. send_keys(Keys.ESCAPE)回退键(Esc)
    5. send_keys(Keys.ENTER)回车键(Enter)
    6. send_keys(Keys.CONTROL,'a’) 全选(Ctrl+A)
    7. send_keys(Keys.CONTROL,'c’)复制(Ctrl+C)

    3.元素等待
    隐式等待调用方法
    方法:implicitly_wait(秒),最大等待时长
    调用:driver.implicitly_wait(10)
    说明:如果定位某一元素失败,就会触发隐式等待有效时长,如果在指定时长内加载完毕则继续执行,否则抛出NosuchelementExcption异常,如果元素定位到了不会触发隐式等待

    4.下拉选择框
    说明:下拉框就是HTML中的select元素
    4.1select类
    select方法:
    1.select_by_index() 根据option索引来定位,从0开始
    2.select_by_value() 根据option属性 value值来定位
    3.select_by_visible_text() 根据option显示文本来定位
    4.2 select类实现方法
    1.导包select类 from selenium.webdriver.support.select import Select
    2.实例化select类 select=Select(driver)
    3.调用方法:select.select_by_index(0)
    select.select_by_visible_text('上海’)
    select.select_by_value('cq’)select_by_value('cq’)

    5.警告框处理
    说明:webdriver对警告框的操作,有专门的处理方法
    提示:html中常用对话框有三种,处理方法都一样
    1.alert
    2.confirm
    3.prompt
    5.1 警告框处理方法
    1.text 返回文字信息
    2.accept() 接受对话框选项
    3.dismiss() 取消对话框选项
    5.2 调用方法
    1.获取警告框
    alert=driver.switch_to.alert
    2.调用
    alert.text
    alert.accept()
    alert.dismiss()
    5.3处理警告框总结
    定位alert按钮
    alert=driver.find_element_by_id('alert’).click()
    获取警告框
    alert=driver.switch_to.alert
    打印警告文本
    print(alert.text)
    接受警告栏
    alert.accept()
    取消警告栏
    alert.dismiss()

    6.滚动条操作
    说明:调用JavaScript方法操作滚动条
    为什么要学习滚动条:
    在html页面中,由于前端技术框架原因,页面元素为动态显示,元素根据滚动条下拉而被加载
    6.1需求分析实现
    1.设置JavaScript脚本控制滚动条 js='windos.scrollTo(0,100)’
    2.webdriver调用js脚本方法 driver.execute_script(js)

    7.frame表单切换
    说明:webdriver类库中封装了html页面中使用frame表单框架技术的方法
    方法:driver.switch_to.frame(’’) 切换表单方法
    driver.switch_to.default_content() 恢复默认页面方法
    7.1操作原理
    1.html中iframe标签提供了内联结构,使用内联结构可以在一个浏览器中显示多个页面
    2.iframe标签是外层页面的标签,若想操作iframe框架内嵌的页面,需要先定位到iframe页面
    3.通过switch_to.frame()切换到内层页面,在进行内层页面的操作
    4.内层页面的操作和普通页面一致,元素定位,元素操作
    7.2 frame表单切换
    说明:在webdriver类库中封装了HTML页面中使用frame表单框架技术定位的方法
    操作步骤:
    1.定位到iframe标签
    2.完成切换
    若iframe具有id属性,直接使用id属性值切换进内层页面
    driver.switch_to,.frame()
    定位到iframe元素,再切换进入
    element=driver.find_element_by_id(’’)
    driver.switch_to.frame(element)


    8.多窗口
    多窗口切换
    说明:再webdriver中封装了获取当前窗口句柄方法和获取所有窗口句柄的方法以及切换指定句柄窗口的方法
    句柄(handle,窗口的唯一标识码)
    方法:
    driver.current_window_handle 获取当前窗口句柄
    driver.window_handles 获取所有窗口句柄
    driver.switch_to.window() 切换到指定句柄

    9.窗口截图
    方法:在同级目录下创建image文件夹
    get_screenshot_as_file(’./image/01.png’) 截取当前窗口

    10.验证码
    说明:在web应用中,需要输入验证码
    10.1 验证码处理方式:
    去掉验证码 测试环境下
    设置万能验证码 生产环境
    记录cookie
    10.2 记录cookie
    方法:
    get_cookies() 获取本网站所有本地cookie
    get_cookie(name) 获取指定cookie
    add_cookie(str) 添加cookie str:为字典格式 {’ ’ : ’ '}
    10.3实现步骤分析
    1.登录百度,抓取(BAIDUID,BDUSS)
    2.使用add_cookie()方法,添加(BAIDUID,BDUSS)键和值
    3.调用刷新方法 driver.refresh()
    10.4代码示例
    from selenium import webdriver
    import time
    driver=webdriver.Firefox()
    driver.get(r'https://www.baidu.com')
    driver.add_cookie({'name’:'BAIDUID’,'value’:'根据实际填写’})
    driver.add_cookie({'name’:'BDUSS’,'value’:'根据实际填写’})
    time.sleep(3)
    driver.refresh()
    time.sleep(3)

    四.自动化测试框架

    1.unitTest框架
    专门用来执行代码测试的框架
    为什么使用unittest框架
    1.能够组织多个用例执行
    2.提供丰富断言方式
    3.提供丰富日志结果和测试结果
    1.2 unittest 核心要素
    1.TestCase
    2.TestSuite
    3.TextTestRunner
    4.Fixture
    1.3 TestCase
    说明:一个testcase就是一条测试用例
    使用:
    1.导包 import unittest 导入unittest框架
    2.继承 unittest.TestCase 新建测试类继承unittest.TestCase
    提示:
    1.测试用例:在自动化测试用,一条用例就是一个完整的测试流程
    2.测试方法名称必须以test开头
    1.4 TestSuite
    说明:测试套件,多条测试用例集合在一起就是一个TestSuite
    使用:
    1.实例化:suite=unittest.TestSuite()
    suite为TestSuite得实例化名称
    2.添加用例:suite.addTest(类名('方法名’))
    3.添加整个类:suite.addTest(unittest.makeSuite(类名)) 搜索指定类中以test开头的方法
    提示:一条测试用例内,多个方法也可以被执行
    testsuite要配合TextTestRunner才能被执行
    1.5 TextTestRunner
    说明:测试执行,用来执行测试用例套件的
    使用:
    1.实例化 runner=unittest.TextTestRunner()
    runner是texttestrunner的实例化名称
    2.执行 runner.run(suite)
    suite为测试套件名字
    1.6 Fixture
    说明:是一个概述,测试环境的搭建和销毁
    使用:
    1.初始化(搭建) def setup( ) 首先执行 此方法继承于unittest.TestCase
    2.结束 def teardown() 最后执行 此方法继承于unittest.TestCase
    提示:
    1.必须继承于unittest.TestCase类,setup和teardown才是一个Fixture
    2.setup一般做初始化工作,比如:实例化浏览器,浏览器最大化,设置隐式等待
    2.teardown一般做结束工作,比如:退出登录,关闭浏览器
    4.如果一个测试类有多个test开头方法,每个方法执行前都运行setup,结束时运行teardown

    2.uniTest断言
    断言分类:
    1.布尔类型断言
    2.比较断言
    3.复杂断言
    2.1 布尔类型断言 结果只有True和False

    2.2 断言主要代码:
    获取登录信息
    text=self.driver.find_element_by_css_selector(’.loginfo’).text
    print('登录成功信息为’,text)
    try:
    使用断言判断text是否包含admin字符
    self.assertIn('admin’,text)
    excpt AssertionError as e:
    driver.get_screenshot_as_file(’./image/01.png’)
    抛出异常
    print(e)

  • 相关阅读:
    ES 批量删除数据
    2022年华中杯数学建模挑战赛C题矿井提升机钢丝绳的缺陷分析求解全过程文档及程序
    虾皮网同行数据丨虾皮数据工具-知虾:监控竞争对手数据的利器
    计算机视觉与机器学习D1
    python学习笔记-04
    torch.hub 记录
    Java把Base64编码格式的图片下载到本地指定文件夹下
    BI国产化,必须要弄懂的2个关键
    CompletableFuture 使用教程
    接口测试实战教程01:接口测试环境搭建
  • 原文地址:https://blog.csdn.net/csdnchengxi/article/details/126549249