当前位置: 首页 > news >正文

【Python爬虫基础篇】--4.Selenium入门详细教程

先解释:Selenium:n.硒;硒元素

目录

1.Selenium--简介

2.Selenium--原理

3.Selenium--环境搭建

4.Selenium--简单案例

5.Selenium--定位方式

6.Selenium--常用方法

6.1.控制操作

6.2.鼠标操作

6.3.键盘操作

6.4.获取断言信息

6.5.多表单切换

6.6.多窗口切换

6.7.警告处理

6.8.下拉框

6.9.文件上传

6.10.cookie操作

6.11.窗口截图


1.Selenium--简介

        Selenium 是一种开源工具,用于在 Web 浏览器上执行自动化测试(使用任何 Web 浏览器进行 Web 应用程序测试)。提供一套测试函数,用于支持Web自动化测试。函数非常灵活,能够完成界面元素定位、窗口跳转、结果比较。重申一下,Selenium 仅可以测试Web应用程序。我们既不能使用 Selenium 测试任何桌面(软件)应用程序,也不能测试任何移动应用程序。

具有如下特点:

  • 多浏览器支持
    • 如IE、Firefox、Safari、Chrome、Android手机浏览器等。
  • 支持多语言
    • 如Java、C#、Python、Ruby、PHP等。
  • 支持多操作系统
    • 如Windows、Linux、IOS、Android等。
  • 开源免费
    • 官网:Selenium:Selenium

2.Selenium--原理

将 WebDriver 驱动浏览器类比成开出租车的场景。

在开出租车时有三个角色

  • 乘客:他/她告诉出租车司机去哪里,大概怎么走。

  • 出租车司机:他按照乘客的要求来操控出租车。

  • 出租车:出租车按照司机的操控完成真正的行驶,把乘客送到目的地。

在WebDriver中也有类似的三个角色:

  • 工程师写的自动化测试代码:自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动)
  • 浏览器的驱动:它来解析这些自动化测试的代码,解析后把它们发送给浏览器
  • 浏览器:执行浏览器驱动发来的指令,并最终完成工程师想要的操作。

3.Selenium--环境搭建

以谷歌浏览器为例子:

先确定谷歌浏览器版本,打开浏览器,点击帮助、关于Google Chrome

 

下载谷歌浏览器对应版本驱动 

旧版本下载地址:http://chromedriver.storage.googleapis.com/index.html

或CNPM Binaries Mirror

新版本下载地址: Chrome for Testing availability

 下载解压后设置浏览器驱动 

设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。
我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“C:\driver”目录添加到Path的值中。

我的实验使用的是edge浏览器,下载地址:Microsoft Edge WebDriver | Microsoft Edge Developer

验证一下: 

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
import pandas as pd
import time# 设置Edge浏览器选项
edge_options = Options()
edge_options.add_argument("--headless")  # 无头模式,不显示浏览器窗口
edge_options.add_argument("--disable-gpu")
edge_options.add_argument("--window-size=1920,1080")# 指定Edge驱动路径(需要先下载对应版本的Edge驱动)
# 下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
edge_service = Service('D:\桌面文件\edgedriver_win64\msedgedriver.exe')  # 替换为你的Edge驱动路径# 启动Edge浏览器
driver = webdriver.Edge(service=edge_service, options=edge_options)
url = "https://www.example.com"
driver.get(url)
# 获取网页标题
print(driver.title)

4.Selenium--简单案例

使用edge浏览器打开百度,搜索‘西南石油大学’,返回结果

首先需要找到:

1.百度搜索框的标签组件

2.‘搜索’按键

搜索框的xpath: //*[@id="kw"]

搜索按钮的://*[@id="su"]

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 配置浏览器选项
edge_options = Options()
edge_options.add_argument("--headless")
edge_options.add_argument("--disable-gpu")
edge_options.add_argument("--window-size=1920,1080")
edge_options.add_argument("user-agent=Mozilla/5.0  (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36")# 启动浏览器
edge_service = Service(r"D:\桌面文件\edgedriver_win64\msedgedriver.exe")
driver = webdriver.Edge(service=edge_service, options=edge_options)try:# 访问百度并搜索driver.get('https://www.baidu.com')driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys('西南石油大学')driver.find_element(By.XPATH, '//*[@id="su"]').click()# 显式等待搜索结果加载WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "content_left")))# 保存源码到文件with open("search_result.html", "w", encoding="utf-8") as f:f.write(driver.page_source)print("源码已保存至 search_result.html")finally:driver.quit()

打开页面:

5.Selenium--定位方式

通过driver.find_element方法定位之后找到的元素对象就是 WebElement 类型。

