当前位置:
首页 > Python基础教程 >
-
Selenium常用操作
安装
pip install selenium
元素选取
单个元素查找方法
-
注: 其中的element加上一个s,则是对应的多个元素的查找方法
-
通过xpath查找
- find_element_by_xpath()
-
通过id查找
- find_element_by_id()
-
通过class属性查找
- find_element_by_class_name()
-
通过css选择器查找 ( 语法规则 )
- find_element_by_css_selector()
-
通过链接文本查找
- find_element_by_link_text()
-
通过链接文本的部分匹配查找
- find_element_by_partial_ink_text()
-
通过name属性进行查找
- find_element_by_name()
-
通过标签名查找
-
find_element_by_tag_name()
-
find_element_by_tag_name()
两种方法集成了上面所有的查找方法
find_element(By.ID, '...')
- 通过ID查找一个
find_elements(By.XPATH, '...')
- 通过Xpath查找多个
By.xxx 选择使用的查找方法,使用xxx方式解析
-
By对象导入: from selenium.webdriver.common.by import By
输入、清除、点击 示例回到目录
-
输入内容
- send_keys('内容')
-
清除内容
- clear()
-
点击
-
click()
-
click()
关闭窗口、浏览器 示例回到目录
-
关闭当前句柄窗口(不关闭进程)
- close()
-
关闭整个浏览器进程
-
quit()
-
quit()
窗口切换 示例回到目录
用selenium操作的是第一个打开的窗口,新打开的窗口是无法直接去操作的
需要切换窗口的句柄
-
获取所有窗口的句柄
-
window_handles
- window_handles的顺序并不是浏览器上窗口的顺序
-
window_handles
-
获取当前窗口的句柄
- current_window_handle
-
切换句柄到指定的窗口
-
switch_to.window( window_handles[1] )
-
switch_to.window( window_handles[1] )
页面(frame)切换 示例回到目录
iframe标签 通常出现在登录页面
-
切到指定frame,可用id、name、元素定位
- switch_to.frame()
-
切到父级frame,如果已是主文档,则无效果,相当于后退回去
- driver.switch_to.parent_frame()
-
切换到主页面,DOM树最开始的frame
-
driver.switch_to_default_content()
-
driver.switch_to_default_content()
页面弹窗 示例回到目录
-
定位到alert弹窗,返回一个弹窗的对象
- switch_to.alert
-
对弹窗对象的取消操作(相当于点击弹窗上的取消按钮)
- dismiss()
-
对弹窗对象的确定操作(相当于点击弹窗上的确定按钮)
- accept()
-
对弹窗对象内的输入框输入数据(针对于prompt弹窗)
- send_keys(key)
-
获取弹窗内的文本
-
text
-
text
等待加载 示例回到目录
导入WebDriverWait
- from selenium.webdriver.support.wait import WebDriverWait
导入expected_conditions
- from selenium.webdriver.support import expected_conditions as EC
显式等待
- 指定某个条件,然后设置最长等待时间,每隔一定时间检查一次(默认0.5秒)
- 如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出超时异常:TimeoutException
-
WebDriverWait(driver, timeout, poll_frequency,igonred_exceptions).until(method, message)
- driver:WebDriver的实例
- timeout: 等待的最长时间
- poll_frequency:调用until中的方法的间隔时间,默认0.5秒
- igonred_exceptions:忽略的异常,如果在调用until的过程中抛出这个元组中的异常,则不中断代码,继续等待
等待条件:expected_conditions
-
这两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw'),一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
- presence_of_element_located (这个用的次数最多)
- presence_of_all_elements_located
-
这两个条件类验证title,验证传入的参数title是否等于或包含于driver
- title_is
- title_contains
-
这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
- visibility_of_element_located
- invisibility_of_element_located
- visibility_of
-
判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
- text_to_be_present_in_element
- text_to_be_present_in_element_value
-
判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
- frame_to_be_available_and_switch_to_it
-
判断是否有alert出现
- alert_is_present
-
判断元素是否可点击,传入locator
- element_to_be_clickable
隐式等待
- 设置一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步
- 隐性等待对整个driver的周期都起作用,所以只要设置一次即可,默认等待时间为0
- driver.implicitly_wait(10) #隐式等待,最长10s
-
弊端
- 程序会一直等待整个页面加载完成,就算你需要的元素加载出来了还是需要等待
- 也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步
隐性等待和显性等待可以同时用,等待的最长时间取两者之中的最大者
动作链 示例回到目录
导入ActionChains:from selenium.webdriver.common.action_chains import ActionChains
-
执行链中的所有动作
- perform()
-
点击鼠标左键,按住不放
- click_and_hold(on_element=None)
-
在某个元素位置松开鼠标左键
- release(on_element=None)
-
将鼠标移动到当前鼠标位置的偏移位置
- move_by_offset(xoffset, yoffset)
-
将鼠标移动到距某个元素多少距离的位置
- move_to_element_with_offset(to_element, xoffset, yoffset)
-
拖拽到某个元素然后松开
- drag_and_drop(source, target)
-
拖拽到某个坐标然后松开
- drag_and_drop_by_offset(source, xoffset, yoffset)
-
鼠标移动到某个元素
- move_to_element(to_element)
-
双击鼠标左键
- double_click(on_element=None)
-
单击鼠标右键
- context_click(on_element=None)
-
鼠标左键单击传入的元素
- click(on_element=None)
键盘事件 示例回到目录
Keys对象导入:from selenium.webdriver.common.keys import Keys
-
删除键(BackSpace)
- send_keys(Keys.BACKSPACE)
-
空格键(Space)
- send_keys(Keys.SPACE)
-
制表键(Tab)
- send_keys(Keys.TAB)
-
回退键(Esc)
- send_keys(Keys.ESCAPE)
-
回车键(Enter)
- send_keys(Keys.ENTER)
-
全选(Ctrl+A)
- send_keys(Keys.CONTROL,'a')
-
复制(Ctrl+C)
- send_keys(Keys.CONTROL,'c')
-
剪切(Ctrl+X)
- send_keys(Keys.CONTROL,'x')
-
粘贴(Ctrl+V)
- send_keys(Keys.CONTROL,'v')
-
键盘 F1
- send_keys(Keys.F1)
-
键盘 F12
-
send_keys(Keys.F12)
-
send_keys(Keys.F12)
执行js 示例回到目录
-
execute_script( js语句 )
截图 示例回到目录
-
截图保存
- get_screenshot_as_file('***.png')
-
将截图作为二进制数据返回
-
get_screenshot_as_png()
-
get_screenshot_as_png()
获取元素属性 示例回到目录
-
获取元素标签上的属性
- get_attribute('href')
-
元素的坐标
- location
-
元素的大小
-
size
-
size
获取网页源代码、刷新页面 示例回到目录
-
网页源代码
- page_source
-
刷新页面
-
refresh()
-
refresh()
设置窗口大小 示例回到目录
-
最小化
- minimize_window()
-
最大化
- maximize_window()
-
设置窗口具体的大小
- set_window_size(width,height)
-
设置窗口位置
-
set_window_position(x,y)
-
set_window_position(x,y)
设置代理、UA 示例回到目录
-
设置代理
-
webdriver.ChromeOptions().add_argument(
'--proxy-server=http://IP:Port'
)
-
webdriver.ChromeOptions().add_argument(
-
设置UA
- webdriver.ChromeOptions().add_argument('User-Agent=ua')
-
"="两边不能有空格
Cookie操作 示例回到目录
-
获取Cookie
- get_cookies()
-
添加Cookie
- add_cookie()
- 添加cookie前需要先打开任意一个网页
- 否则会报错:InvalidCookieDomainException: Message: invalid cookie domain
-
删除Cookie
- delete_all_cookies()
-
Cookie键名
- name:cookie的名称
- value:cookie对应的值
- domain:服务器域名
- expiry:cookie有效终止日期
- path:path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的cookie
- httpOnly:防脚本攻击
-
secure:规定cookie只能在https协议下才能够发送到服务器
跳过Selenium检测 示例回到目录
window.navigator.webdriver
- 普通浏览器,js 中,window.navigator.webdriver 为 undefined
- Selenium ,js 中,window.navigator.webdriver 为 True
-
使用
-
webdriver.ChromeOptions().add_experimental_option('excludeSwitches', ['enable-automation'])
-
webdriver.ChromeOptions().add_experimental_option('excludeSwitches', ['enable-automation'])
示例
执行js(滑动滚动条)、窗口切换、关闭窗口、关闭浏览器回到目录
import time
from selenium import webdriver
driver = webdriver.Chrome()
try:
driver.get("http://news.baidu.com/")
print('执行js打开新窗口前')
print('所有窗口的句柄:', driver.window_handles)
print('当前窗口的句柄:', driver.current_window_handle)
# 执行js打开新窗口
new_js = 'window.open("https://www.toutiao.com/")'
driver.execute_script(new_js)
print('执行js打开新窗口后')
all_handle = driver.window_handles
print('所有窗口的句柄:', all_handle)
print('当前窗口的句柄:', driver.current_window_handle)
print('切换句柄...')
driver.switch_to.window(all_handle[1])
print('当前窗口的句柄:', driver.current_window_handle)
# 页面高度
height = 0
# 执行js滑动滚动条
while height < 10000:
# 滑动滚动条到指定位置
driver.execute_script('document.documentElement.scrollTop=10000')
# 页面高度
height = driver.execute_script('return document.body.scrollHeight')
time.sleep(2)
# 关闭新打开的窗口
driver.close()
finally:
time.sleep(3)
# 关闭浏览器
driver.quit()
登录QQ空间:frame切换、输入内容、清除内容、点击、键盘事件回到目录
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
try:
driver.get("https://qzone.qq.com/")
time.sleep(0.5)
"""通过元素定位,切到指定frame(登录框)
frame = driver.find_element(By.XPATH,'//iframe')
driver.switch_to.frame(frame)
"""
# 也可通过 ID 或 name 定位 frame
driver.switch_to.frame('login_frame')
# 点击 帐号密码登录
driver.find_element(By.LINK_TEXT, '帐号密码登录').click()
time.sleep(0.5)
text_box = driver.find_element(By.ID, 'u')
# 输入内容
text_box.send_keys('0123456789')
time.sleep(1)
# 清除内容
text_box.clear()
time.sleep(1)
text_box.send_keys('正确的账号')
password_box = driver.find_element(By.CSS_SELECTOR, '.inputstyle.password')
password_box.send_keys('正确的密码')
time.sleep(1.5)
# 执行键盘操作:回车键
password_box.send_keys(Keys.ENTER)
time.sleep(7)
finally:
time.sleep(3)
# 关闭浏览器
driver.quit()
页面弹窗、截图、获取元素属性回到目录
import time
from selenium import webdriver
driver = webdriver.Chrome()
try:
driver.get("https://www.baidu.com/")
time.sleep(0.3)
driver.find_element_by_link_text('设置').click()
time.sleep(0.3)
driver.find_element_by_link_text('搜索设置').click()
time.sleep(0.3)
driver.find_element_by_link_text('保存设置').click()
time.sleep(1)
# 获取弹窗的对象
alert_box = driver.switch_to.alert
# 获取弹窗的内容
print('弹窗内容:',alert_box.text)
# 对弹窗对象的确定操作
alert_box.accept()
# 按钮:百度一下
button = driver.find_element_by_css_selector('[type="submit"]')
# 获取元素标签上的属性
print('get_attribute:', button.get_attribute('value'))
# 元素的坐标
print('location:', button.location)
# 元素的大小
print('size:', button.size)
# 截图
driver.get_screenshot_as_file('1.png')
finally:
time.sleep(3)
# 关闭浏览器
driver.quit()
设置窗口大小、获取网页源代码、刷新页面回到目录
import time
from selenium import webdriver
driver = webdriver.Chrome()
try:
driver.get("https://www.toutiao.com/")
time.sleep(1)
# 最小化
driver.minimize_window()
time.sleep(1)
# 设置窗口具体的大小
driver.set_window_size(500,500)
time.sleep(1)
# 设置窗口位置
driver.set_window_position(800,200)
time.sleep(1)
# 最大化
driver.maximize_window()
time.sleep(1)
# 打印网页源码(JS渲染过的)
print(driver.page_source)
# 刷新当前页面
driver.refresh()
finally:
time.sleep(3)
# 关闭浏览器
driver.quit()
Cookie操作回到目录
import time
import json
from selenium import webdriver
driver = webdriver.Chrome()
try:
driver.get('https://www.cnblogs.com/')
"""获取Cookie
# 等待60秒用于手动登录
time.sleep(60)
# 保存获取到的Cookie
cookies = driver.get_cookies()
with open('1.txt', 'w+') as f:
f.write(json.dumps(cookies))
"""
"""添加Cookie
with open('1.txt') as f:
cookies = json.loads(f.read())
# 添加cookie前需要先打开任意一个网页
# 然后再进行添加
# 否则会报错:InvalidCookieDomainException: Message: invalid cookie domain
for cookie in cookies:
driver.add_cookie(cookie)
# 添加完毕后,再打开对应网页,便是已登录状态
driver.get('https://www.cnblogs.com/')
time.sleep(5)
"""
"""清空cookie
driver.delete_all_cookies()
# 清空cookie后是未登录的状态
driver.get('https://www.cnblogs.com/')
"""
finally:
time.sleep(3)
driver.quit()
设置代理、UA回到目录
import time
from selenium import webdriver
opt = webdriver.ChromeOptions()
# 设置代理
opt.add_argument('--proxy-server=http://121.40.162.239:808')
# 设置UA
opt.add_argument('User-Agent=ABCDEFG')
driver = webdriver.Chrome(options=opt)
try:
driver.get('http://httpbin.org/get')
finally:
time.sleep(3)
driver.quit()
等待加载回到目录
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
try:
driver.get('https://www.python.org/getit/')
# 显式等待的等待条件 --> 参数为数组类型
method = EC.presence_of_element_located((By.LINK_TEXT, 'Downloads'))
# 显式等待
WebDriverWait(driver, 20, 0.2).until(method)
# 隐式等待
# driver.implicitly_wait(20)
driver.find_element(By.LINK_TEXT, 'Downloads').click()
finally:
time.sleep(10)
driver.quit()
动作链回到目录
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
try:
driver.get('http://www.treejs.cn/v3/demo/cn/exedit/drag.html')
time.sleep(2)
# 定位元素
element = driver.find_element_by_id('treeDemo_2_span')
target = driver.find_element_by_id('treeDemo_12_span')
# 动作链:拖拽
ActionChains(driver).drag_and_drop(element,target).perform()
finally:
time.sleep(10)
driver.quit()
跳过Selenium检测回到目录
import time
from selenium import webdriver
opt = webdriver.ChromeOptions()
opt.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=opt)
try:
driver.get('http://www.baidu.com')
finally:
time.sleep(10)
driver.quit()
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式