-
python3教程之Selenium常用操作
本站最新发布 Python从入门到精通|Python基础教程
试听地址 https://www.xin3721.com/eschool/python.html
试听地址 https://www.xin3721.com/eschool/python.html
安装
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()
栏目列表
最新更新
python数据库连接池技术总结
python数据库连接池技术总结
成人网站性能提升 20 倍之经验谈 [Python
python动态捕获异常
python 探测网站目录的GUI程序
python实现中文字符繁体和简体中文转换
Python服务器开发 -- 网络基础
python高性能编程方法一
使用python管理Cisco设备
python抓取google搜索结果
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
图解TCP数据报结构以及三次握手(非常详
TCP协议的粘包问题(数据的无边界性)
Excel数据导入到Sql server
SQL Server like 字段
SQL Server中的LEFT、RIGHT函数
sql server 安装出现需要sqlncli.msi文件,错误
SQL Server学习内容(一)
SQLServer执行大脚本文件时,提示“无法执
数据库敏捷版本控制之3个数据库策略
将select 转为json
SQL Server 创建索引(index)
GROUP BY中的WITH CUBE、WITH ROLLUP原理测试及