selenium 安装
selenium 使用
1. 安装
selenium 虽然是工具,但是实际是 python 中一个库
pip install selenium==3.14
2. 浏览器驱动下载
https://googlechromelabs.github.io/chrome-for-testing/
下载后放入到 python 的 scripts 中去
from selenium import webdriver
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位到搜索框,然后输入内容
driver.find_element_by_css_selector('input[name="wd"]').send_keys("Kobe")
# 点击搜索按钮
driver.find_element_by_css_selector('input[value="百度一下"]').click()
3. xpath 选中元素
/:代表的是直接子节点
//:后代节点
4. 浏览器操作
- 缩放
- 前进和后退
- url
- 刷新
import time
from selenium import webdriver
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
time.sleep(2) # 停顿 2s
# 设置 宽 和 高
driver.set_window_size(480, 800)
# 后退
driver.back()
time.sleep(3)
# 前进
driver.forward()
time.sleep(3)
# 刷新当前页面
driver.refresh()
5. webDriver 常见方法
import time
from selenium import webdriver
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位到搜索框,然后输入内容
search_element = driver.find_element_by_css_selector('input[name="wd"]')
search_element.send_keys("Kobe")
time.sleep(2)
search_element.clear() # 清除先前输入的内容
time.sleep(2)
search_element.send_keys("名侦探柯南")
# 点击搜索按钮
# driver.find_element_by_css_selector('input[value="百度一下"]').click()
# 使用 summit() 提交表单
search_element.submit()
# 返回搜索框元素的大小
print(search_element.size)
time.sleep(2)
# 获取百度一下 按钮的 value 属性的值
button_element = driver.find_element_by_id("su")
button_value = button_element.get_attribute("value")
print(button_value)
# is_displayed():设置该元素能否用户可见 true / false
# 使用场景:页面弹窗(我们判断:如果弹窗可见,则需要处理弹窗)
print(button_element.is_displayed())
6. 事件
鼠标
在 WebDriver 中,将这些用于鼠标操作的方法封装在 ActionsChains 类提供。ActionChains 类提供了鼠标操作的常用方法
- perfrom():执行所有 ActionChains 中存储的行为
- context_click():右击
- double():双击
- drag_and_drop():拖动
- move_to_element():悬停
import time
from selenium import webdriver
# 导入这个类:设置鼠标悬停操作
from selenium.webdriver.common.action_chains import ActionChains
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位到设置按钮
setting_button = driver.find_element_by_id("s-usersetting-top")
# 设置鼠标悬停
# ActionChains(打开的浏览器对象).move_to_element(悬停的元素).perform()
# perform():执行前面的操作
ActionChains(driver).move_to_element(setting_button).perform()
键盘
Keys()类提供了键盘上几乎所有按键的方法。前面了解到,send_keys()方法可以用来模拟键盘输入,除此之外,我们还可以用它来输入键盘上的按键,甚至是组合键,如Ctrl+A、Ctrl+C等。
import time
from selenium import webdriver
# 导入这个类:调用键盘
from selenium.webdriver.common.keys import Keys
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位输入框
search_box = driver.find_element_by_id("kw")
# 输入内容
search_box.send_keys("seleniumm")
time.sleep(2)
# 删除多余的 m ===> 调用删除键(删除多次)
search_box.send_keys(3 * Keys.BACK_SPACE)
7. 获取断言信息(判断操作是否成功)
文本信息
import time
from selenium import webdriver
# 导入这个类:调用键盘
from selenium.webdriver.common.keys import Keys
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位搜索框
search_box = driver.find_element_by_id('kw')
# 输入内容
search_box.send_keys("张无忌")
# 调用回车键
search_box.send_keys(Keys.ENTER)
# 多个元素存在一个列表中【内部有双引号,所以外层要用单引号】
titles = driver.find_elements_by_xpath('//div[@id="content_left"]//div/h3/a')
print(titles)
# 由于是一个列表,要获取内容,遍历
for t in titles:
# 获取文本内容
print(t.text)
Title 信息
import time
from selenium import webdriver
# 导入这个类:调用键盘
from selenium.webdriver.common.keys import Keys
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位搜索框
search_box = driver.find_element_by_id('kw')
# 输入内容
search_box.send_keys("张无忌")
# 调用回车键
search_box.send_keys(Keys.ENTER)
time.sleep(3)
# 获取网页标题
print(driver.title)
URL 地址
# 获取网页标题
print(driver.current_url)
获取到 url
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%BC%A0%E6%97%A0%E5%BF%8C&fenlei=256&rsv_pq=0x997eb7990021a701&rsv_t=425bY%2FmKOMc%2BzQwNSW4VXk6tqy9HOYhg2famtRzdXxJAgKIsRyreFyE2x1Jy&rqlang=en&rsv_enter=1&rsv_dl=tb&rsv_sug3=3&rsv_sug2=0&rsv_btype=i&inputT=56&rsv_sug4=56
8. 设置元素等待
为了解决页面加载太慢,而代码执行过快,元素定位不到的问题
强制等待
time.sleep(3)
隐式等待
# 隐式等待
针对后面所有页面都有效:判断如果某个元素没有加载出来,最大超时时间为:10s
driver.implicitly_wait(10)
显示等待
显示等待设置的时候,需要给每一个元素单独设置,偶尔有一个元素,由于=业务需要加载时间比较长,则可以单独设置显示等待
import time
from selenium import webdriver
# 在显示等待的时候,元素定位方式需要使用 By 加载
from selenium.webdriver.common.by import By
# 设置显示等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位搜索框
search_box = driver.find_element_by_id('kw')
# def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
# 1. 最大超时时间
# 2. 轮询时间
# 5s 内,每隔 0.5s 去加载一次:如果超过 5s 还没加载出来,则报错
# EC.presence_of_all_elements_located(By.ID):接受的是元素定位方式和具体的表达式,要使用元组的形式传入
WebDriverWait(driver, 5, 0.5).until(EC.presence_of_all_elements_located((By.ID, 'kw')))
# 输入内容
search_box.send_keys("hello")
# 设置提交
search_box.submit()
9. 多窗口切换
浏览器打开的窗口其实会有一个叫做句柄的概念。句柄类似于一个标签页的 id 一样,是唯一的
import time
from selenium import webdriver
# 在显示等待的时候,元素定位方式需要使用 By 加载
from selenium.webdriver.common.by import By
# 设置显示等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位搜索框
search_box = driver.find_element_by_id('kw')
# 输入内容
search_box.send_keys("马蓉")
# 设置提交
search_box.submit()
# 获取标签页句柄
window_handle1 = driver.current_window_handle
print(window_handle1) # 9D4E36A3CFF6FF82C0572BE52F4F73A5
# 点击百度百科
driver.find_element_by_xpath('//*[@id="1"]/div/h3/a').click()
# 强制等待
time.sleep(3)
# 获取当前浏览器的所有窗口的句柄
handles = driver.window_handles
print(handles) # 列表 ['9D4E36A3CFF6FF82C0572BE52F4F73A5', '691D4F289DB96E5A67A357E3869D4B42']
# 根据句柄进行切换【切换到列表中最新的】
driver.switch_to.window(handles[-1])
# 再点击编辑按钮
driver.find_element_by_xpath('//*[@id="J-lemma-main-wrapper"]/div[2]/div/div[1]/div/div[2]/div[1]/div/a[1]').click()
10. iframe表单切换
某个元素的属性是无序的字母或者数字时,那么这个属性是不能用的
我们要获取 iframe,但是没有可用的id,所以先选择上层的 div
import time
from selenium import webdriver
# 在显示等待的时候,元素定位方式需要使用 By 加载
from selenium.webdriver.common.by import By
# 设置显示等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("https://mail.163.com/")
# 使用 xpath 方式定位 iframe 标签
iframe_element = driver.find_element_by_xpath('//*[@id="loginDiv"]/iframe')
# 切换
driver.switch_to_frame(iframe_element)
time.sleep(3)
# 用户名
driver.find_element_by_name('email').send_keys('David')
# 密码
driver.find_element_by_name('password').send_keys('11112233')
# 点击登录
driver.find_element_by_id('dologin').click()
# 由于登陆时,邮箱和密码,是在内存子页面中,所以通过 iframe 已经切换进去了,而 VIP 又在最外层页面 ===>
# 快速切换到最外层
driver.switch_to_default_content()
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[2]/div[2]/a[3]').click()
11. 警告框处理 alert
使用 JS 实现的 alert 警告框,使用元素定位的方式无法定位
注意:操作时候,首先要切换到 alert 弹窗
切换到 alert 弹窗
alter_obj = driver.switch_to.alert
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>警告窗口操作</title>
<script type="text/javascript">
function alertButton() {
alert('我是普通的alert提示框');
};
function confirmButton() {
var msg = confirm('点击[确定]或者[取消]按钮');
if (msg) {
alert('你点击的是[确定按钮]');
} else {
alert('你点击的是[取消按钮]');
}
};
function promptButton() {
var msg = prompt('输入一个值:', '我是默认值');
if (msg) {
alert('输入的值为:\n' + msg);
} else {
alert('输入值为空');
}
};
</script>
</head>
<body>
<!-- 静态注册 -->
<button onclick="alertButton()">我只是一个普通的按钮</button>
<button onclick="confirmButton()">具有确定和取消按钮</button>
<button onclick="promptButton()">具有确定和取消按钮(可以输入内容)</button>
</body>
</html>
普通的 alter 弹窗
import os
import time
from selenium import webdriver
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 由于是直接打开 html 页面,需要路径拼接
filePath = "file:///" + os.path.abspath("new_file.html")
print(filePath)
# 打开网页
driver.get(filePath)
# 1. 操作普通弹窗
driver.find_element_by_xpath('/html/body/button[1]').click()
time.sleep(1)
# 2. 切换到 alert 弹窗
alter_obj = driver.switch_to.alert
# 3. 获取弹窗文本信息
print(alter_obj.text)
# 4. 点击弹窗确认按钮
time.sleep(2)
alter_obj.accept();
confirm弹窗
import os
import time
from selenium import webdriver
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 由于是直接打开 html 页面,需要路径拼接
filePath = "file:///" + os.path.abspath("new_file.html")
print(filePath)
# 打开网页
driver.get(filePath)
# 1. 操作普通弹窗
driver.find_element_by_xpath('/html/body/button[2]').click()
time.sleep(1)
# 2. 切换到 alert 弹窗
alter_obj = driver.switch_to.alert
# 3. 获取弹窗文本信息
print(alter_obj.text)
# 4. 点击弹窗确认 / 取消 按钮
time.sleep(2)
# alter_obj.accept();
alter_obj.dismiss();
alter_obj.accept();
promote 弹窗
import os
import time
from selenium import webdriver
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 由于是直接打开 html 页面,需要路径拼接
filePath = "file:///" + os.path.abspath("new_file.html")
print(filePath)
# 打开网页
driver.get(filePath)
# 1. 操作普通弹窗
driver.find_element_by_xpath('/html/body/button[3]').click()
time.sleep(1)
# 2. 切换到 prompt 弹窗
prompt_obj = driver.switch_to.alert
# 3. 输入内容
time.sleep(3)
prompt_obj.send_keys("Joker")
# 4. 点击确认按钮
prompt_obj.accept()
prompt_obj.accept()
12. 下拉选择框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下拉选择框</title>
</head>
<body>
<select name="myselect">
<!--·vQ(ue属性的值在下拉选择框的选项中一般是唯一的·-->
<option value="o0">-------</option>
<option value="o1">谷歌搜索</option>
<option value="o2">百度搜索</option>
<option value="o3">搜狗搜索</option>
<option value="o4">bing搜索</option>
<option value="o5">360搜索</option>
</select>
</body>
</html>
解决方式:
import os
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 由于是直接打开 html 页面,需要路径拼接
filePath = "file:///" + os.path.abspath("new_file.html")
print(filePath)
# 打开网页
driver.get(filePath)
# 1. 先进行类的实力话,传入下拉选择框的对象
select_obj = Select(driver.find_element_by_xpath('/html/body/select'))
# 方式一:索引(从 0 开始)
# select_obj.select_by_index(3)
# 方式二:value 属性值
# select_obj.select_by_value('o4')
# 方式三: 通过文本选择
select_obj.select_by_visible_text('搜狗搜索')
13. 文件上传
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet"/>
<body>
<div class="row-fluid">
<div class="span6 well">
<h3>upload_file</h3>
<input type="file" name="file"/>
</div>
</div>
</body>
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script>
</html>
import os
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 由于是直接打开 html 页面,需要路径拼接
filePath = "file:///" + os.path.abspath("new_file.html")
print(filePath)
# 打开网页
driver.get(filePath)
# 1. 选择文件上传的 input 标签
driver.find_element_by_xpath('/html/body/div/div/input').send_keys("E:\\桌面\\3123.txt")
14. 关闭浏览器
- close():关闭页面
- quit():关闭浏览器
import os
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
# 打开一个浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 由于是直接打开 html 页面,需要路径拼接
driver.get("http://www.baidu.com")
time.sleep(2)
driver.find_element_by_xpath('//*[@id="s-top-left"]/a[2]').click()
time.sleep(2)
# driver.close() # 如果浏览器有多个标签页面,则会关闭第一个标签页面(只有一个页面时候才会关闭浏览器)
driver.quit() # 关闭所有