(6)python爬虫--selenium

文章目录

  • 前言
    • 一、初识selenium
    • 二、安装selenium
      • 2.1 查看chrome版本并禁止chrome自动更新
        • 2.1.1 查看chrome版本
        • 2.1.2 禁止chrome更新自动更新
      • 2.2 安装对应版本的驱动程序
      • 2.3安装selenium包
    • 三、selenium关于浏览器的使用
      • 3.1 创建浏览器、设置、打开
      • 3.2 打开/关闭网页及浏览器
      • 3.3 浏览器的最大/小化
      • 3.4 浏览器打开位置、尺寸
      • 3.5 浏览器截图、网页刷新
    • 四、selenium关于元素的使用
      • 4.1 元素定位
      • 4.2 元素交互操作
      • 4.3 元素八种定位方式
        • 4.3.1 元素定位-ID
        • 4.3.2 元素定位-NAME
        • 4.3.3 元素定位-CLASS_NAME
        • 4.3.4 元素定位-TAG_NAME
        • 4.3.5 元素定位-LINK_TEXT
        • 4.3.6 元素定位-PARTIAL_LINK_TEXT
        • 4.3.7 元素定位-CSS_SELECTOR
        • 4.3.8 元素定位-XPATH
      • 4.4 元素定位的隐式等待
    • 案例一: 获取表单元素并修改
    • 案例二:重复填写表单
    • 五、三种浏览器获取框(警告框、确认框、提示框)
      • 5.1 警告框
      • 5.2 确认框
      • 5.3 提示框
    • 六、 iframe嵌套网页内部元素获取
    • 七、获取元素以及判断可见性
    • 八、 网页前进、后退
  • 总结


前言

在当今快速发展的互联网时代,自动化测试和网络爬虫技术已经成为开发者和测试工程师不可或缺的技能。Python 作为一门简洁、高效的编程语言,凭借其丰富的生态库和易用性,成为了自动化测试和爬虫开发的首选工具之一。而 Selenium,作为一款强大的浏览器自动化工具,不仅能够模拟用户操作,还能处理动态加载的网页内容,为开发者提供了极大的便利。

无论是进行 Web 应用的自动化测试,还是从复杂的网站中抓取数据,Selenium 都能胜任。它支持多种浏览器(如 Chrome、Firefox、Edge 等),并提供了灵活的 API,使得开发者可以轻松实现页面元素的定位、交互和验证。此外,结合 Python 的简洁语法,Selenium 让自动化任务的编写变得更加高效和直观。

本文将带你深入探索 Python 与 Selenium 的结合使用,从基础的环境搭建到高级的实战技巧,帮助你快速掌握这一强大工具。无论你是刚入门的新手,还是希望进一步提升技能的开发者,相信本文都能为你提供有价值的参考和启发。


一、初识selenium

  1. 自动化测试:快速完成重复性网页测试,提高效率
  2. 处理动态内容:完美支持JavaScript渲染的现代网页
  3. 跨浏览器支持:Chrome/Firefox/Edge等主流浏览器都兼容
  4. Python绝配:配合Requests/BeautifulSoup等库更强大
  5. 数据采集:解决普通爬虫无法处理的交互式网站
  6. 就业优势:Web自动化的必备技能,提升职场竞争力

简而言之:Selenium让网页自动化变得简单高效!


二、安装selenium

注意: 这里所有的举例都采用chrome浏览器。对于其他浏览器大致步骤一致。

2.1 查看chrome版本并禁止chrome自动更新

2.1.1 查看chrome版本

步骤: 设置 ➡ ➡ 关于chrome ➡ ➡ 查看版本

在这里插入图片描述

2.1.2 禁止chrome更新自动更新

chrome自动更新会导致chrome驱动出现失效问题,因而需要禁止自动更新。

详细步骤:

Win+ R 打开输入services.msc
在这里插入图片描述
找到所有关于Google更新的相关程序,双击打开改为禁用即可

在这里插入图片描述
重新打开chrome 出现该效果即表示成功

在这里插入图片描述

2.2 安装对应版本的驱动程序

网址:
https://storage.googleapis.com/chrome-for-testing-public/你的版本号/win64/chromedriver-win64.zip

安装好对应的zip包之后,将其解压,复制一份chromedriver.exe程序
在这里插入图片描述

