selenium最大化浏览器-Web UI自动化测试之Selenium工具篇

2022-12-26 14:06:55 浏览数 (1)

本文大纲截图:

  一、自动化测试介绍 1、基本介绍 1.1 自动化

  概念:由机器设备代替人工自动完成指定目标的过程

  优点:

  1.2 自动化测试

软件测试:校验系统是否满足规定的需求、弄清预期结果与实际结果之间的差别

  软件自动化测试:让程序代替人工去验证系统功能的过程

  应用场景:

  优点:

  误区:

  分类:UI自动化、接口自动化、性能测试、单元测试

  UI自动化:Web端、移动端

  Web端:

  Web自动化测试在什么阶段开始?

  Web自动化测试所属分类——黑盒测试(功能测试)

  移动端:APP应用、小程序、H5页面

  2、环境搭建

  UI自动化基本环境包括:

  3、测试工具 4、测试流程 5、测试框架 6、基本代码(假定的概念)

  Web 自动化基本代码

   """ Web 自动化基本代码 """

代码语言:javascript复制
    # 1、导入模块
    from [selenium][2] import webdriver
    from time import sleep
    # 2、实例化浏览器对象:类名()
    # 实例化谷歌浏览器对象
    # driver = webdriver.Chrome()
    # 实例化火狐浏览器对象
    driver = webdriver.Firefox()
    # 3、打开网页:必须包含协议头
    driver.get('http://www.baidu.com')
    # 4、观察效果
    sleep(6)
    # 5、关闭页面
    driver.close()

  二、工具 1、基本介绍

   是一个用于Web应用程序的自动化测试工具。

  特点:

  发展史:

   1.0:

  组件: IDE、 Grid、 RC核心组件

   Grid

   RC核心组件

  缺点:

   2.0:

  特点:

   3.0:

  组件: IDE、 Grid、核心组件

   IDE:

   Grid:

  核心组件:

  使用:在Python中调用来写测试脚本,去操作Web端网页应用

  注意:3.0 版本下所有浏览器除了需要安装 框架 以外,还需要安装对应的驱动程序

  特点:

  2、环境安装 2.1 已安装

  pip是一个通用的 Python 包管理工具,提供了对 Python 包的查找、下载、安装、卸载的功能。

  2.2 安装 2.3 安装浏览器驱动

  下载浏览器驱动:

  火狐浏览器:

  2) 48 以下版本: 2.x 内置驱动

  谷歌浏览器:

  Edge浏览器(了解):

  环境变量配置:把驱动文件所在目录添加到Path环境变量中或者直接放到Python安装目录,因为Python已添加到Path中。

  3、工作原理 4、基本代码

   # 导包

代码语言:javascript复制
    from selenium import webdriver
    import time
    # 创建浏览器驱动对象
    # Chrome浏览器:
    driver = webdriver.Chrome()
    # Firefox浏览器:
    driver = webdriver.Firefox()
    # Edge浏览器:
    driver = webdriver.Edge()
    # 打开Web页面
    driver.get("http://www.baidu.com")
    # 暂停
    time.sleep(3)
    # 关闭驱动对象
    driver.quite()

  5、 API 5.1 元素定位

  元素定位方法

   # 导包

代码语言:javascript复制
    from selenium import webdriver
    #定位一个元素
    # driver.find_element_by_xxx()
    driver.find_element_by_id()
    driver.find_element_by_name()
    driver.find_element_by_class_name()
    driver.find_element_by_tag_name()
    driver.find_element_by_link_text()
    driver.find_element_by_partial_link_text()
    driver.find_element_by_xpath()
    driver.find_element_by_css_selector()
    # 定位一组元素
    # driver.find_elements_by_xxx()
    driver.find_elements_by_id()
    driver.find_elements_by_name()
    driver.find_elements_by_class_name()
    driver.find_elements_by_tag_name()
    driver.find_elements_by_link_text()
    driver.find_elements_by_partial_link_text()
    driver.find_elements_by_xpath()
    driver.find_elements_by_css_selector()

  截图:

  注意:

  3)如果调用完元素定位方法后,再点语法,提示的均为列表方法,则方法带了 s 。

  4)如果调用完元素定位方法后,再点语法,提示的均为元素方法,则方法不带 s 。

  方法二:

   # 导包

