Selenium使用
Selenium的使用
一.介绍
Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些JavaScript动态渲染的页面来说,此种抓取方式非常有效.
本次学习使用Chrome,并配置ChromeDrive,Python安装Selenium库.
二.基本安装
下载V114版本的谷歌浏览器,已放在目录下,
下面是禁用谷歌自动更新的教程:谷歌浏览器禁用自动更新的方法_谷歌浏览器如何禁止自动更新_好装机 (haozhuangji.com)
下载谷歌对应的的Driver版本;https://registry.npmmirror.com/binary.html?path=chromedriver/114.0.5735.90/
三.使用
基本使用
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('Python')
input.send_keys(Keys.ENTER)
wait = WebDriverWait(browser, 10)
wait.until(EC.presence_of_element_located((By.ID, 'content_left')))
print(browser.current_url)
print(browser.get_cookies())
print(browser.page_source)finally:
browser.close()
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
try:
driver.get('https://www.taobao.com/')
input = driver.find_element(By.ID,'q')
input.send_keys('Python')
sleep(1)
input.clear()
input.send_keys('iphone')
input.send_keys(Keys.ENTER)
wait = WebDriverWait(driver,10)
sleep(5)
finally:
driver.close()
(一)元素定位
使用Selenium首先需要定位到网页页面当中的标签所在位置,才能对页面进行操作。
查找方式 | 返回值类型 |
---|---|
find_eletment |
返回一个标签元素值,返回值为网页的dom对象。 |
find_eletments |
返回一个列表,列表当中的值由复合查找条件筛选出来的元素标签元素值。 |
对于Selenium来说,主要有8种定位方式:ID定位、name定位、class定位、tag定位、xpath定位、css定位、link定位、partial_link 定位。
定位方式 | 描述 | 代码执行方式 |
---|---|---|
ID定位 |
通过网页标签当中的唯一标识提取定位网页元素。 | browser.find_element(By.ID,'标签ID') |
name定位 | 通过标签name寻找网页元素,在页面当中可能不唯一,找到多个(用find_element返回找到的第一个,用find_elements返回一个元素标签的列表)。 | browser.find_element(By.NAME, '标签名字') browser.find_elements(By.NAME,'标签名字') |
class定位 |
通过标签的class寻找网页元素,在页面中可能存在多个相同class值的元素。 | browser.find_element(By.CLASS_NAME,'标签class值) ``browser.find_elements(By.CLASS_NAME,'标签class值') |
tag定位 |
通过标签的TAG标签,来寻找网页当中复合查找条件的标签。 | browser.find_element(By.TAG_NAME, '标签') browser.find_elements(By.TAG_NAME, '标签') |
xpath定位 |
通过Xpath表达式来查找页面当中的元素。 | browser.find_element(By.XPATH, 'XPATH表达式') |
css定位 |
使用选择器来为页面元素绑定属性,它可以较为灵活的选择控件的任意属性,一般定位速度比Xpath要快,但使用起来略有难度。 | browser.find_element(By.CSS_SELECTOR, 'CSS表达式') |
link定位 |
link专门用来定位文本链接 | browser.find_element_by_link_text("加入!每日一练") |
partial_link定位 |
定位文本当中的部分,然后定位文本所在的标签(link的子集) | browser.find_element_by_partial_link_text("加入") |
CSS选择器常用语法:
方法 | 例子 | 描述 |
---|---|---|
.class |
.toolbar-search-container |
选择 class = 'toolbar-search-container' 的所有元素 |
#id |
#toolbar-search-input |
选择 id = 'toolbar-search-input' 的元素 |
* |
* |
选择所有元素 |
element |
input |
选择所有 <input\> 元素 |
element>element |
div>input |
选择父元素为 <div\> 的所有 <input\> 元素 |
element+element |
div+input |
选择同一级中在 <div\> 之后的所有 <input\> 元素 |
[attribute=value] |
type='text' |
选择 type = 'text' 的所有元素 |
(二)浏览器控制
1.修改浏览器窗口大小
通过webdriver
的set_window_size()
方法修改浏览器窗口的大小。
browser.set_window_size(宽,高)
通过方法设置浏览器页面为maximsize_window()全屏显示
browser.maximize_window()
2.浏览器的窗口切换
在使用浏览器时,若有页面切换的需要先对页面进行缓存(踩过的坑)
通过页面的标题切换。
获取浏览器的标题
borwser.title
获取浏览器页面的句柄(返回的为每一个页面组成的一个列表)
browser.window_handles
根据网页的标题组成一个字典,后续切换网页页面可以根据字典取值
webTags = {}
for item in browser.window_handles:
browser.switch_to.window(item)
webTags[browser.title] = browser.current_window_handle
通过网页的标题切换网页
browser.switch_to.window(webTags['首页'])
3.浏览器常见操作
在调用常用方法时,首先需要找到网页的元素,在元素上调用方法。
方法 | 描述 |
---|---|
send_keys() |
模拟输入指定内容 |
click() |
模拟点击元素 |
is_displayed() |
判断元素是否可见 |
get_attribute() |
获取标签当中的属性值 |
size |
返回元素的尺寸 |
text |
返回元素文本 |
4.浏览器中控制鼠标
在webdriver
中,鼠标操作都封装在ActionChains
类中。
方法 | 描述 |
---|---|
click() |
单击左键 |
context_click() |
单击右键 |
double_click() |
双击 |
drag_and_drop() |
拖动 |
move_to_element() |
鼠标悬停 |
perform() |
执行所有ActionChains中存储的动作 |
5.单击右键
鼠标右击的操作与左击有很大不同,需要使用 ActionChains
。
# 定位搜索按钮
button = driver.find_element(By.XPATH, 'XXX')
# 右键搜索按钮
ActionChains(driver).context_click(button).perform()
6.双击
# 定位搜索按钮
button = driver.find_element(By.XPATH, XXX)
# 执行双击动作
ActionChains(driver).double_click(button).perform()
7.拖拽
模拟拖拽需要两个参数,一个为需要拖动的元素,另一个为拖拽至的目标元素
source:鼠标拖动的元素
target`:鼠标拖至并释放的目标元素
# 定位要拖动的元素
source = driver.find_element(By.XPATH, 'xxx')
# 定位目标元素
target = driver.find_element(By.XPATH, 'xxx')
# 执行拖动动作
ActionChains(driver).drag_and_drop(source, target).perform()
8.鼠标悬停
# 定位收藏栏
collect = driver.find_element(By.XPATH, 'XXX')
# 悬停至收藏标签处
ActionChains(driver).move_to_element(collect).perform()
9.键盘控制
通过send_keys
+ keys
实线输出键盘上的组合键。如“Ctrl+A”、“Ctrl+V”、“Ctrl+C”等。
from selenium.webdriver.common.keys import Keys
# 模拟回车键进行跳转(输入内容后)
driver.find_element(By.XPATH, 'xxx').send_keys(Keys.ENTER)
# 使用 Backspace 来删除一个字符
driver.find_element(By.XPATH, 'xxx').send_keys(Keys.BACK_SPACE)
# Ctrl + A 全选输入框中内容
driver.find_element(By.XPATH, 'xxx').send_keys(Keys.CONTROL, 'a')
# Ctrl + C 复制输入框中内容
driver.find_element(By.XPATH, 'xxx').send_keys(Keys.CONTROL, 'c')
# Ctrl + V 粘贴输入框中内容
driver.find_element(By.XPATH, 'xxx').send_keys(Keys.CONTROL, 'v')
其他常见键盘操作:
操作 | 描述 |
---|---|
Keys.F1 |
F1键 |
Keys.SPACE |
空格 |
Keys.TAB |
TAB键 |
Keys.ESCAPE |
ESC键 |
操作 | 描述 |
---|---|
Keys.ALT |
ALT键 |
Keys.SHIFT |
Shift键 |
Keys.ARROW_DOWN |
向下按键 |
Keys.ARROW_LEFT |
向左按键 |
Keys.ARROW_RIGHT |
向右按键 |
Keys.ARROW_UP |
向上按键 |
(三)元素等待
因为某些网页当中需要等待某个元素加载出来,才能够找到后续页面当中的元素。为这种情况Selenium
当中可以通过方法来等待网页加载。在WebDriver
当中的等待方式分为显示等待和隐式等待。
1.显示等待
显示等待:设置一个最长的等待时间,设置检测周期,每个周期去检测一次网页当中的元素是否已加载出现或消失。超出了最大等待时间,则会抛出异常(TimeoutException
)。显示等待需要使用WebDriverWait
配合其对象当中的until
和until_not
使用。
WebDriverWait(browser, timeout, poll_frequency=0.5, ignored_exceptions=None)
参数解释:
browser:浏览器驱动
timeout:超出时间/最大等待时间,单位为秒
poll_frequency:检测的间隔周期,默认为0.5秒
ignored_exceptions:指定忽略的异常,如果在调用 until 或 until_not 的过程中抛出指定忽略的异常,则不中断代码,默认忽略的只有 NoSuchElementException 。
在until
和until_not
当中 有两个参数:
until(method, message=’ ‘)
until_not(method, message=’ ')
参数解释:
method:指定预期条件的判断方法,在等待期间,每隔一段时间调用该方法,判断元素是否存在或不存在,直到元素出现。
message:如果超时,抛出 TimeoutException ,并显示 message 中的内容。
method当中的预期判断条件是有expected_conditions 提供的,例如:
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 通过xpath定位到某一个元素,等待这个元素在10秒之内是否加载出来,加载出来则继续向下执行代码,未出现则抛出超时的异常
WebDriverWait(browser, 10, 1).until(EC.presence_of_element_located((By.XPATH, 'XXX')))
expected_conditions
当中有一些常用的判断方法:
方法 | 描述 |
---|---|
title_is(‘百度一下’) |
判断当前页面的 title 是否等于预期 |
title_contains(‘百度’) |
判断当前页面的 title 是否包含预期字符串 |
presence_of_element_located(locator) |
判断元素是否被加到了 dom 树里,并不代表该元素一定可见 |
visibility_of_element_located(locator) |
判断元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0 |
visibility_of(element) |
跟上一个方法作用相同,但传入参数为 element |
text_to_be_present_in_element(locator , ‘百度’) |
判断元素中的 text 是否包含了预期的字符串 |
text_to_be_present_in_element_value(locator , ‘某值’) |
判断元素中的 value 属性是否包含了预期的字符串 |
frame_to_be_available_and_switch_to_it(locator) |
判断该 frame 是否可以 switch 进去,True 则 switch 进去,反之 False |
invisibility_of_element_located(locator) |
判断元素中是否不存在于 dom 树或不可见 |
element_to_be_clickable(locator) |
判断元素中是否可见并且是可点击的 |
staleness_of(element) |
等待元素从 dom 树中移除 |
element_to_be_selected(element) |
判断元素是否被选中,一般用在下拉列表 |
element_selection_state_to_be(element, True) |
判断元素的选中状态是否符合预期,参数 element,第二个参数为 True/False |
element_located_selection_state_to_be(locator, True) |
跟上一个方法作用相同,但传入参数为 locator |
alert_is_present() |
判断页面上是否存在 alert |
demo:
1 # coding = utf-8
2 from selenium import webdriver
3 from selenium.webdriver.support.wait import WebDriverWait
4 from selenium.webdriver.support import expected_conditions as EC
5 from selenium.webdriver.common.by import By
6
7 driver = webdriver.Chrome()
8 driver.implicitly_wait(10)
9 driver.get('http://www.cnblogs.com/imyalost/')
10 locator = (By.LINK_TEXT, '老_张')
11
12 try:
13 WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
14 print(driver.find_element_by_link_text('老_张').get_attribute('href'))
15 finally:
16 driver.close()
2.隐式等待
隐式等待也是指定一个最长的等待时间,如果超过了这个等待时间,元素还没有加载出来,就会抛出NoSuchElementException 异常。
特点:隐式等到是全局性的,在运行过程中,如果元素可以定位到,它不会影响代码运行,但如果定位不到元素,则会以轮询的方式不断地访问元素直到元素被找到,若超出最长的等待时间,就会抛出异常。
如:
browser.implicitly_wait(5)
browser.find_element(By.XPATH, 'XXX')
在设置好了隐式等待时间后,在下一条查找元素的代码当中就会触发,若在5S内未查询到元素,则会抛出异常。
demo:
1 # coding = utf-8
2 from selenium import webdriver
3
4 driver = webdriver.Chrome()
5 driver.implicitly_wait(10) # 隐性等待,最长等10秒
6 driver.get('http://www.cnblogs.com/imyalost/')
7
8 print(driver.current_url)
9 driver.quit()
(四)表单切换
在有些网页当中,会有frame/iframe的表单嵌套,对于这种嵌套的表单,Selenium不能直接定位到,需要先切换到表单当中,需要使用到switch_to.frame()。
switch_to.frame()方法默认可以使用id或者name属性直接定位到,但如果iframe没有id和name属性,需要使用到XPATH定位到表单,再切换到表单当中。
如:
<html lang="en">
<head>
<title>FrameTest</title>
</head>
<body>
<iframe src="a.html" id="frame1" name="myframe"></iframe>
</body>
</html>
from selenium import webdriver
driver = webdriver.Firefox()
driver.switch_to.frame(0) # 1.用frame的index来定位,第一个是0
# driver.switch_to.frame("frame1") # 2.用id来定位
# driver.switch_to.frame("myframe") # 3.用name来定位
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # 4.用WebElement对象来定位
1.从frame中切回主文档(switch_to.default_content())
切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。
driver.switch_to.default_content()
(五)选项卡管理
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com/") # 打开百度首页
browser.execute_script("window.open()") # 添加一个选项卡
browser.switch_to.window(browser.window_handles[1]) # 切换到第二个选项卡
browser.get("https://www.taobao.com/") # 打开淘宝首页
browser.switch_to.window(browser.window_handles[0]) # 切换到第一个选项卡
browser.get("https://python.org") # 打开Python官网
(六)Cookie操作
webdriver
可以读取、添加和删除cookie信息。
操作 | 说明 |
---|---|
get_cookies() | 获得所有cookie 信息(重点) |
add_cookie(cookie_dict) | 添加cookie,必须有name 和value 值(重点) |
get_cookie(name值) | 返回指定name名称的cookie 信息 |
delete_cookie(name) | 删除特定(部分)的cookie 信息 |
delete_all_cookies() | 删除所有cookie 信 |
demo:
"""
1.学习目标:
掌握selenium对cookie操作
2.语法
2.1获取所有cookie
driver.get.cookies()
返同列表格式字典类型 [{},{},{}]
2.2添加cookie
driver.add_cookie(参数)
参数:字典格式{"name":"name值","value":"value值"}
3.需求
实现selenium对cookie操作
"""
# 1.导入selenium
from selenium import webdriver
from time import sleep
# 2.打开浏览器
driver = webdriver.Chrome()
# 3.打开注册A页面
# 不打开一个页面,cookie为[]。
url = "http://www.baidu.com/"
driver.get(url)
# 4.操作cookie
# 4.1 获取cookie
cookies = driver.get_cookies()
for cookie in cookies:
# 值打印cookie中的name和value
print("%s -> %s" % (cookie['name'], cookie['value']))
print("=======================")
# 4.2 获取一个cookie的指定属性值
# 参数是一个cookie中name的属性值
# 没有找到返回None
print(driver.get_cookie("BAIDUID"))
print("=======================")
# 4.3 添加cookie
cookie = {"name": "key-aaaaaaa", "value": "value-aaaaaaa"}
driver.add_cookie(cookie)
# 添加后再次获取
cookies = driver.get_cookies()
for cookie in cookies:
print("%s -> %s" % (cookie['name'], cookie['value']))
print("=======================")
# 4.4 删除指定cookie
# 根据name删除
driver.delete_cookie("key-aaaaaaa")
# 删除后再次获取
cookies = driver.get_cookies()
for cookie in cookies:
print("%s -> %s" % (cookie['name'], cookie['value']))
print("=======================")
# 4.5 删除全部cookie
driver.delete_all_cookies()
print(driver.get_cookies())
# 5.关闭浏览器
sleep(2)
driver.quit()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~