2.3安装selenium包

安装方式:通过之前安装(lxml,jsonpath等)操作来安装selenium,这里不再介绍。


三、selenium关于浏览器的使用

3.1 创建浏览器、设置、打开

注意:第一步先将复制的文件粘贴到对应的项目下面

测试:

# 用于操作浏览器
# from selenium import webdriver
# 用于设置谷歌浏览器
# from selenium.webdriver.chrome.options import Options
# 用于管理谷歌驱动
# from selenium.webdriver.chrome.service import Service# (1)导包
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service# 创建浏览器对象
options = Options()
# 禁用沙盒模式(增加兼容性)--- 如果没有出现秒闪退问题,可以不填入
options.add_argument('--no-sandbox')
# 保持浏览器打开状态(默认执行完之后会自动关闭)
options.add_experimental_option("detach", True)
# 创建并启动浏览器
browse = webdriver.Chrome(service=Service('chromedriver.exe'),options=options)

3.2 打开/关闭网页及浏览器

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time# 封装
def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'),options=options)return browserbrowser = setup()
# 打开指定的网址
browser.get('https://www.baidu.com')
# 打印源码
print(browser.page_source)
time.sleep(3)
# 关闭当前的标签页
browser.close()
# 退出浏览器并释放驱动
browser.quit()

3.3 浏览器的最大/小化

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Servicedef setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'),options=options)return browserbrowser = setup()browser.get('https://www.baidu.com')
time.sleep(2)
# 浏览器最大化
browser.maximize_window()
time.sleep(2)
# 浏览器最小化
browser.minimize_window()
time.sleep(2)
# 重新返回最大化
browser.maximize_window()
time.sleep(2)
# 关闭浏览器
browser.quit()

3.4 浏览器打开位置、尺寸

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Servicedef setup():options = Options()options.add_experimental_option('detach', True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)return browserbrowser = setup()# 单位均为像素
# 设置浏览器打开的位置(相对于左上角)
browser.set_window_position(100,100)
# 设置宽高px
browser.set_window_size(800,600)
# 关闭浏览器
browser.quit()

3.5 浏览器截图、网页刷新

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time
def setup():options = Options()options.add_experimental_option('detach', True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)return browserbrowser = setup()
browser.get('https://www.baidu.com')
# 浏览器截图(尽量保存为png的格式)
browser.get_screenshot_as_file('baidu.png')
time.sleep(3)
# 刷新当前页
browser.refresh()
time.sleep(3)
# 关闭
browser.quit()

四、selenium关于元素的使用

4.1 元素定位

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
def setup():options = Options()options.add_experimental_option('detach', True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)return browserbrowser = setup()
browser.get('https://www.baidu.com')
# 使用元素定位需要先导入对应的包
# from selenium.webdriver.common.by import By# 例如根据ID查找百度首页的输入框
# <input id="kw" name="wd"># find_element用来查找一个元素时使用
# 找不到时会直接报错
# 类似于根据id查找的,使用该方法即可,id是元素的唯一标识
input = browser.find_element(By.ID, 'kw')
# 获取class
print(input.get_attribute('class'))
# 获取标签名
print(input.tag_name)# find_elements用来查找多个元素时使用
# 返回的是列表,找不到时不会报错会返回一个空列表
inputs = browser.find_elements(By.ID, 'kw')
print(inputs)# 提示一下:也可以在浏览器的控制台输入
# document.getElementById('kw') 来先查找一下# 关闭浏览器
browser.quit()

4.2 元素交互操作

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Bydef setup():options = Options()options.add_experimental_option('detach',True)browser = webdriver.Chrome(service=Service('chromedriver.exe'),options=options)return browserbrowser = setup()# 获取指定的网址
browser.get('https://www.baidu.com')
input = browser.find_element(By.ID,'kw')
# 元素输入
input.send_keys('fasgfagasgasg')
time.sleep(3)
# 元素清空
input.clear()
time.sleep(2)
# 元素再次输入
input.send_keys('古诗文')
time.sleep(2)
# 获取搜索按钮
button = browser.find_element(By.ID,'su')
# 调用按钮的点击方法
button.click()
time.sleep(2)
# 关闭浏览器
browser.quit()

4.3 元素八种定位方式