代码语言:javascript复制
    from selenium.webdriver.common.by import By
    # find_element方法
    # driver.find_element(By.xx, 'xxx')
    driver.find_element(By.ID, 'id值')
    driver.find_element(By.NAME, 'name值')
    driver.find_element(By.CLASS_NAME, 'class_name值')
    driver.find_element(By.TAG_NAME, 'tag_name值')
    driver.find_element(By.LINK_TEXT, 'link_text值')
    driver.find_element(By.PARTIAL_LINK_TEXT, 'partial_link_text值')
    driver.find_element(By.XPATH, 'xpath值')
    driver.find_element(By.CSS_SELECTOR, 'css_selector值')

  元素定位方式

   提供了八种定位元素方式:

  1)id

  过程:由浏览器去定位元素,由元素去输入信息

  说明:当目标元素存在 id属性值时selenium最大化浏览器,优先使用 id 方法定位元素

  2)name

  3)

  4)

  5)

  6)

  7)XPath

  基本介绍:XPath即为 XML Path 的简称,它是一门在 XML 文档中查找元素信息的语言。HTML可以看做是XML的一种实现selenium最大化浏览器,所以 用户可以使用这种强大的语言在Web应用中定位元素。XML:一种标记语言,用于数据的存储和传递。后缀.xml结尾。

  说明:无论哪一种 XPath 策略(方法),定位方法都是同一个,不同策略只决定方法的参数的写法:h('XPath策略')

  XPath定位方法: = driver.h(xpath)

  XPath定位策略

  1)路径-定位

  相对路径:匹配任意层级的元素,不限制元素的位置

  格式:相对路径以// 开始

  2)利用元素属性-定位

  说明:

  3)属性与逻辑结合-定位

  4)层级与属性结合-定位

  XPath-延伸(动态属性):

  动态属性:要定位的元素的属性是动态的,即每次打开页面,这个元素的id或者class等元素属性是动态生成的

  怎么辨别动态属性:一般看到元素属性里有拼接一串数字的,就很有可能是动态的。想要分辨,刷新一下浏览器再看该元素,属性值中的数字串改变了,即是动态属性了。

  2)//*(@, 'xxx')

  3)//*starts-with(@, 'xxx')

  XPath中提供了三个方法来定位部分属性值:

  8)CSS

  基本介绍:

  CSS定位方法: = driver.()

  CSS定位常用策略

  1)id选择器

  2)class选择器

  3)元素选择器

  4)属性选择器

  5)层级选择器

  格式2: 通过来定位,并且为的后代元素

  注意:父子层级关系中也可以使用空格连接上下层级策略(>后面一定是子元素,如果不是直接子元素则不能用>)

  CSS延伸:

  格式2:标签名属性名$='属性值结尾部分内容'

  格式3:标签名属性名*='属性值任意部分内容'

  注意:标签名可以省略!

  5.2 元素操作

  元素操作原因:

  元素常用操作方法:

  1、click()

  2、(value)

  3、clear()

  说明:在实际操作中,一般对于输入框元素,都要先执行清空,再执行输入,避免操作错误。所以()和clear()一般成对操作,即:

  扩展:错误案例

  正确写法:

  元素信息常用获取方法:

  1、size

  2、text

  提示:size、text:为属性,调用时无括号,如:xxx.size

  3、('xxx')

  4、()

  5、()

  6、()

  5.3 特殊元素操作

  选择框操作选择框类型:

  下拉框和复选框

  下拉框操作:

  Select类:

   # 导包

代码语言:javascript复制
    from selenium.webdriver.support.select import Select
    # 实例化对象
    select = Select(element)

  操作方法:

  Select类实现步骤:

  3)调用方法:

  弹出框操作

  弹窗分类

  自定义弹窗:前端代码封装

  注意:

   alert = driver.switch_to.alert

代码语言:javascript复制
    # 获取弹窗信息(可选):该步骤必须在处理弹窗操作之前
    print('弹窗信息是:', alert.text) 
    # 接受对话框选项
    alert.accept()
    # 取消对话框选项
    alert.dismiss()  

  弹出框处理步骤:

   # 获取弹出框对象(切换到弹出框)

