目录
1. Selenium基础
1.1 Selenium简介
- 介绍:selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
- 安装:pip install selenium
- 官方文档
1.2 浏览器驱动
selenium3.x版本开始不再提供默认浏览器支持,所有浏览器都是通过各个浏览器官方提供相应的浏览器驱动进行支持,这使得运行在各种浏览器上的自动化测试更稳定
1.3 PhantomJS
- 介绍:无头浏览器,一个完整的浏览器内核,包括js解析引擎,渲染引擎,请求处理等,但是不包括显示和用户交互页面的浏览器
- 安装
1.4 webdriver安装路径
- Win:复制webdriver到Python安装目录下
- Mac:复制webdriver到/usr/local/bin目录下
2. Selenium 快速入门
2.1 定位元素
- 定位单个元素:find_element
- 定位多个元素:find_elements
- find_element_by_id:根据id查找某个元素
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https//www.baidu.com/')
driver.find_element_by_id('kw')
driver.find_element(By.ID, 'kw')
- find_element_by_class_name:根据类名c查找元素
driver.find_element_by_class_name('s_ipt')
driver.find_element(By.CLASS_NAME, 's_ipt')
- find_element_by_name:根据name属性的值查找元素
driver.find_element_by_name('wd')
driver.find_element(By.NAME, 'wd')
- find_element_by_tag_name:根据标签名查找元素
driver.find_element_by_tag_name('input')
driver.find_element(By.TAG_NAME, 'input')
- find_element_by_xpath:根据xpath语法获取元素
driver.find_element_by_xpath('//input[@name="wd"]')
driver.find_element(By.XPATH, '//input[@name="wd"]')
- find_element_by_css_selector:根据css选择器选择元素
driver.find_element_by_css_selector('#kw')
driver.find_element(By.CSS_SELECTOR, '#kw')
- find_element_by_link_text:通过完整超链接定位
- find_element_by_partial_link_text:通过部分链接定位
2.2 操作表单元素
方法 | 说明 |
---|---|
set_window_size() | 设置浏览器的大小 |
maximize_window() | 浏览器窗口最大化 |
minimize_window() | 浏览器窗口最小化 |
fullscreen_window() | 全屏 |
back() | 控制浏览器后退 |
forward() | 控制浏览器前进 |
refresh() | 刷新当前页面 |
clear() | 清除文本 |
send_keys(value) | 模拟按键输入 |
click() | 单击元素 |
sumbit() | 提交表单 |
get_attribute(name) | 获取元素属性值 |
is_displayed() | 判断该元素是否用户可见 |
size | 返回元素的尺寸 |
text | 获取元素的文本 |
实例
from selenium import webdriver
# 创建Chrome浏览器对象
driver = webdriver.Chrome()
# 通过浏览器向服务器发送URL请求
driver.get('https://www.baidu.com')
# 设置浏览器大小
driver.set_window_size(800,600)
# 最大化
driver.maximize_window()
# 最小化
driver.minimize_window()
# 全屏
driver.fullscreen_window()
# 刷新当前页面
driver.refresh()
input_tag = driver.find_element_by_id('kw')
# 模拟按键输入
input_tag.send_keys('python')
# 清除文本
input_tag.clear()
# 单击元素
driver.find_element_by_id('su').click()
# 控制浏览器后退
driver.back()
# 控制浏览器前进
driver.forward()
# 判断该元素是否用户可见,返回布尔值
print(input_tag.is_displayed()) # True
# 返回元素的尺寸
print(input_tag.size) # {'height': 44, 'width': 548}
# 获取元素的文本
print(driver.find_element_by_id('virus-2020').text) # 抗击疫情
# 获取元素属性值
print(driver.find_element_by_id('kw').get_attribute('type')) # text
3. 行为链
- 有时候在页面中的操作可能有很多步,那么这时候课时使用鼠标行为链ActionChains来完成
- ActionChains可以完成简单的交互行为,例如鼠标移动,鼠标点击事件,键盘输入,以及内容菜单交互。这对于模拟那些复杂的类似于鼠标悬停和拖拽行为很有用
- 当你在ActionChains对象上调用行为方法时,这些行为会存储在ActionChains对象的一个队列里。调用perform()时,这些动作就以他们队列的顺序来触发
方法 | 说明 |
---|---|
click() | 单击元素 |
click_and_hold() | 鼠标左键点击一个元素并且保持 |
context_click() | 右键点击 |
double_click() | 双击元素 |
drag_and_drop() | 点击并拖动 |
drag_and_drop_by_offset() | 拖拽目标元素到指定的偏移点释放 |
key_down() | 按键或者发送组合键 |
key_up() | 释放一个按键 |
move_by_offset() | 从当前鼠标位置移动到指定位置 |
move_to_element() | 把鼠标移到一个元素的中间 |
move_to_element_with_offset() | 鼠标移动到元素的指定位置,偏移量以元素的左上角为基准 |
send_keys() | 发送文字到指定元素 |
send_keys_to_element() | 发送某个键到指定元素 |
实例
from selenium import webdriver
# 引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains
# 创建Chrome浏览器对象
driver = webdriver.Chrome()
# 通过浏览器向服务器发送URL请求
driver.get('https://www.baidu.com')
# 构造ActionChains对象
action = ActionChains(driver)
# 定位到输入框
input_tag = driver.find_element_by_id('kw')
# 定位到百度一下按钮
click_tag = driver.find_element_by_id('su')
# 发送某个键到指定元素
action.send_keys_to_element(input_tag,'python')
# 点击按钮 百度一下
action.move_to_element(click_tag).click()
text_tag = driver.find_element_by_id('virus-2020')
action.move_to_element(text_tag)
# 鼠标左键点击一个元素并且保持
action.click_and_hold()
# 右键点击
action.context_click()
text2_tag = driver.find_element_by_id('s-usersetting-top')
# 将指定元素拖动到目标元素上
action.drag_and_drop(text_tag,text2_tag)
# 拖拽目标元素到指定的偏移点释放
action.drag_and_drop_by_offset(text_tag,100,100)
# 提交行为链的操作
action.perform()
4. 键盘事件
Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_keys()方法。它不仅可以模拟键盘输入,也可以模拟键盘的操作
模拟键盘按键 | 说明 |
---|---|
send_keys(Keys.BACK_SPACE) | 删除键(BackSpace) |
send_keys(Keys.SPACE) | 空格键(Space) |
send_keys(Keys.TAB) | 制表键(Tab) |
send_keys(Keys.ESCAPEE) | 回退键(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) |
实例
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
element = driver.find_element_by_id('kw')
element.send_keys('python')
# 删除键
element.send_keys(Keys.BACK_SPACE)
# 空格键
element.send_keys(Keys.SPACE)
# 制表键
element.send_keys(Keys.TAB)
# 回退键
element.send_keys(Keys.ESCAPE)
# 回车键
element.send_keys(Keys.ENTER)
# 全选
element.send_keys(Keys.CONTROL,'a')
# 复制
element.send_keys(Keys.CONTROL,'c')
# 剪切
element.send_keys(Keys.CONTROL,'x')
# 粘贴
element.send_keys(Keys.CONTROL,'v')
5. 多表单切换
针对frame嵌套内的页面上元素,可以通过switch_to_frame()方法切换
方法 | 说明 |
---|---|
switch_to.frame() | 将当前定位的主体切换为frame/iframe表单的内嵌页面中 |
switch_to.default_content() | 释放iframe,重新回到主页面上 |
实例
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.douban.com/')
# 切换iframe
driver.switch_to.frame(driver.find_element_by_xpath('//div[@class="login"]/iframe'))
# 选择ckeckbox选项
driver.find_element_by_id('account-form-remember').click()
# 释放iframe,重新回到主页面上
driver.switch_to.default_content()
6. 多窗口切换
WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换
方法 | 说明 |
---|---|
current_window_handle | 获得当前窗口句柄 |
window_handles | 返回所有窗口的句柄到当前会话 |
switch_to.window() | 用于切换到相应的窗口,与上一节的switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换 |
实例
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://news.baidu.com/')
# 点击跳转到新的窗口
driver.find_element_by_class_name('a3').click()
# 获得当前所有打开的窗口的句柄
handles = driver.window_handles
# 切换回第一个窗口
driver.switch_to.window(handle[0])
7. 警告框处理
在WebDriver使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作
方法 | 说明 |
---|---|
text | 返回 alert/confirm/prompt 中的文字信息 |
accept() | 接受现有警告框 |
dismiss() | 解散现有警告框 |
send_keys() | 发送文本至警告框 |
8. 下拉框选择操作
WebDriver提供了Select类来处理下拉框
方法 | 说明 |
---|---|
select_by_value(“选择值”) | select标签的value属性的值 |
select_by_index(“索引值”) | 下拉框的索引 |
select_by_visible_text(“文本值”) | 下拉框的文本值 |
实例
from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')
# 切换iframe
driver.switch_to.frame(driver.find_element_by_id('iframe'))
# 找到下拉框
select_tag = Select(driver.find_element_by_name('country-wrap'))
# 根据下拉框的索引选择
select_tag.select_by_index(2)
# 根据下拉框的值选择
select_tag.select_by_value('CA')
# 根据下拉框的文字选择
select_tag.select_by_visible_text('Canada')
9. 文件上传
对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过send_keys()指定本地文件路径的方式实现文件上传
10. 页面等待
在selenium中,当我们定位的元素由于网络原因还没加载出来,浏览器找不到我们要定位的元素就会报错。等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段
方法 | 说明 |
---|---|
time.sleep() | 强制等待 |
implicitly_wait() | 隐式等待 |
WebDriverWait() | 显性等待 |
实例
from selenium import webdriver
from selenium.webdriver.commom.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 强制等待2s,不管你浏览器是否加载完,程序都得等待2秒,2秒一到,继续执行下面的代码
time.sleep(2)
# 隐式等待,设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止
driver.implicitly_wait(10)
driver.find_element_by_id('kw').send_keys('python')
print(driver.current_url)
driver.quit()
# 显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了.它主要的意思就是:程序每隔x秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
try:
element = WebDriverWait(driver,20,0.5)until(EC.presence_of_element_located((By.ID,'kw')))
time.sleep(5)
finally:
driver.quit()
11. cookie操作
WebDriver提供了操作Cookie的相关方法,可以读取、添加和删除cookie信息
方法 | 说明 |
---|---|
get_cookies() | 获取所以cookie |
get_cookie() | 获取指定cookie |
add_cookie() | 添加cookie |
delete_cookie() | 删除cookie |
delete_all_cookies() | 删除所有cookie |
实例
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 获取所有cookie,返回的是一个列表
cookies = driver.get_cookies()
print(cookies)
#添加cookie
driver.add_cookie({'name': 'zouzou', 'value': '123'})
cookies2 = driver.get_cookies()
print(cookies)
# 删除cookie
driver.delete_cookie('zouzou')
# 获取指定cookie
print(driver.get_cookie('zouzou'))
12. 调用JavaScript代码
WebDriver提供了execute_script()方法来执行JavaScript代码
实例
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 设置浏览器窗口大小
driver.set_window_size(500,500)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(2)
# 通过javascript设置浏览器窗口的滚动条位置,window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置
js = "window.scrollTo(100,650)"
driver.execute_script(js)
13. 页面截图
方法 | 说明 |
---|---|
save_screenshot() | 截取当前窗口,并把图片保存到本地 |
get_screenshot_as_file() | 截取当前窗口,并把图片保存到本地 |
实例
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://news.baidu.com/')
# 截取当前窗口,并指定截图图片的保存位置
driver.save_screenshot('百度.png')
14. 关闭浏览器
方法 | 说明 |
---|---|
quit() | 关闭单个窗口 |
close() | 关闭所有窗口 |
实例
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://news.baidu.com/')
# 关闭单个窗口
driver.quit()
# 关闭所有窗口
driver.close()