4.3.1 元素定位-ID

通过id定位元素结果基本上就是我们想要的元素,准确性比较高。

input = browser.find_element(By.ID, 'kw')
4.3.2 元素定位-NAME

通过name属性来获取元素,也是比较精准的。

input = browser.find_element(By.ID, 'kw')
4.3.3 元素定位-CLASS_NAME

使用class属性来查找元素,容易出现多个元素,因而往往需要用切片处理方式

注意:如果class属性值中包含空格是无法正常获取的

element = browser.find_element(By.CLASS_NAME, 'bg s_btn')
4.3.4 元素定位-TAG_NAME

通过tag标签来查找元素,缺点是获取的元素比较多,需要切片找到需要的元素

element = browser.find_element(By.TAG_NAME, 'input')
4.3.5 元素定位-LINK_TEXT

只标识a标签中的链接文字,根据链接文字查找元素

element = browser.find_element(By.LINK_TEXT, '新闻')
4.3.6 元素定位-PARTIAL_LINK_TEXT

与LINK_TEXT区别是,虽然都是通过链接文本获取元素,但是PARTIAL_LINK_TEXT是在LINK_TEXT的基础上增加了模糊匹配

element = browser.find_element(By.PARTIAL_LINK_TEXT, '地')
4.3.7 元素定位-CSS_SELECTOR
# 通过id等位
element = browser.find_element(By.CSS_SELECTOR, '#kw')
# 通过class定位
element = browser.find_element(By.CSS_SELECTOR, '.s_ipt')
# 不加修饰符(输入标签名)
element = browser.find_element(By.CSS_SELECTOR, 'input')
# 通过任意类型定位
# 精确匹配
element = browser.find_element(By.CSS_SELECTOR, '[value="百度一下"]')
# 模糊匹配
element = browser.find_element(By.CSS_SELECTOR, '[value*="百度"]')
# 匹配开头
element = browser.find_element(By.CSS_SELECTOR, '[value^="百"]')
# 匹配结尾
element = browser.find_element(By.CSS_SELECTOR, '[value$="一下"]')

以上都属于理论定位法,可以直接通过谷歌浏览器复制唯一的selector来确定元素

在这里插入图片描述

element = browser.find_element(By.CSS_SELECTOR, '#su')
4.3.8 元素定位-XPATH

打开谷歌浏览器,直接复制该元素的XPATH即可,与上述操作基本一致

在这里插入图片描述
当一个无法获取到指定元素的时候,采用第二个完整xpath写法

# Xpath
element = browser.find_element(By.XPATH, '//*[@id="su"]')
# 完成Xpath
element = browser.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input')

4.4 元素定位的隐式等待

隐式等待的作用是为了防止,当我们进入到一个页面时,该元素未第一时间加载出来,到底找不到元素而引发的报错。

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Bydef setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'),options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get(r'本地文件的绝对路径')
# time.sleep(4)
div = browser.find_element(By.CSS_SELECTOR,'#delayed-element')
print(div)

对应的html文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>隐式等待测试页面</title>
</head>
<body><h1>隐式等待测试</h1><div id="immediate-element">这个元素是立即存在的</div><script>// 5秒后动态添加一个元素setTimeout(function() {let newElement = document.createElement("div");newElement.id = "delayed-element";newElement.textContent = "这个元素是5秒后出现的";document.body.appendChild(newElement);}, 3000);</script>
</body>
</html>

案例一: 获取表单元素并修改

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Bydef setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get(r'HTML文件绝对路径')# 单选
browser.find_element(By.XPATH, '/html/body/form/div[1]/label[2]').click()# 多选
browser.find_element(By.XPATH, '/html/body/form/div[2]/label[1]').click()
browser.find_element(By.XPATH, '/html/body/form/div[2]/label[2]').click()
browser.find_element(By.XPATH, '/html/body/form/div[2]/label[3]').click()# 下拉
browser.find_element(By.XPATH, '/html/body/form/div[3]/select/option[2]').click()# 日期框
browser.find_element(By.XPATH, '/html/body/form/div[4]/div/input').send_keys('20210912')# 上传文件
browser.find_element(By.XPATH, '/html/body/form/div[5]/input').send_keys(r'D:\Python-learning\pythonProject\02-homework\12-test\baidu.png')# 提交
browser.find_element(By.XPATH, '/html/body/form/button').click()