代码语言:javascript复制
    alert = driver.switch_to.alert
    # 调用方法进行处理(返回alert/confirm/prompt中的文字信息)
    alert.text
    # 接受对话框选项
    alert.accept()
    # 取消对话框选项
    alert.dismiss()

  滚动条操作:

  概念:一种可控制页面显示范围的组件

  学习滚动条操作的原因:

  js脚本操作

  在中并没有直接提供操作滚动条的方法,但是它提供了可执行脚本的方法,所以我们可以通过脚本来达到操作滚动条的目的。

  代码:

  实现步骤:

   # 设置JavaScript脚本控制滚动条(0:左边距;1000:上边距;单位:像素;说明:反向只需要将坐标归零即可)

代码语言:javascript复制
    js = "window.scrollTo(0, 1000)"
    # selenium调用执行JavaScript脚本的方法
    driver.execute_script(js)

  frame切换操作:

  概念:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素。在中封装了如何切换frame框架的方法。

  frame形式:

   # 形式一:

代码语言:javascript复制
    # 形式二:

  frame切换方法:

   # 切换到指定frame的方法

代码语言:javascript复制
    driver.switch_to.frame(frame_reference)
    # 恢复默认页面方法
    driver.switch_to.default_content()
    '''
    frame_reference:可以为frame框架的name、id或者定位到的frame元素
    # 括号中为frame的属性
    1、driver.switch_to.frame('frame_name')
    # 如果页面中只有一个frame,括号中则可以填写 1
    2、driver.switch_to.frame(1)
    # 如果页面中有多个frame,可以用这种标签索引形式
    3、driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
    '''

  多窗口切换操作:

  在浏览器的一个生命周期内(开启到关闭),任意一个窗口都有唯一的一个句柄值,可以通过句柄值完成窗口切换操作。句柄:handle,窗口的唯一标识码。在中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法。

  注意:如果还想重新操作原始页面,务必要完成窗口切换,回到原始页面才可以继续操作(即使是切换到新的窗口已经关闭,也要切换回原始页面)

  方法:

  步骤:

   # 获取所有窗口句柄(包括新窗口)

代码语言:javascript复制
    handles = driver.window_handles
    # print(handles)
    # print(type(handles))
    # 切换窗口(列表的 -1索引 对应的值始终是 最新窗口的句柄值)
    driver.switch_to.window(handles[-1])

  代码:

   # 获取所有窗口句柄(包括新窗口)

代码语言:javascript复制
    handles = driver.window_handles
    # print(handles)
    # print(type(handles))
    # 切换窗口(列表的 -1索引 对应的值始终是 最新窗口的句柄值)
    driver.switch_to.window(handles[-1])
    # 在新窗口中填写信息
    driver.find_element_by_id('userA1').send_keys('admin1')
    sleep(2)
    # 关闭新窗口(close()方法作用是:关闭当前页面)
    driver.close()
    # 切换回原始窗口进行操作
    driver.switch_to.window(handles[0])
    # 在原始窗口页面填写信息
    driver.find_element_by_id('userA').send_keys('admin')
    sleep(2)
    # 退出浏览器
    driver.quit()

  截图操作:

  自动化脚本是由程序去执行的,因此有时打印的错误信息并不是十分明确,如果在执行出错的时候对当前窗口截图保存,那么通过图片就可以非常直观看到出错的原因。

  应用场景:在自动化测试中,出现错误时,可以通过截图把当前操作的页面截图保存到指定位置,辅助判定分析错误原因。在中,提供了截图方法,我们只需要调用即可。

  窗口截图的方法:

  扩展

   方式一:

代码语言:javascript复制
    # 导包
    import time
    # 设置时间戳
    now_time = time.strftime('%Y%m%d_%H%M%S')
    # 将时间戳拼接到图片名上
    driver.get_screenshot_as_file('./info_{}.png'.format(now_time))
    方式二:
    # 导包
    import time
    driver.get_screenshot_as_file('./info_{}.png'.format(time.strftime('%Y%m%d_%H%M%S')))
    方式三:
    # 导包
    from time import sleep, strftime
    driver.get_screenshot_as_file('./info_{}.png'.format(strftime('%Y%m%d_%H%M%S')))

   btn = driver.find_element_by_tag_name('button')