方法/属性说明典型应用场景示例代码
clear()清除输入框、文本域中的内容清空搜索框、表单输入栏element.clear()
send_keys(value)向输入框或可编辑元素模拟键盘输入(支持字符串或组合键)填写用户名、密码、搜索词element.send_keys("test")
click()模拟鼠标单击操作点击按钮、链接、复选框element.click()
submit()提交表单(适用于表单元素或通过回车键提交的场景)搜索框无按钮时替代回车提交element.submit()
size返回元素的尺寸字典 {'width': 宽, 'height': 高}(单位:像素)验证UI布局或元素大小print(element.size['width'])
text获取元素的可见文本(包括子元素的文本)提取页面显示的标题、提示信息print(element.text)
get_attribute(name)获取元素的属性值(如 hrefclassvalue 等)获取链接地址、CSS类名、隐藏字段值element.get_attribute("href")
定位方式描述示例
id通过元素的唯一ID属性定位driver.find_element(By.ID, "username")
name通过元素的name属性定位driver.find_element(By.NAME, "password")
class name通过元素的class属性定位(多个元素可能共享相同class)driver.find_element(By.CLASS_NAME, "btn-submit")
tag name通过HTML标签名定位(如<div><a>,通常需结合其他条件)driver.find_element(By.TAG_NAME, "input")
link text通过超链接的完整文本内容定位(仅适用于<a>标签)driver.find_element(By.LINK_TEXT, "点击登录")
partial link text通过超链接的部分文本内容定位(模糊匹配)driver.find_element(By.PARTIAL_LINK_TEXT, "登录")
xpath通过XML路径表达式定位,支持复杂层级和属性组合driver.find_element(By.XPATH, "//input[@type='text']")
css selector通过CSS选择器定位,语法简洁且性能优于XPathdriver.find_element(By.CSS_SELECTOR, "#login .submit-btn")

假如我们有一个Web页面,通过前端工具(如,Firebug)查看到一个元素的属性是这样的。

<html><head><body link="#0000cc"><a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})"><form id="form" class="fm" name="f" action="/s"><span class="soutu-btn"></span><input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
<a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
定位方式代码示例适用场景
ID定位driver.find_element(By.ID, "kw")通过唯一ID定位,速度快且稳定(适用于静态或动态但ID唯一的元素)。
Name定位driver.find_element(By.NAME, "wd")通过name属性定位,常用于表单输入框、按钮等。
Class Name定位driver.find_element(By.CLASS_NAME, "s_ipt")通过class属性定位,需注意class可能重复(建议结合其他属性)。
Tag Name定位driver.find_element(By.TAG_NAME, "input")通过标签名定位(如<input>),通常需结合层级或属性过滤。
XPath定位driver.find_element(By.XPATH, "//input[@id='kw']")灵活性强,支持复杂路径、属性组合和逻辑表达式(如and/or)。
CSS Selector定位driver.find_element(By.CSS_SELECTOR, "#kw")语法简洁,性能优于XPath,支持层级、伪类等(如input.s_ipt)。
Link Text定位driver.find_element(By.LINK_TEXT, "新闻")精确匹配超链接的完整文本(如<a>新闻</a>)。
Partial Link Textdriver.find_element(By.PARTIAL_LINK_TEXT, "新")模糊匹配链接文本(如“新闻”可匹配“新”或“闻”)。
  • 通过xpath定位,xpath定位有N种写法,这里列几个常用写法:
dr.find_element_by_xpath("//*[@id='kw']")
dr.find_element_by_xpath("//*[@name='wd']")
dr.find_element_by_xpath("//input[@class='s_ipt']")
dr.find_element_by_xpath("/html/body/form/span/input")
dr.find_element_by_xpath("//span[@class='soutu-btn']/input")
dr.find_element_by_xpath("//form[@id='form']/span/input")
dr.find_element_by_xpath("//input[@id='kw' and @name='wd']")
  • 通过css定位,css定位有N种写法,这里列几个常用写法:
dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector("[name=wd]")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("html > body > form > span > input")
dr.find_element_by_css_selector("span.soutu-btn> input#kw")
dr.find_element_by_css_selector("form#form > span > input")

6.Selenium--常用方法

6.1.控制操作

