🔑

selenium 自动化测试

这是一个老生常谈的话题了,自从基于 Selenium 的自动化测试在科技行业问世以来,它就留下了不可磨灭的印记,并已成为基于 Web 的应用程序使用最广泛的自动化测试方法。

selenium 概述

selenium 介绍

Selenium 是一种开源自动化测试工具,可用于基于 Web 的应用程序的多种专用目的,它为不同的 Web 浏览器、操作系统和编程语言提供支持。Selenium 是一个用 Java编写的软件测试套件 ,它为成为质量保证领域事实上的产品铺平了道路。
凭借支持多种编程语言、操作系统和网络浏览器的能力, 基于 Selenium 的自动化测试 已被 Google、HubSpot、Fitbit、Netflix 等大型技术提供商采用。整个套件为不同的测试问题和需求提供了解决方案。

selenium 发展历史

selenium 是由 Jason Huggins( selenium 自动化行业的先驱取名,这个名字由来是挺有趣的。早在 2000 年,  Mercury 在自动化领域就很受欢迎,并且是 Thoughtwork 的竞争对手。Jason 在发给 ThoughtWork's 团队的一封电子邮件中开了个玩笑,他在邮件中嘲弄了他们的竞争对手 “Mercury”,并指出硒(selenium)是汞(mercury)中毒的解毒剂!他的团队取了这个名字,这就是团队为他们的框架批准 Selenium 这个名字的起源。
这是名字的起源,似乎跟框架一点关系都没有。至于框架的起源,接下来展开聊聊。
Selenium 最初由 Jason Huggins 于 2004 年开发, 当时他在 ThoughtsWork 担任工程师,负责开发需要频繁测试的 Web 应用程序。他使用 JavaScript 创建了程序 ,使用后他意识到手动测试的缺点和需要抑制单调。他最初将程序命名为 JavaScriptTestRunner  ,但在意识到该程序的潜力后,他将其变成了一个开源程序,并重新命名为 硒核心(selenium core)
notion image
然而也出现了问题。由于“同源策略”禁止从启动它的不同域名使用 JavaScript,测试人员不得不承受安装 Selenium Core 和包含要测试的 Web 应用程序的 Web 服务器的压力,这样它们才能属于同一个域。 另一位 ThoughtWork 工程师Paul Hammant 通过创建 Selenium Remote control  (Selenium RC) 或 Selenium 1为这个问题提供了解决方案。
Selenium Grid 由 Patrick Lightbody开发, 用于并行测试目的,解决了将测试执行时间减少到最小的需求。Selenium 自动化测试速度更快,因为可以同时进行多个测试。 日本的Shinya Kasatani在 2006 年通过在Selenium IDE 上执行项目做出了贡献 。Selenium IDE 通过记录 和 播放功能 帮助自动化浏览器  。 Simon Stewart 于 2006 年创建了 Web Driver Circa。该工具可帮助软件测试人员使用任何受支持的编程语言通过编程方法执行测试。
2008 年,整个 Selenium 自动化测试先驱团队决定将 Web 驱动程序和 Selenium RC 合并,形成一个非常有用的工具,称为 Selenium 2
2009年,selenium3 诞生,这个版本剔除了selenium rc , 主要由 selenium webdriver和selenium Grid组成, 我们日常使用的其实就是selenium webdriver,至于selenium grid是一个分布式实现自动化测试的工具

Selenium Webdriver 的工作原理

在平时我们聊到的 selenium 的工作原理实际上就是聊的 selenium webdriver 的工作原理。在聊到这个工作原理之前,我们聊一下坐地铁吧。坐地铁整个过程需要 3 个步骤。
  1. 乘客进站,乘往自己要去的地方
  1. 司机,地铁司机驾驶着地铁,在每一个站都停
  1. 地铁,按照司机的指令去开往对应的轨道上
OK,这里我们聊到了 3 个角色,回到 selenium webdriver 的 3 个角色是什么呢?
  1. 自动化测试代码 (对应乘客)
  1. 浏览器驱动(对应司机)
  1. 浏览器(对应地铁)
当我们在学习 selenium 自动化测试的时候,都必不可少地需要这三个工具。在按照 selenium (selenium 版本)的时候,会提示我们需要去按照浏览器驱动(例如:chrome driver),我们最终执行启动脚本代码,它会自动在浏览器执行我们代码的步骤。那么我们就初步了解到了 selenium webdriver 需要的 3 样东西了。
那么 selenium webdriver 在整个过程都做了些什么?
1. 对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动
2. 浏览器驱动中包含了一个HTTP Server,用来接收这些http请求
3. HTTP Server接收到请求后根据请求来具体操控对应的浏览器
4. 浏览器执行具体的测试步骤
4. 浏览器将步骤执行结果返回给HTTP Server
6. HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息
以上是 selenium 的发展史。

selenium 自动化测试基础

在聊到自动化测试基础,肯定离不开安装 selenium 以及安装驱动的,可以在官网看一下就够了
就像前面说到的,你需要:1. selenium 安装包,2. 你需要一个浏览器驱动,3. 你需要一个浏览器 当你前置条件都准备好了,那么就可以直接进入实战了。
from selenium import webdriver

driver = webdriver.Chrome()

driver.get("http://selenium.dev")

driver.quit()
这是最基础的例子,通过脚本,
  1. 告诉 webdriver,我要启动 Chrome 浏览器
  1. 请求 url:http://selenium.dev
  1. 最后关闭浏览器。
我们对上面的例子进行详细讲解。

导入webdriver

在使用到 selenium 作为自动化测试基础的时候,导入 webdriver 都是必然的事情。没有导入 webdriver ,其他都无法继续执行。
from selenium import webdriver

创建浏览器驱动对象

上面的例子只是创建 Chromedriver 驱动,其实 selenium 还支持很多浏览器驱动。
driver = webdriver.Firefox()
driver = webdriver.Chrome()
driver = webdriver.PhantomJS()
driver = webdriver.Ie()
driver = webdriver.Opera()

关闭窗口/浏览器

关闭窗口和关闭浏览器是两个操作,我们可以先关闭窗口再关闭浏览器,也可以直接关闭浏览器。
# 关闭当个窗口
driver.close()
# 关闭浏览器
driver.quit()

其他常用基本操作

除了上面的简单操作之外,在日常中,还有以下我们是经常会用到的函数。
1. 修改打开浏览器的尺寸
# 最大化
driver.maximize_window()

# 获取当前浏览器界面的尺寸
driver.get_window_size()

# 设置浏览器尺寸
driver.set_window_size(480, 800)  #参数数字为像素点

# 获取浏览器的位置
driver.get_window_position()

# 设置浏览器位置
driver.set_window_position(x,y)

2. 页面操作
# refresh 刷新页面
driver.refresh()

# back() 模拟浏览器的后退操作
driver.back()

# forward() 模拟浏览器的前进操作
driver.forward()

3. 验证操作
# current_url 显示当前url
driver.current_url

# title 显示当前页面的标题
driver.title

# 保存快照
driver.get_screenshot_as_png('file.png')    # 这种方式只能存成png图片
driver.get_screenshot_as_file('file2.jpg')    # 这种方式可以存成其他格式

定位元素操作

定位元素是执行 UI 自动化测试的必不可少的操作,所以这一节点展开探讨关于定位元素的操作。
selenium 提供了 8 种获取元素的方式:
定位方式
说明
id
id定位
name
name属性值定位
class name
伪类名定位
tag name
标签名定位
link text
链接文本定位
partial link text
部分链接文本
xpath
xpath路径表达式
css selector
css选择器定位
其中最常用到的是 xpath,以及 css 定位方式,这两种方式使用的范围很广,也是对于自动化测试兼容性最强的定位方式。关于 xpath 定位元素的方式可以参考:Xpath 教程
操作元素
# 点击操作
el = driver.find_element_by_xxxx()
el.click()

# 输入操作
el = driver.find_element_by_xxxx()
el.clear()                            # 清空操作,只能清空能够输入文本的元素,比如说input,text
el.send_keys(data)                    # 输入操作,同上,用于向元素输入内容

# 提交操作
el = driver.find_element_by_xxxx()
el.submit()                            # 一般可以用在登录的场景,和click的操作一致,但是应用范围不如click广

# 获取文本内容
el.text

# 获取标签属性
el.get_attribute(属性名)

# 获取元素尺寸
el.size

# 获取是否可见
el.is_displayed()

selenium 高级语法

除了前面说到的打开浏览器,获取浏览器信息,定位元素之后,这都是对页面的简单的操作。但是在日常的操作中,我们不仅仅是对于这部分信息的操作,还有其他更多的操作的。例如:关闭弹窗,多窗口操作,多标签等等
1. 多标签
# 获取所有的标签句柄列表
driver.window_handles

# 切换到指定标签
driver.switch_to_window(driver.window_handles[1])

# switch_to(更为推荐的方法)
driver.switch_to.window(driver.window_handles[n])

2. 多表单切换
switch_to.frame() 默认可以直接取表单的id 或name属性

# 直接通过id进入
driver.switch_to.frame('x-URS-iframe')
# 先定位到元素再进入
el_frame = driver.find_element_by_id('x-URS-iframe')
driver.switch_to.frame(el_frame)

# driver.switch_to.default_content()
跳回最外层的页面。

# driver.switch_to.parent_frame()
跳回上层的页面。
  • 鼠标&键盘操作
from selenium.webdriver import ActionChains        # 导入类
ActionChains(driver)                            # 调用 ActionChains()类, 将浏览器驱动 driver 作为参数传入。
perform() 执行所有 ActionChains 中存储的行为(接在ActionChains类之后)
# ---- 右击 context_click()----
from selenium import webdriver
# 导入动作链
from selenium.webdriver import ActionChains
import time
url = 'http://www.baidu.com'

driver = webdriver.Firefox()

driver.get(url)
# 创建动作池对象
acobj = ActionChains(driver)

# 定位到百度的logo图片
el_lg = driver.find_element_by_id('lg')

# 添加邮件点击动作并执行
acobj.context_click(el_lg).perform()

# ---- 双击 double_click()----
from selenium import webdriver
# 导入动作链
from selenium.webdriver import ActionChains
import time

url = 'http://www.baidu.com'

driver = webdriver.Firefox()
driver.get(url)
# 创建动作对象
acobj = ActionChains(driver)
# 定位到视频元素
el = driver.find_element_by_css_selector('a.mnav:nth-child(1)')

# 执行双击操作
acobj.double_click(el).perform()

# ---- 鼠标悬停 move_to_element() -----
from selenium  import webdriver
from selenium.webdriver import ActionChains
import time

url = 'https://www.jd.com/'
driver = webdriver.Firefox()
driver.get(url)

#获取左侧种类元素列表
mylist = driver.find_elements_by_css_selector('li.cate_menu_item')
# print (mylist)
# 创建动作动作对象
acobj = ActionChains(driver)

for el in mylist:
    acobj.move_to_element(el).perform()
    time.sleep(3)


# 键盘事件
Keys()类提供了键盘上几乎所有按键的方法
from selenium import  webdriver
from selenium.webdriver.common.keys import Keys
import time

# print (dir(Keys))

url = 'https://cn.bing.com/'

driver = webdriver.Firefox()
driver.get(url)

el = driver.find_element_by_id('sb_form_q')

el.send_keys('selenium')
# 全选并删除
el.send_keys(Keys.CONTROL,'a')
time.sleep(3)
el.send_keys(Keys.CONTROL,'x')

# 退格并回车
el.send_keys('seleniumm')
time.sleep(3)
el.send_keys(Keys.BACK_SPACE)
time.sleep(3)
el.send_keys(Keys.ENTER)


以下为常用的键盘操作:
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘 F1
……
send_keys(Keys.F12) 键盘 F12
 
 
 
 
  • 弹出框(警告框)
  • 下拉框
  • 调用JavaScript代码
  • 等待
  • cookies
你觉得这篇文章怎么样?
YYDS
比心
加油
菜狗
views

Loading Comments...