- selenium
- 概念
- 基本用法 流程
- 元素定位
- 步骤
- 元素用法
- selenium IDE: 录制回放功能,转换多种编程语言的脚本
- selenese指令集合
- 保存脚本
- 编辑脚本
- selenium RC:
- selenium Grid:
- web自动化测试工具
- WebDriver 的 Python 绑定
- 原理:调用浏览器原生接口操作浏览器。通过创建webdriver对象,对象调用webdriver API访问浏览器 核心是HTTP请求。
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BjnXE8fL-1633422840811)(C:UsersZMLinAppDataRoamingTyporatypora-user-imagesimage-20210508001948670.png)]
环境搭建
①. 基于Python环境搭建,安装selenium包,pip install selenium(2.48.0)
②. 本地安装浏览器驱动,驱动下载完的chromedriver.exe放在chrome安装路径下的application下,并将该路径添加到path环境变量
-
示例代码
# 1. 导包 from selenium import webdriver from time import time # 2. 创建浏览器驱动对象 # Firefox浏览器: driver = webdriver.Firefox() # Chrome浏览器: driver = webdriver.Chrome() # Edge浏览器: driver = webdriver.Edge() # 3. 打开Web页面 driver.get("http://www.baidu.com/") # 4. 暂停 time.sleep(3) # 5. 关闭驱动对象 driver.quit()
- 元素定位就是通过元素的信息或元素层级结构来定位元素的
- 结合浏览器开发者工具f12**,快速定位元素,** 查看元素信息
- Selenium提供了八种定位元素方式
- id 是唯一的,元素不共享
- name名字,元素之间可以共享,类似人与人之间重名
- class_name类,一个元素可以属于多个class
- tag_name HTML本质就是由不同的tag组成, 每一种标签一般在页面中会存在多个, 所以不方便进行精确定位,一般很少使用
- link_text 为超链接的全部文本内容
- partial_link_text可以使用局部来匹配元素, 也可以使用全部文本内容匹配元素
- XPath ①路径-定位 ②利用元素属性-定位 ③属性与逻辑结合-定位④层级与属性结合-定位
- CSS id选择器、class选择器、元素选择器、属性选择器、层级选择器**
- 导入selenium包 --> from selenium import webdriver
- 导入time包 --> import time
- 实例化浏览器驱动对象 --> driver = webdriver.Firefox()
- 打开注册A.html --> driver.get(url)
- WebDriver会等待页面完全加载完(就是onload函数被触发了),才把程序的控制权交给你的测试或者脚本。 但是如果你的页面用了太多的AJAX,那么这个机制就没什么卵用了,因为它不知道页面到底是什么时候加载完。如果你需要确定页面完全加载完了,你可以使用waits
- 调用id定位方法 --> element = driver.find_element_by_id("")
- 使用send_keys()方法输入内容 --> element.send_keys(“admin”)
- 暂停3秒 --> time.sleep(3)
- 关闭浏览器驱动对象 --> driver.quit()
- quit() 退出浏览器
- close() 关闭一个标签页
浏览器、元素操作
1. 常见的元素三类操作
① 需要让脚本模拟用户给指定元素输入值 send_keys(value)
② 需要让脚本模拟人为删除元素的内容 clear()
③ 需要让脚本模拟点击操作 click()
2. 常见的浏览器操作**,示例,driver.maximize_window()**
① maximize_window() 最大化浏览器窗口 --> 模拟浏览器最大化按钮
② set_window_size(width, height) 设置浏览器窗口大小 --> 设置浏览器宽、 高(像素点)
③ set_window_position(x, y) 设置浏览器窗口位置 --> 设置浏览器位置
④ back() 后退 --> 模拟浏览器后退按钮
⑤ forward() 前进 --> 模拟浏览器前进按钮
⑥ refresh() 刷新 --> 模拟浏览器F5刷新
⑦ close() 关闭当前窗口 --> 模拟点击浏览器关闭按钮
⑧ quit() 关闭浏览器驱动对象 --> 关闭所有程序启动的窗口
⑨ title 获取页面title
⑩ current_url 获取当前页面UR
3. 获取元素常见信息
① size 返回元素大小
② text 获取元素的文本
③ get_attribute(“xxx”) 获取属性值, 传递的参数为元素的属性名
④ is_displayed() 判断元素是否可见
⑤ is_enabled() 判断元素是否可用
⑥ is_selected() 判断元素是否选中, 用来检查复选框或单选按钮是否被选中
4. 模拟鼠标操作
说明: 在Selenium中将操作鼠标的方法封装在ActionChains类中
- ActionChains鼠标键盘操作
实例化对象:
action = ActionChains(driver)
方法:
l context_click(element) 右击 --> 模拟鼠标右键点击效果
l double_click(element) 双击 --> 模拟鼠标双击效果
l drag_and_drop(source, target) 拖动 --> 模拟鼠标拖动效果
l move_to_element(element) 悬停 --> 模拟鼠标悬停效果
l perform() 执行 --> 此方法用来执行以上所有鼠标操作
为了更好的学习其他方法, 我们先学习perform()执行方法,因为所有的方法都需要执行才能生效
1. 导包: from selenium.webdriver.common.action_chains import ActionChains 2. 实例化ActionChains对象: action = ActionChains(driver) 3. 调用右键方法: action.context_click(element) 4. 执行: action.perform()
5. 模拟键盘输入
常用的键盘操作:
l send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
l send_keys(Keys.SPACE) 空格键(Space)
l send_keys(Keys.TAB) 制表键(Tab)
l send_keys(Keys.ESCAPE) 回退键(Esc)
l send_keys(Keys.ENTER) 回车键(Enter)
l send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
l send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
导包: from selenium.webdriver.common.keys import Keys from selenium import webdriver driver = webdriver.Firefox() driver.get(url) element = driver.find_element_by_id("") element.send_keys(Keys.ENTER)
- 等待:
- 显式等待:明确等待条件,指定元素
- 隐式等待:无明确开始条件,全局范围的等待,对所有元素都设置等待时间
- 上传与下载
- 不浏览本地文件,直接下载和上传
- fileInput.send_Keys()、urllib.urlretrieve()
下拉框的选择、弹出框、多窗口切换
- action:页面操作
- open、click、type、sendkeys
- Asseritons:断言检查点
- assertLocation、assertTitle、assertValue…
- Verify:验证检查
- verifyTitle、verifyTestPresent、verifyVisible…
- wait:延迟等待(IDE最大等待时间是30s)
- clickAndWait、typeAndWait、waitForVisible…
- 可以将一系列脚本保存为一个Test Suit
- Test Case连接点进去是HTML 表格
- 编辑调试:insert new command 可以直接插入步骤
- 可以暂停和逐步执行、添加断点
- 模糊匹配:*. 匹配任意;[ 阿3a-z]匹配括号规则
- 正则表达式:regexp
- rollup:提取相同公共的部分
- JAVA编写的服务端,处理测试脚本发送的HTTP请求,来操作浏览器
- 支持分布式测试,不同平台、浏览器的多台远程设备同时运行脚本,提高效率
- 原理:一个hub节点+若干Node节点;hub管理node,并接受远程调用请求,在把请求命令转发给Node。
- 原理实际与通过selenium sever调用一样,知识环境启动的方式不一样
- 步骤:
- 终端启动hub
- 终端启动node(若要为hub启动多个node,要为每个node分配不同的端口)
- 查看grid状态
- 运行代码