方法说明典型应用场景
set_window_size(width, height)设置浏览器窗口尺寸(像素单位)测试响应式布局时模拟不同设备分辨率(如set_window_size(1280, 720))。
back()模拟浏览器后退按钮操作测试页面导航逻辑(如从详情页返回列表页)。
forward()模拟浏览器前进按钮操作验证用户通过前进/后退功能是否能恢复历史状态。
refresh()刷新当前页面测试数据重新加载或表单重置逻辑。
clear()清除输入框的文本内容表单测试中先清空旧值再输入新值(如搜索框)。
send_keys(value)向输入框模拟键盘输入(支持字符串或组合键)输入用户名、密码或快捷键操作(如Keys.ENTER提交)。
click()单击页面元素(按钮、链接等)触发交互事件(如提交按钮、下拉菜单)。
submit()提交表单(适用于<form>标签内的元素)替代click()直接提交表单数据(需元素在form内)。
get_attribute(name)获取元素属性值(如hrefvalue验证动态生成的属性(如超链接地址或数据绑定值)。
is_displayed()检查元素是否可见(返回布尔值)验证弹窗、广告是否正常展示或隐藏。
size返回元素的尺寸(widthheight,单位像素)测试UI布局是否符合设计规范(如按钮大小)。
text获取元素的可见文本内容(不包括隐藏文本)验证页面提示信息或动态加载的文本内容。
from selenium import webdriverfrom time import sleep
#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
browser = webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")#2.通过浏览器向服务器发送URL请求
browser.get("https://www.baidu.com/")sleep(3)#3.刷新浏览器
browser.refresh()#4.设置浏览器的大小
browser.set_window_size(1400,800)#5.设置链接内容
element=browser.find_element_by_link_text("新闻")
element.click()element=browser.find_element_by_link_text("“下团组”时间")
element.click()

6.2.鼠标操作

方法说明代码示例(Selenium 4+)
ActionChains(driver)创建鼠标操作链对象actions = ActionChains(driver)
move_to_element(element)鼠标悬停到指定元素actions.move_to_element(driver.find_element(By.ID, "menu"))
context_click(element)在元素上模拟鼠标右键操作(需指定元素)actions.context_click(driver.find_element(By.LINK_TEXT, "新闻"))
double_click(element)双击指定元素actions.double_click(driver.find_element(By.CLASS_NAME, "btn"))
drag_and_drop(source, target)将源元素拖动到目标元素actions.drag_and_drop(driver.find_element(By.ID, "item"), driver.find_element(By.ID, "trash"))
perform()执行所有存储的鼠标操作(必须调用才会生效)actions.perform()

 现在我们需要把百度--设置--搜索设置,将搜索历史记录从显示改成不显示:

 这个代码,再’搜索设置‘这里有问题

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
import pandas as pd
import time# 设置Edge浏览器选项
edge_options = Options()
edge_options.add_argument("--headless")  # 无头模式,不显示浏览器窗口
edge_options.add_argument("--disable-gpu")
edge_options.add_argument("--window-size=1920,1080")# 指定Edge驱动路径(需要先下载对应版本的Edge驱动)
# 下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
edge_service = Service('D:\桌面文件\edgedriver_win64\msedgedriver.exe')  # 替换为你的Edge驱动路径# 启动Edge浏览器
driver = webdriver.Edge(service=edge_service, options=edge_options)
url = "https://www.baidu.com"
driver.get(url)
# 获取网页标题
print(driver.title)# <a class="setpref first" href="javascript:;"><span class="set">搜索设置</span></a>,
# 如何通过elem1= driver.find_element(By.LINK_TEXT)找到搜索设置这个按键,然后elem1.click()点击#2.定位到要悬停的元素
element= driver.find_element(By.XPATH, '//*[@id="s-usersetting-top"]')
print("定位到要悬停的元素")
#3.对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(element).perform()
print("对定位到的元素执行鼠标悬停操作")
#4.等待悬停操作完成
time.sleep(2)#找到链接,搜索设置并点击
#找到链接
elem1=driver.find_element_by_link_text("搜索设置")print("找到链接")
elem1.click()
print("点击链接")#通过元素选择器找到id=sh_2,并点击设置
elem2=driver.find_element(By.ID,"sh_2")
elem2.click()#保存设置
elem3=driver.find_element(By.CLASS_NAME,"prefpanelgo")
elem3.click()

6.3.键盘操作

Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_keys()方法。它不仅可以模拟键盘输入,也可以模拟键盘的操作。

单键操作

模拟键盘按键说明补充信息
send_keys(Keys.BACK_SPACE)删除键(BackSpace)常用于删除输入框中的前一个字符
send_keys(Keys.SPACE)空格键(Space)输入空格或触发按钮焦点
send_keys(Keys.TAB)制表键(Tab)切换焦点到下一个元素
send_keys(Keys.ESCAPE)回退键(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)从剪贴板粘贴内容到当前位置
send_keys(Keys.F1) 到 Keys.F12功能键(F1-F12)触发浏览器或应用的快捷键功能

6.4.获取断言信息

        不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。通过我们获取title 、URL和text等信息进行断言。

属性说明
title用于获得当前页面的标题
current_url用户获得当前页面的URL
text获取搜索条目的文本信息
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
import pandas as pd
import time# 设置Edge浏览器选项
edge_options = Options()
edge_options.add_argument("--headless")  # 无头模式,不显示浏览器窗口
edge_options.add_argument("--disable-gpu")
edge_options.add_argument("--window-size=1920,1080")# 指定Edge驱动路径(需要先下载对应版本的Edge驱动)
# 下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
edge_service = Service('D:\桌面文件\edgedriver_win64\msedgedriver.exe')  # 替换为你的Edge驱动路径# 启动Edge浏览器
driver = webdriver.Edge(service=edge_service, options=edge_options)
url = "https://www.baidu.com"
driver.get(url)
# 获取网页标题
print(driver.title)print("断言测试")
# 断言测试
driver.find_element_by_id("kw").send_keys("西南石油大学")
driver.find_element_by_id("su").click()
print(driver.current_url)
print(driver.find_element_by_class_name('nums').text)
Before search================
百度一下,你就知道
https://www.baidu.com/
After search================
selenium_百度搜索
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=selenium&rsv_pq=a1d51b980000e36e&rsv_t=a715IZaMpLd1w92I4LNUi7gKuOdlAz5McsHe%2FSLQeBZD44OUIPnjY%2B7pODM&rqlang=cn&rsv_enter=0&rsv_sug3=8&inputT=758&rsv_sug4=759
搜索工具
百度为您找到相关结果约7,170,000个

6.5.多表单切换

        在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。

方法说明
switch_to.frame()将当前定位的主体切换为frame/iframe表单的内嵌页面中
switch_to.default_content()跳回最外层的页面

163邮箱登录框的结构大概是这样子的,想要操作登录框必须要先切换到iframe表单。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
import pandas as pd
import time# 设置Edge浏览器选项
edge_options = Options()
edge_options.add_argument("--headless")  # 无头模式,不显示浏览器窗口
edge_options.add_argument("--disable-gpu")
edge_options.add_argument("--window-size=1920,1080")# 指定Edge驱动路径(需要先下载对应版本的Edge驱动)
# 下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
edge_service = Service('D:\桌面文件\edgedriver_win64\msedgedriver.exe')  # 替换为你的Edge驱动路径# 启动Edge浏览器
driver = webdriver.Edge(service=edge_service, options=edge_options)driver.get("https://mail.163.com/")driver.switch_to.frame(driver.find_element(By.CSS_SELECTOR,"iframe[id^='x-URS-iframe']"))
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("***")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("***")
driver.find_element_by_id("dologin").click()
print("登录中...")
#检测是否登陆成功
driver.switch_to.default_content()# # 等待登录成功
# wait = WebDriverWait(driver, 10, 0.5)
# wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="spnUid"]')))
driver.switch_to.default_content()
print(driver.title)
print(driver.current_url)
x=driver.page_source
print(driver.page_source)
#
# print("登录成功!")
# time.sleep(5)# # <span id="spnUid" title="共有0封未读邮件">134****4965@163.com</span>
# uid = driver.find_element_by_xpath('//*[@id="spnUid"]').get_attribute("title")
# print(uid)driver.quit()

6.6.多窗口切换

在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。

方法说明
current_window_handle获取当前焦点所在窗口的句柄(唯一标识符),返回字符串类型值。
window_handles返回当前会话中所有已打开窗口的句柄列表(按打开时间排序),常用于多窗口遍历场景。
switch_to.window()通过窗口句柄参数切换到目标窗口,需配合window_handles使用。与switch_to.frame() 的区别在于前者处理窗口级切换,后者处理页面内框架/表单切换。
from selenium import webdriver
import time
driver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")#1.获得百度搜索窗口句柄
sreach_windows = driver.current_window_handledriver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text("立即注册").click()#1.获得当前所有打开的窗口的句柄
all_handles = driver.window_handles#3.进入注册窗口
for handle in all_handles:if handle != sreach_windows:driver.switch_to.window(handle)print('跳转到注册窗口')driver.find_element_by_name("account").send_keys('123456789')driver.find_element_by_name('password').send_keys('123456789')time.sleep(2)driver.quit()

6.7.警告处理

在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作。

方法说明
text返回 alert/confirm/prompt 中的文字信息
accept()接受现有警告框(相当于点击确认按钮)
dismiss()解散现有警告框(相当于点击取消按钮)
send_keys(keysToSend)发送文本至警告框(仅适用于 prompt 类型的输入框)
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import timedriver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')# 鼠标悬停至“设置”链接
link = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(link).perform()# 打开搜索设置
driver.find_element_by_link_text("搜索设置").click()#在此处设置等待2s否则可能报错
time.sleep(2)
# 保存设置
driver.find_element_by_class_name("prefpanelgo").click()
time.sleep(2)# 接受警告框
driver.switch_to.alert.accept()driver.quit()

6.8.下拉框

导入选择下拉框Select类,使用该类处理下拉框操作。

from selenium.webdriver.support.select import Select

Select类的方法

方法说明
select_by_value(“选择值”)select标签的value属性的值
select_by_index(“索引值”)下拉框的索引
select_by_visible_testx(“文本值”)下拉框的文本值
from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleepdriver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')#1.鼠标悬停至“设置”链接
driver.find_element_by_link_text('设置').click()
sleep(1)
#2.打开搜索设置
driver.find_element_by_link_text("搜索设置").click()
sleep(2)#3.搜索结果显示条数
sel = driver.find_element_by_xpath("//select[@id='nr']")
Select(sel).select_by_value('50')  # 显示50条sleep(3)
driver.quit()

6.9.文件上传

对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过send_keys()指定本地文件路径的方式实现文件上传。

通过send_keys()方法来实现文件上传:


from selenium import webdriver
import osdriver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('upfile.html')
driver.get(file_path)# 定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')driver.quit()

6.10.cookie操作

方法说明使用场景示例
get_cookies()获取当前页面所有 Cookie 信息检查页面 Cookie 配置
get_cookie(name)获取指定名称的 Cookie验证登录状态 Token
add_cookie(cookie_dict)添加 Cookie 到当前会话模拟已登录状态
delete_cookie(name)删除指定 Cookie清理测试环境
delete_all_cookies()删除当前会话所有 Cookie隐私测试初始化

from selenium import webdriver
import time
browser = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
browser.get("http://www.youdao.com")#1.打印cookie信息
print('=====================================')
print("打印cookie信息为:")
print(browser.get_cookies)#2.添加cookie信息
dict={'name':"name",'value':'Kaina'}
browser.add_cookie(dict)print('=====================================')
print('添加cookie信息为:')
#3.遍历打印cookie信息
for cookie in browser.get_cookies():print('%s----%s\n' %(cookie['name'],cookie['value']))#4.删除一个cookie
browser.delete_cookie('name')
print('=====================================')
print('删除一个cookie')
for cookie in browser.get_cookies():print('%s----%s\n' %(cookie['name'],cookie['value']))print('=====================================')
print('删除所有cookie后:')
#5.删除所有cookie,无需传递参数
browser.delete_all_cookies()
for cookie in browser.get_cookies():print('%s----%s\n' %(cookie['name'],cookie['value']))time.sleep(3)
browser.close()

6.11.窗口截图

方法语法适用场景注意事项
页面截图driver.save_screenshot(filename)全页面截图路径需包含扩展名(如 .png
元素截图element.screenshot(filename)特定元素截图需确保元素可见
Base64编码截图driver.get_screenshot_as_base64()需要直接嵌入报告或前端无需保存文件
二进制截图driver.get_screenshot_as_png()配合其他库处理图像
方法说明
close()关闭单个窗口
quit()关闭所有窗口

相关文章:

【Python爬虫基础篇】--4.Selenium入门详细教程

先解释&#xff1a;Selenium&#xff1a;n.硒&#xff1b;硒元素 目录 1.Selenium--简介 2.Selenium--原理 3.Selenium--环境搭建 4.Selenium--简单案例 5.Selenium--定位方式 6.Selenium--常用方法 6.1.控制操作 6.2.鼠标操作 6.3.键盘操作 6.4.获取断言信息 6.5.…...

基于Vulkan Specialization Constants的材质变体系统

材质变体 所谓材质变体&#xff0c;指的是一份材质代码文件&#xff0c;最终对应的是多份运行时gpu程序。比如&#xff0c;shader代码里面有开关或者选项&#xff0c;不同的组合对应不同的最终gpu program。那么&#xff0c;所有的这些组合对应的gpu program&#xff0c;可以统…...

Langchain+RAG+向量数据库

加载数据 import osimport lancedb from langchain_community.document_loaders import TextLoader from langchain_community.embeddings import BaichuanTextEmbeddings from langchain_community.vectorstores import LanceDB from langchain_core.output_parsers import St…...

Stack和Queue和deque的讲解(底层实现 手撕版)

一.底层的基本思路 我们cpp中实现的栈和队列不同于我们数据结构c语言实现的栈和队列&#xff0c;c语言中实现的栈和队列都是通过一个数组指针的形式来完成&#xff0c;每个函数都需要写大量的代码&#xff0c;但是我们的cpp&#xff0c;就是通过函数模板 适配器来完成的。 我们…...

《Pinia 从入门到精通》Vue 3 官方状态管理 -- 插件扩展篇

使用插件扩展功能 可以同时使用多个插件&#xff08;插件“中间件式”机制&#xff09;一、使用多个插件的方式二、插件机制简图三、插件互不冲突的关键点四、实战示例&#xff1a;多插件组合使用五、组合使用注意事项推荐插件组合搭配方案&#xff08;实战模板&#xff09; 根…...

JavaScript 中的 Reflect 对象:深入理解与应用

JavaScript 中的 Reflect 对象&#xff1a;深入理解与应用 一、引言 在 JavaScript 不断发展的过程中&#xff0c;ES6 引入了许多新的特性和对象&#xff0c;其中 Reflect 对象是一个强大且实用的工具。Reflect 对象提供了一系列静态方法&#xff0c;这些方法与 Proxy 对象的…...

dirsearch 使用教程:详细指南与配置解析

dirsearch 是一款强大的开源命令行工具&#xff0c;用于对 Web 服务器进行目录和文件暴力破解。它通过扫描目标网站&#xff0c;尝试发现隐藏的目录、文件或潜在的敏感资源&#xff0c;广泛应用于渗透测试和安全审计。dirsearch 提供丰富的选项和灵活的配置文件支持&#xff0c…...

【C++基础知识】C++类型特征组合:`disjunction_v` 和 `conjunction_v` 深度解析

这两个模板是C17引入的类型特征组合工具&#xff0c;用于构建更复杂的类型判断逻辑。下面我将从技术实现到实际应用进行全面剖析&#xff1a; 一、基本概念与C引入版本 1. std::disjunction_v (逻辑OR) 引入版本&#xff1a;C17功能&#xff1a;对多个类型特征进行逻辑或运算…...

ctfhow——web入门214~218(时间盲注开始)

web入门214 #another:uwvwko import requestsurlhttp://b0c11589-31c9-4bf9-8b66-6b5a1fc08726.challenge.ctf.show/api/index.php flag str{-_1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM}for i in range(1,50):for j in str:# 查数据库# payload "…...

shell练习(2)

1.给脚本service.sh进行修改,当执行的时候要求输入(1、2、3、4、5)时安装对应的httpd、vim、wget、更换aliyum等功能&#xff0c;当输入错误 时提示应该输入正确的值但是不会退出。 [rootbogon yy]# cat service.sh #!/bin/bash while : do cat <<-EOF --------------…...

【GO语言小案例手记】基于GIN的简易代理网关

基于GIN的简易代理网关 背景目标开工依赖主体代码配置文件 后记 背景 正好最近对GO也有点兴趣&#xff0c;搞个小项目练练手。 目标 网关需要能够根据路由自动映射到服务支持轮询、加权轮询、随机轮询三种算法简单好理解好使用&#xff0c;最好一个配置文件就能跑起来网关本…...

Qt 入门 6 之布局管理

Qt 入门 6 之布局管理 对于一个完整的软件&#xff0c;布局管理时必不可少的。其会让界面中嗯嗯部件呈现一个整齐的排列&#xff0c;也可令其大小随着窗口界面的大小变换而变化Qt 主要提供了QLayout 类及其子类作为布局管理器&#xff0c;他们可以实现常用的布局管理功能&…...

Java技术体系的主要产品线详解

Java技术体系的主要产品线详解 Java Card&#xff1a;支持Java小程序&#xff08;Applets&#xff09;运行在小内存设备&#xff08;如智能卡&#xff09;上的平台。 Java ME&#xff08;Micro Edition&#xff09;&#xff1a;支持Java程序运行在移动终端&#xff08;手机、P…...

第四章: 服务集成抽象

Chapter 4: 服务集成抽象 &#x1f31f; 从上一章到本章 在第三章&#xff1a;传输机制中&#xff0c;我们学习了如何通过STDIO和SSE协议让LLM与不同服务器通信。现在想象这样的场景&#xff1a;你的AI助手需要同时操作本地文件和云端数据库。这时问题来了——如何让LLM像操作…...

高精度并行2D圆弧拟合(C++)

依赖库 Eigen3 GLM Ceres-2.1.0 glog-0.6.0 gflag-2.2.2 基本思路 Step 1&#xff1a; RANSAC找到圆弧&#xff0c;保留inliers点&#xff1b; Step 2&#xff1a;使用ceres非线性优化的方法&#xff0c;拟合inliers点&#xff0c;得到圆心和半径&#xff1b; -------…...

【防火墙 pfsense】1简介

&#xff08;1&#xff09; pfSense 有以下可能的用途&#xff1a; 边界防火墙 路由器 交换机 无线路由器 / 无线接入点 从OSI7层模型了解设备在典型网络结构中所处的位置。 &#xff08;2&#xff09;边界防火墙 ->要充当边界防火墙&#xff0c;pfSense 系统至少需要两个接…...

GPT-4o最新图像生成完全指南:10大应用场景与提示词模板

引言 OpenAI于近期推出的全新GPT-4o图像生成功能&#xff0c;代表了AI图像创作领域的重大突破。作为一个原生多模态系统&#xff0c;GPT-4o将文本理解和图像生成无缝整合&#xff0c;为创作者、教育工作者和专业人士提供了前所未有的视觉创作灵活性。本文将分享10个GPT-4o图像…...

32单片机——外部中断

STM32F103ZET6的系统中断有10个&#xff0c;外部中断有60个 1、中断的概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#xff0c;很大程度上提高了单片机处理外部或内部事件的能力 eg&#xff1a;&#xff1a;你打开火&…...

《Pinia 从入门到精通》Vue 3 官方状态管理 -- 进阶使用篇

《Pinia 从入门到精通》Vue 3 官方状态管理 – 基础入门篇 《Pinia 从入门到精通》Vue 3 官方状态管理 – 进阶使用篇 《Pinia 从入门到精通》Vue 3 官方状态管理 – 插件扩展篇 目录 Store 的模块化设计4.1 多模块结构设计✅ 推荐目录结构&#xff08;中大型项目&#xff09; …...

HarmonyOs @hadss/hmrouter路由接入

参考文档&#xff1a;官方文档 在根目录oh-package.json5配置 {"dependencies": {"hadss/hmrouter": "^1.0.0-rc.11"} }加入路由编译插件 hvigor/hvigor-config.json文件 {"dependencies": {"hadss/hmrouter-plugin": &…...

第九节:性能优化高频题-首屏加载优化策略

路由懒加载&#xff1a;component: () > import(‘…’) CDN加速第三方库、Tree-Shaking移除未使用代码 前端首屏加载优化核心策略解析 一、路由懒加载&#xff1a;按需拆分代码块 实现原理 通过动态导入语法 import() 将路由组件拆分为独立代码块&#xff0c;仅在用户访问…...

ESP32_IDF_VScode安装多版本共存

ESP32_IDF_VScode安装多版本共存 一、安装离线版本idf 详情见文章&#xff1a;ESP32_IDF_基于win11的开发环境搭建 二、windows的VScode安装乐鑫插件 三、导入已经安装好的idf&#xff08;将VScode插件和本地安装的IDF绑定的一个关系&#xff09; 1、选择“配置ESP-IDF扩展”…...

JavaScript 的“积木”:函数入门与实践

引言&#xff1a;告别重复&#xff0c;拥抱模块化 想象一下&#xff0c;你在写代码时发现&#xff0c;有几段逻辑几乎一模一样&#xff0c;需要在不同的地方反复使用。你是选择每次都复制粘贴&#xff0c;还是希望能像搭积木一样&#xff0c;把这段逻辑封装起来&#xff0c;需…...

代码注释标记的含义

在代码中&#xff0c;TODO 是一种常用的注释标记&#xff0c;用于标识需要后续处理或完善的任务。它是开发者之间的常见约定&#xff0c;帮助团队协作和任务管理。以下是详细解释&#xff1a; 1. TODO 的核心含义 待办事项&#xff1a;标记代码中需要完成但尚未实现的功能、需…...

深度学习:迁移学习

迁移学习 标题1.什么是迁移学习 迁移学习(Transfer Learning)是一种机器学习方法&#xff0c;就是把为任务 A 开发 的模型作为初始点&#xff0c;重新使用在为任务 B 开发模型的过程中。迁移学习是通过 从已学习的相关任务中转移知识来改进学习的新任务&#xff0c;虽然大多数…...

Nest集成健康检查

文章目录 前言✅ NestJS 健康检查集成思路&#xff08;标准实践&#xff09;&#x1f4e6; 推荐使用官方包&#xff1a; &#x1f9f1; 结构设计✅ 1. 创建健康模块✅ 2. 集成 nestjs/terminushealth.module.tshealth.controller.ts ✅ 3. 在 AppModule 注册模块 &#x1f50d;…...

第十五届蓝桥杯 2024 C/C++组 拼正方形

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解&#xff1a; 易错点&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P10898 [蓝桥杯 2024 省 C] 拼正…...

前端出现的一些新技术或者升级的技术汇总

以下是截至2024年第三季度前端领域的最新技术动态与论坛热议焦点&#xff0c;涵盖框架、工具链、性能优化等方向&#xff0c;结合社区讨论和实际案例展开分析&#xff1a; 一、框架演进与争议热点 1. React 19「Actions」引发范式转变 核心变化&#xff1a; 服务端Actions&…...

SQL数据类型

数字类型 1. 整型&#xff08;Integer&#xff09; 整型数据类型用于存储整数值&#xff0c;不包含小数部分。通常用于表示没有小数部分的数字&#xff0c;如年龄、数量、ID 等。 常见的整型数据类型&#xff1a; INT&#xff1a;用于存储常规整数值&#xff0c;通常占用 4 字…...

手机访问电脑端Nginx服务器配置方式

修改当前站点Nginx的配置如下。其中端口号必须是一个比较独特的端口号&#xff0c;比如8001。这样可以跟别的项目区分开来。域名使用0.0.0.0。 server {listen 80;listen 8001;server_name zfmap.cc 0.0.0.0;假设你电脑端的ip地址是192.168.1.101,那么你的手机与你的电脑连在同…...

PyQt6基础_QTabWidget

目录 代码 运行 官方文档 PySide6.QtWidgets.QTabWidget - Qt for Python 代码 class TempWidget(QWidget):def __init__(self):super().__init__()self.tabs QTabWidget()self.tabs.tabBarClicked.connect(self.tabs_tabBarClicked)widget_tab1 QWidget()widget_tab2…...

海思ISP调试记录

1、proc_param 功能&#xff1a;在海思中&#xff0c;proc_param参数用来控制每个多少帧更新一次ISP&#xff0c;默认是30帧。 过短的更新间隔会导致图像参数不稳定&#xff0c;产生闪烁或色彩跳跃4过长的间隔会使3A调整滞后&#xff0c;影响动态场景适应性1海思建议在1080p3…...

以运营为核心的智能劳动力管理系统,破解连锁零售、制造业排班难题

在连锁零售、制造业、物流等劳动力密集型行业中&#xff0c;排班与考勤管理不仅是人力资源管理的核心环节&#xff0c;更是直接影响企业运营效率、成本控制与合规风险的关键场景。尤其在当前经济环境下&#xff0c;企业面临用工成本攀升、政策合规趋严、业务波动频繁等多重挑战…...

缓存穿透、雪崩、击穿深度解析与解决方案

缓存穿透、雪崩、击穿深度解析与解决方案 一、缓存三大核心问题全景解析 1. 问题定位与影响分析 问题类型触发条件典型现象核心风险缓存穿透大量请求访问不存在的键Redis 命中率骤降&#xff08;<10%&#xff09;数据库压力激增&#xff0c;可能宕机缓存雪崩大量缓存键同…...

【AI】基于OllamaSharp与.NET Core API的高效LLM查询实现

本文旨在演示如何通过OllamaSharp NuGet包在.NET Core API中高效查询Ollama大语言模型,重点展示如何通过JSON配置文件动态设置模型参数和服务器地址,实现灵活维护的AI服务架构。 创建.NET Core API项目dotnet new webapi -n OllamaLLMAPI cd OllamaLLMAPI添加OllamaSharp NuG…...

kotlin和MVVM的结合使用总结(二)

MVVM 架构详解 核心组件&#xff1a;ViewModel 和 LiveData 在 Android 中&#xff0c;MVVM 架构主要借助 ViewModel 和 LiveData 来实现。ViewModel 负责处理业务逻辑&#xff0c;而 LiveData 则用于实现数据的响应式更新。 ViewModel 的源码分析 ViewModel 的核心逻辑在 …...

U盘能识别但无法写入数据的原因

1. U 盘物理损坏 原因&#xff1a;U 盘内部存储芯片、电路板或接口接触不良&#xff0c;可能因摔落、高温、频繁插拔等导致。表现&#xff1a;插入电脑能识别盘符&#xff0c;但读写时提示 “磁盘错误”“无法访问” 或操作无反应。解决方法&#xff1a; 尝试用其他设备&#…...

多模态大模型 Qwen2.5-VL 的学习之旅

Qwen-VL 是阿里云研发的大规模视觉语言模型&#xff08;Large Vision Language Model, LVLM&#xff09;。Qwen-VL 可以以图像、文本、检测框作为输入&#xff0c;并以文本和检测框作为输出。Qwen-VL 系列模型性能强大&#xff0c;具备多语言对话、多图交错对话等能力&#xff…...

linux sudo 命令介绍

sudo&#xff08;superuser do&#xff09;是一个用于 Linux 系统的命令&#xff0c;它允许授权用户以其他用户&#xff08;通常是 root 超级用户&#xff09;的安全权限执行命令。 有了 sudo&#xff0c;用户在执行特定的、需要更高权限的操作时&#xff0c;就不需要切换到 r…...

STM32F103系列单片机寄存器操作和标准库操作

关于stm32&#xff0c;标准库很早就学完了&#xff0c;但如果想要更加深入学习计算机硬件&#xff0c;那么学会寄存器操作是非常有必要的。今天从最简单的点灯开始&#xff0c;我们来对比一下二者的不同。 一、寄存器操作和标准库操作中点亮LED的区别 寄存器操作&#xff1a;…...

如何解决PyQt从主窗口打开新窗口时出现闪退的问题

在PyQt5中&#xff0c;当从主窗口打开新窗口时&#xff0c;经常会出现闪退现象&#xff0c;这通常是由于对象生命周期管理不当或事件循环错误等所导致。 1. 确保新窗口实例被正确引用 新窗口的实例若未被主窗口引用&#xff0c;可能会被Python的垃圾回收机制销毁。 错误示例&…...

2025五一杯数学建模竞赛思路助攻预定

2025五一杯数学建模竞赛思路助攻预定&#xff08;思路内容见文末名片&#xff09; 一、概况 数学建模竞赛是一项模拟面对实际问题寻求解决方案的活动&#xff0c;是一次近似 于“真刀真枪”的创新探索性实践训练。在丰富并活跃学生课外生活活动的同 时&#xff0c;数学建模竞…...

Java集合框架解析

一、集合框架概述 1. 集合框架体系结构 Java集合框架&#xff08;Java Collections Framework, JCF&#xff09;位于java.util包中&#xff0c;包含三大核心接口&#xff1a; Collection&#xff1a;单列数据集合的根接口 List&#xff1a;有序可重复集合Set&#xff1a;无序…...

《100天精通Python——基础篇 2025 第1天:从编程语言到计算机基础,开启你的学习之旅》

目录 一、计算机组成原理之概述篇二、编程语言是什么三、编译型语言和解释型语言的区别3.1 编译型语言3.2 解释型语言 四、Python是什么五、Python有哪些优点和缺点&#xff1f;5.1 Python的优点5.2 Python 的缺点 六、学Python能干什么&#xff0c;Python的应用领域有哪些&…...

JavaFX 第三篇 HostServices和Platform

1、HostServices类 介绍这个类主要是使用里面的一个方法 返回类型方法说明voidshowDocument(java.lang.String uri)使用默认浏览器打开一个url地址 /*** description: 程序打开3秒后&#xff0c;打开百度* author: HK* since: 2025/4/24 16:40*/ public class Demo1 extends…...

【Java 8新特性】Stream API 和 Lambda 表达式

一、前言 Java 8 的 Stream API 和 Lambda 表达式 为集合处理带来了函数式编程风格&#xff0c;显著简化了代码并提高了可读性。 二、Lambda 表达式 1.作用 简化匿名内部类的语法&#xff0c;允许将函数作为参数传递。实现函数式接口&#xff08;只有一个抽象方法的接口&…...

Vue 3 相比 Vue 2 的优势

1. 性能优化 更快的渲染&#xff1a; 基于 Proxy 的响应式系统&#xff0c;比 Vue 2 的 Object.defineProperty 更高效&#xff0c;初始化速度和内存占用优化显著。编译时优化&#xff08;如静态树提升、补丁标志等&#xff09;&#xff0c;减少运行时开销。 更小的体积&#…...

深度解析 TransmittableThreadLocal(TTL):原理、实战与优化指南

深度解析 TransmittableThreadLocal(TTL):原理、实战与优化指南 在现代 Java 应用中,ThreadLocal 被广泛用于线程隔离上下文,比如用户会话、链路追踪等。但随着线程池的普及,ThreadLocal 也暴露出严重局限性,尤其是在异步场景中上下文无法正确传递的问题。 本文从 Thr…...

入门 Go 语言

本专栏的 Go 语言学习参考了B站UP 软件工艺师的视频 本节需要&#xff1a; Go 语言环境VSCode 安装环境 下载 Go 环境&#xff0c;并安装下载 VSCode&#xff0c;安装。在 VSCode 中安装 Go 扩展&#xff1a; 接下来就可以编写 Go 语言了 第一条 Go Go 语言是一种编译型…...

膳食营养诊断活动:科技赋能,共筑全民健康新基石

膳食营养诊断活动&#xff1a;科技赋能&#xff0c;共筑全民健康新基石 一、活动背景&#xff1a;响应营养周号召&#xff0c;开启健康新征程 &#xff08;一&#xff09;2025营养周主题解读 2025年全民营养周的核心主题“吃动平衡&#xff0c;健康体重&#xff0c;全民行动…...