代码语言:javascript复制
    btn.screenshot('./btn.png')

  验证码操作:

  验证码:一种随机生成的信息(数字、字母、汉字、图片、算术题)等为了防止恶意的请求行为,增加应用的安全性)

  原因:在Web应用中,大部分系统在用户登录注册的时候都要求输入验证码,而在设计自动化测试脚本时,就需要临时处理验证码的问题,否则无法继续执行后续测试。在中并没有对验证码处理的方法,在这里我们介绍一下针对验证码的几种常用处理方式。

  验证码的处理方式

  面试题:常见的验证码处理策略

  总结:

  测试登录功能时,验证码处理策略:去掉验证码(测试环境下)、设置万能验证码(生产环境和测试环境)

  不需要测试登录功能时,验证码处理策略:记录cookie进行跳过登录

  Cookie操作:

  Cookie概念:

  Cookie操作过程:

  Cookie绕过原理:

  注意:

  操作Cookie方法:

  操作Cookie步骤:

  5.4 元素等待

  元素等待:在定位元素时如果未找到,会在指定时间内一直等待的过程。

  设置元素等待的原因:

  分类:隐式等待、显式等待、强制等待

  隐式等待:定位元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常on

  注意:当隐式等待被激活时,虽然目标元素已经出现了,但是还是会由于当前页面内的其他元素的未加载完成而继续等待,进而增加代码的执行时长

  例如:driver.(10)

  显式等待:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出超时异常

   # 导包

代码语言:javascript复制
    from selenium.webdriver.support.wait import WebDriverWait
    WebDriverWait(driver, timeout, poll_frequency=0.5)

  调用方法:until(method)# 直到...时

  例如:

  强制等待:

  方式二:

  隐式等待和显式等待对比:

  5.5 鼠标操作

  原因:现在Web产品中存在丰富的鼠标交互方式,作为一个Web自动化测试框架,需要应对这些鼠标操作的应用场景。

  常见的鼠标操作:点击、右击、双击、悬停、拖拽等;在中将操作鼠标的方法封装在类中。

  类:

   # 导包

代码语言:javascript复制
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    # 实例化浏览器对象
    driver = webdriver.Chrome()
    # 实例化鼠标对象,并关联浏览器对象
    action = ActionChains(driver)

  鼠标常用操作方法:

  1)()

  2)()

  3)()

  4)()

  5)()

  扩展:另一种鼠标操作的写法:(在其他编程语言中称为链式编程)

  5.6 键盘操作

  思考:如何模拟键盘上一些按键或者组合键的输入,如:Ctrl C,Ctrl V。中把键盘的按键都封装在Keys类中:

  Keys类

   # 导包

代码语言:javascript复制
    from selenium.webdriver.common.keys import Keys
    # 实例化浏览器对象
    driver = webdriver.Chrome()
    # 定位元素 ID为userA
    user = driver.find_element_by_id('userA')

  键盘常用操作方法:

  1)(Keys.)

  2)(Keys.SPACE)

  3)(Keys.TAB)

  4)(Keys.ESCAPE)

  5)(Keys.ENTER)

  6)(Keys., 'a')

  7)(Keys., 'c')

  8)(Keys., 'v')

  5.7 浏览器操作

  思考:脚本启动浏览器窗口大小默认不是全屏?如何刷新页面?

  浏览器常用操作方法

  1)()

  2)(width, height)

  3)(x, y)

  4)back()

  5)()

  6)()

  7)close()

  8)quit()

  9)title

  10)

  总结:结合浏览器操作和隐式等待来完善Web UI自动化测试基础代码,如下:

   # 导入模块

代码语言:javascript复制
    from time import sleep
    from selenium import webdriver
    # 实例化浏览器对象
    driver = webdriver.Chrome()
    # 最大化浏览器
    driver.maximize_window()
    # 隐式等待
    driver.implicitly_wait(30)
    # 打开页面
    driver.get('')
    # 展示效果
    sleep(3)
    # 退出浏览器

  最后:【可能给予你助力自动化测试的教程】

  最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走

  面试资料

  我们学习软件测试必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

  上面是我整理的配套资源,这些资源对于软件测试的的朋友来说应该是最全面最完整的备战仓库,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。

本文共 3356 个字数,平均阅读时长 ≈ 9分钟

0 人点赞