对应的HTML文件

test.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>表单示例</title><style>body {font-family: Arial, sans-serif;max-width: 600px;margin: 0 auto;padding: 20px;}.form-group {margin-bottom: 20px;padding: 15px;border: 1px solid #ddd;border-radius: 5px;}.form-group h3 {margin-top: 0;margin-bottom: 15px;}.rating {display: flex;flex-direction: column;gap: 10px;}.rating-item {display: flex;align-items: center;}.rating-label {width: 100px;}.date-input {display: flex;align-items: center;}.date-input input {width: 120px;margin-right: 10px;}.date-format {color: #666;}</style>
</head>
<body><form action="ok.html" method="post"><!-- 单选框 --><div class="form-group"><h3>单选框</h3><label><input type="radio" name="language" value="Python" checked> Python</label><br><label><input type="radio" name="language" value="Java"> Java</label><br><label><input type="radio" name="language" value="C++"> C++</label></div><!-- 多选框 --><div class="form-group"><h3>多选框</h3><label><input type="checkbox" name="device" value="手机"> 手机</label><br><label><input type="checkbox" name="device" value="电脑"> 电脑</label><br><label><input type="checkbox" name="device" value="网页"> 网页</label></div><!-- 下拉菜单 --><div class="form-group"><h3>下拉</h3><select name="city"><option value="北京" selected>北京</option><option value="上海">上海</option><option value="广州">广州</option></select></div><!-- 日期选择 --><div class="form-group"><h3>日期</h3><div class="date-input"><input type="text" id="dateInput" placeholder="输入年月日如20240521" maxlength="8"><span id="dateDisplay" class="date-format">年 / 月 / 日</span></div><input type="hidden" id="formattedDate" name="date"></div><!-- 附件上传 --><div class="form-group"><h3>附件</h3><input type="file" name="attachment"></div><!-- 提交按钮 --><button type="submit">提交</button></form><script>document.getElementById('dateInput').addEventListener('input', function(e) {let value = e.target.value.replace(/\D/g, ''); // 移除非数字字符if (value.length > 8) {value = value.substring(0, 8); // 限制最大长度为8}e.target.value = value; // 更新输入框值if (value.length === 8) {// 格式化为YYYY/MM/DDconst year = value.substring(0, 4);const month = value.substring(4, 6);const day = value.substring(6, 8);// 验证月份和日期是否有效const validMonth = parseInt(month) >= 1 && parseInt(month) <= 12;const validDay = parseInt(day) >= 1 && parseInt(day) <= 31;if (validMonth && validDay) {const formattedDate = `${year}/年${month}/月${day}`;document.getElementById('dateDisplay').textContent = formattedDate;document.getElementById('formattedDate').value = formattedDate;} else {document.getElementById('dateDisplay').textContent = '日期无效';document.getElementById('formattedDate').value = '';}} else {document.getElementById('dateDisplay').textContent = '年 / 月 / 日';document.getElementById('formattedDate').value = '';}});</script>
</body>
</html>

ok.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>提交成功!!!</h1>
<a href="./test.html" target="_blank">跳转到填写页面</a>
</body>
</html>

案例二:重复填写表单

提示:需要使用到句柄

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Bydef setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get(r'HTML文件绝对路径')# 循环重复
for x in range(2):time.sleep(2)# 单选browser.find_element(By.XPATH, '/html/body/form/div[1]/label[2]').click()# 多选browser.find_element(By.XPATH, '/html/body/form/div[2]/label[1]').click()browser.find_element(By.XPATH, '/html/body/form/div[2]/label[2]').click()browser.find_element(By.XPATH, '/html/body/form/div[2]/label[3]').click()# 下拉browser.find_element(By.XPATH, '/html/body/form/div[3]/select/option[2]').click()# 日期框browser.find_element(By.XPATH, '/html/body/form/div[4]/div/input').send_keys('20210912')# 上传文件browser.find_element(By.XPATH, '/html/body/form/div[5]/input').send_keys(r'上传文件绝对路径')time.sleep(2)# 提交browser.find_element(By.XPATH, '/html/body/form/button').click()# 点击返回browser.find_element(By.XPATH, '/html/body/a').click()# 打开了新页面之后,我们要获取到全部的句柄(也就是所有的标签页)handles = browser.window_handles# print(handles)# 关闭之前的标签页browser.close()# 通过句柄切换到新的标签页browser.switch_to.window(handles[1])# 获取当前页句柄# print(browser.current_window_handle)

五、三种浏览器获取框(警告框、确认框、提示框)

➡➡➡测试网址

5.1 警告框

示例代码:

def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://sahitest.com/demo/alertTest.htm')# 清空输入框的默认值
browser.find_element(By.XPATH,"/html/body/form/input[1]").clear()
time.sleep(2)# 修改输入框的值
browser.find_element(By.XPATH,"/html/body/form/input[1]").send_keys('大家一起学Python')# 点击按钮
browser.find_element(By.XPATH,"/html/body/form/input[2]").click()# 获取弹窗的内容
print(browser.switch_to.alert.text)time.sleep(2)
# 点击确认按钮
browser.switch_to.alert.accept()

5.2 确认框

➡➡➡测试网址

5.3 提示框

示例代码

def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://sahitest.com/demo/confirmTest.htm')# 点击按钮browser.find_element(By.XPATH,'/html/body/form/input[1]').click()time.sleep(2)
# 点击确认按钮
# browser.switch_to.alert.accept()# 点击取消按钮
browser.switch_to.alert.dismiss()

➡➡➡测试网址

示例代码:

def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://sahitest.com/demo/promptTest.htm')# 点击按钮
browser.find_element(By.XPATH,'/html/body/form/input[1]').click()time.sleep(2)# 输入内容
browser.switch_to.alert.send_keys("123456")
time.sleep(2)# 点击确认按钮
browser.switch_to.alert.accept()

六、 iframe嵌套网页内部元素获取

➡➡➡测试网址

示例代码:

def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://sahitest.com/demo/iframesTest.htm')# iframe嵌套网页 里面的元素 不能够直接获取 因为不在同一个框架里面# 1. 获取iframe元素
iframe = browser.find_element(By.XPATH, '/html/body/iframe')# 2. 进入到iframe里面
browser.switch_to.frame(iframe)# 获取元素并点击
browser.find_element(By.XPATH, '/html/body/table/tbody/tr/td[1]/a[1]').click()
time.sleep(2)
# 此时如果想要获取原页面中的元素就必须退出iframe
browser.switch_to.default_content()time.sleep(2)
# 获取原页面元素
browser.find_element(By.XPATH, '/html/body/input[2]').click()

七、获取元素以及判断可见性

selenium提供了一些基础的爬虫方式。

示例代码:

def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://content-static.cctvnews.cctv.com/snow-book/video.html?item_id=932400080038356852')# 获取元素内容 text
content = browser.find_element(By.XPATH,"/html/body/div/div/div/div[2]/div[1]/div[1]/div/div[5]/div/article/p[1]").text
print(content)# 获取元素可见性
# 简单来说 就是判断这个元素我们能否在页面上看见
flag = browser.find_element(By.XPATH,"/html/head/meta[2]").is_displayed()
print(flag)

八、 网页前进、后退

示例代码:

def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://www.baidu.com')input = browser.find_element(By.ID, 'kw')
input.send_keys('selenium')button = browser.find_element(By.ID, 'su')
button.click()time.sleep(3)
# 网页后退
browser.back()
time.sleep(2)
# 网页前进
browser.forward()
time.sleep(2)
# 关闭
browser.quit()

总结

通过本文的学习,我们系统地了解了 Python 与 Selenium 的结合使用,涵盖了从基础配置到实际应用的多个方面。Selenium 不仅简化了 Web 自动化测试的流程,还为数据采集和动态网页交互提供了强大的支持。借助 Python 的灵活性和 Selenium 的丰富功能,开发者能够高效地完成复杂的任务,无论是自动化测试、爬虫开发,还是网页监控。

当然,Selenium 的强大功能也伴随着一定的学习曲线,尤其是在处理动态内容、反爬机制或复杂的页面结构时,可能需要更多的技巧和经验积累。但只要你掌握了核心的定位与交互方法,并学会利用等待机制、多窗口切换等高级功能,就能应对绝大多数场景的需求。

希望本文能为你打开 Selenium 世界的大门,让你在自动化测试或数据抓取的道路上更加得心应手。技术的进步永无止境,不断实践和探索,你将发现更多 Selenium 与 Python 结合的奇妙用法。继续加油,愿你在自动化的世界中创造更多可能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/906549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于OpenCV的人脸微笑检测实现

文章目录 引言一、技术原理二、代码实现2.1 关键代码解析2.1.1 模型加载2.1.2 图像翻转2.1.3 人脸检测 微笑检测 2.2 显示效果 三、参数调优建议四、总结 引言 在计算机视觉领域&#xff0c;人脸检测和表情识别一直是热门的研究方向。今天我将分享一个使用Python和OpenCV实现…

Java 大视界 -- 基于 Java 的大数据分布式存储在视频会议系统海量视频数据存储与回放中的应用(263)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Kotlin 极简小抄 P9 - 数组(数组的创建、数组元素的访问与修改、数组遍历、数组操作、多维数组、数组与可变参数)

Kotlin 概述 Kotlin 由 JetBrains 开发&#xff0c;是一种在 JVM&#xff08;Java 虚拟机&#xff09;上运行的静态类型编程语言 Kotlin 旨在提高开发者的编码效率和安全性&#xff0c;同时保持与 Java 的高度互操作性 Kotlin 是 Android 应用开发的首选语言&#xff0c;也可…

gitlab+portainer 实现Ruoyi Vue前端CI/CD

1. 场景 最近整了一个Ruoyi Vue 项目&#xff0c;需要实现CICD&#xff0c;经过一番坎坷&#xff0c;最终达成&#xff0c;现将技术要点和踩坑呈现。 具体操作流程和后端大同小异&#xff0c;后端操作参考连接如下&#xff1a; https://blog.csdn.net/leinminna/article/detai…

RNN神经网络

RNN神经网络 1-核心知识 1-解释RNN神经网络2-RNN和传统的神经网络有什么区别&#xff1f;3-RNN和LSTM有什么区别&#xff1f;4-transformer的归一化有哪几种实现方式 2-知识问答 1-解释RNN神经网络 Why&#xff1a;与我何干&#xff1f; 在我们的生活中&#xff0c;很多事情…

javaweb-html

1.交互流程&#xff1a; 浏览器向服务器发送http请求&#xff0c;服务器对浏览器进行回应&#xff0c;并发送字符串&#xff0c;浏览器能对这些字符串&#xff08;html代码&#xff09;进行解释&#xff1b; 三大web语言&#xff1a;&#xff08;1&#xff09;html&#xff1a…

从混乱到高效:我们是如何重构 iOS 上架流程的(含 Appuploader实践)

从混乱到高效&#xff1a;我们是如何重构 iOS 上架流程的 在开发团队中&#xff0c;有一类看不见却至关重要的问题&#xff1a;环境依赖。 特别是 iOS App 的发布流程&#xff0c;往往牢牢绑死在一台特定的 Mac 上。每次需要发版本&#xff0c;都要找到“那台 Mac”&#xff…

FPGA:CLB资源以及Verilog编码面积优化技巧

本文将先介绍Kintex-7系列器件的CLB&#xff08;可配置逻辑块&#xff09;资源&#xff0c;然后分享在Verilog编码时节省CLB资源的技巧。以下内容基于Kintex-7系列的架构特点&#xff0c;并结合实际设计经验进行阐述。 一、Kintex-7系列器件的CLB资源介绍 Kintex-7系列是Xilin…

在linux里上传本地项目到github中

首先先安装git&#xff0c;安装完git后&#xff0c;输入如下操作指令&#xff1a; 输入自己的用户名和邮箱&#xff08;为注册GITHUB账号时的用户名和邮箱&#xff09;&#xff1a; git config --global user.name "111"git config --global user.email "121…

鸿蒙Flutter实战:25-混合开发详解-5-跳转Flutter页面

概述 在上一章中&#xff0c;我们介绍了如何初始化 Flutter 引擎&#xff0c;本文重点介绍如何添加并跳转至 Flutter 页面。 跳转原理 跳转原理如下&#xff1a; 本质上是从一个原生页面A 跳转至另一个原生页面 B&#xff0c;不过区别在于&#xff0c;页面 B是一个页面容器…

c语言 写一个五子棋

c语言 IsWin判赢 display 画 10 x 10 的棋盘 判断落子的坐标是否已有棋子 判断落子坐标范围是否超出范围 // 五子棋 #include <stdio.h> #include <stdlib.h>// 画棋盘 10 x 10的棋盘&#xff0c;len为行数 void display(char map[][10], int len) {system(&q…

格雷希尔快速封堵接头,解决新能源汽车的气密性检测和三电系统的综合测试

我国的新能源汽车已经遥遥领先&#xff0c;让其他国家望尘莫及。格雷希尔GripSeal&#xff0c;为新能源汽车制造业提供快速可靠的密封连接器&#xff0c;让测试速度加倍。以好抓取、易密封为设计理念&#xff0c;实现一秒连接&#xff0c;瞬时密封的高效性能。通过持续的产品设…

人工智能全景解析:从技术原理到未来趋势的深度探索

人工智能(AI)作为21世纪最具变革性的技术之一&#xff0c;正以前所未有的速度重塑着人类社会。从智能手机中的语音助手到工厂里的智能机器人&#xff0c;从医疗诊断系统到金融风控模型&#xff0c;AI技术已渗透到我们生活和工作的方方面面。本文将全面解析人工智能的发展历程、…

[密码学实战]使用C语言实现TCP服务端(二十九)

[密码学实战]使用C语言实现TCP服务端(二十九) 引言 TCP(传输控制协议)是互联网通信中最核心的协议之一,它提供可靠的、面向连接的数据传输服务。通过C语言的标准Socket API,开发者可以灵活地实现TCP客户端和服务端程序。本文将详细讲解TCP通信的原理,并提供完整的代码…

IPv4 地址嵌入 IPv6 的前缀转换方式详解

1. 概述 在 IPv4 和 IPv6 网络共存的过渡期&#xff0c;NAT64&#xff08;Network Address Translation 64&#xff09;是一种关键技术&#xff0c;用于实现 IPv6-only 网络与 IPv4-only 网络的互操作。NAT64 前缀转换通过将 IPv4 地址嵌入到 IPv6 地址中&#xff0c;允许 IPv…

动态神经网络(Dynamic NN)在边缘设备的算力分配策略:MoE架构实战分析

一、边缘计算场景的算力困境 在NVIDIA Jetson Orin NX&#xff08;64TOPS INT8&#xff09;平台上部署视频分析任务时&#xff0c;开发者面临三重挑战&#xff1a; 动态负载波动 视频流分辨率从480p到4K实时变化&#xff0c;帧率波动范围20-60FPS 能效约束 设备功耗需控制在1…

算法优选系列(9.BFS 解决拓扑排序)

目录 拓扑排序简介&#xff1a; ​编辑 课程表&#xff08;medium&#xff09;&#xff1a; 课程表II&#xff08;medium&#xff09;: 火星词典&#xff08;hard&#xff09;&#xff1a; 拓扑排序简介&#xff1a; 有向无环图&#xff08;DAG图&#xff09; 如上图每条边…

SpringBoot3+Vue3(1)-后端 请求头校验,jwt退出登录,mybaits实现数据库用户校验

1.后端&#xff1a;jwt请求头校验 解析 工具类jwtUtils 解析token 令牌是否过期&#xff0c;验证 正常、异常、运行时错误 倒入工具类是resource 工具类中添加解析用户的方法&#xff1a; 在 在工具类添加id解析 此处调用 添加controller做测试 测试&…

【免杀】C2免杀技术(八)APC注入

本文主要写点自己的理解&#xff0c;如有问题&#xff0c;请诸位指出&#xff01; 概念和流程 “APC注入”&#xff08;APC Injection&#xff09;是免杀与恶意代码注入技术中的一种典型方法&#xff0c;主要用于在目标进程中远程执行代码&#xff0c;常见于后门、远控、植入型…

git工具使用

安装Git 在开始使用Git之前&#xff0c;需要在本地计算机上安装Git工具。Git支持Windows、macOS和Linux系统。可以从Git官方网站下载适合操作系统的安装包&#xff0c;并按照安装向导进行安装。 bash复制插入 # 在Linux上安装Git sudo apt-get install git# 在macOS上安装Git…