Selenium 全面指南

Selenium 是一个强大的 Web 自动化工具,支持多种浏览器和语言绑定。


1. Selenium 的基本概念

  • WebDriver:Selenium 提供的核心接口,用于控制浏览器操作。
  • 显式等待:等待特定条件满足后再执行操作。
  • 隐式等待:全局设置一个等待时间,针对所有操作生效。
  • 定位器(Locators):用于定位页面元素的方法,如 ID、XPath、CSS 选择器等。

2. Selenium 的主要模块及 API

2.1 WebDriver

WebDriver 是 Selenium 的核心,用于与浏览器进行交互。

2.1.1 初始化浏览器
from selenium import webdriver# 启动 Chrome 浏览器
driver = webdriver.Chrome()# 打开指定网址
driver.get("https://www.example.com")# 最大化窗口
driver.maximize_window()# 关闭浏览器
driver.quit()

2.1.2 浏览器导航

driver.get("https://www.example.com")  # 打开网址
driver.back()  # 后退
driver.forward()  # 前进
driver.refresh()  # 刷新页面

2.2 定位元素

Selenium 提供多种方法来定位网页中的元素:

2.2.1 使用 find_elementfind_elements
from selenium.webdriver.common.by import By# 定位单个元素
element = driver.find_element(By.ID, "element_id")# 定位多个元素
elements = driver.find_elements(By.CLASS_NAME, "class_name")
2.2.2 常用定位器
定位器用法示例
IDdriver.find_element(By.ID, "element_id")
Namedriver.find_element(By.NAME, "name")
Classdriver.find_element(By.CLASS_NAME, "class")
Tagdriver.find_element(By.TAG_NAME, "tag")
CSSdriver.find_element(By.CSS_SELECTOR, ".class")
XPathdriver.find_element(By.XPATH, "//tag[@attr='value']")

2.3 操作页面元素

2.3.1 输入内容
element = driver.find_element(By.ID, "username")
element.send_keys("test_user")
2.3.2 点击按钮
button = driver.find_element(By.ID, "submit_button")
button.click()
2.3.3 清空输入框
input_field = driver.find_element(By.ID, "input_field")
input_field.clear()
2.3.4 获取元素属性
element = driver.find_element(By.ID, "logo")
print(element.get_attribute("src"))
2.3.5 获取元素文本
element = driver.find_element(By.ID, "welcome_message")
print(element.text)

2.4 等待

Selenium 提供显式等待和隐式等待来处理动态加载页面。

2.4.1 隐式等待

隐式等待是全局设置,等待元素加载完成。

driver.implicitly_wait(10)  # 全局等待 10 秒
2.4.2 显式等待

显式等待针对特定元素或条件设置。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 等待元素可见
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "element_id"))
)
2.4.3 常用条件
条件描述
presence_of_element_located元素出现在 DOM 中,但不一定可见。
visibility_of_element_located元素出现在 DOM 且可见。
element_to_be_clickable元素可点击。
url_changes页面 URL 发生变化。
alert_is_present弹窗出现。

2.5 页面操作

2.5.1 窗口操作
# 获取当前窗口句柄
current_window = driver.current_window_handle# 获取所有窗口句柄
all_windows = driver.window_handles# 切换到新窗口
driver.switch_to.window(all_windows[1])
2.5.2 iframe 切换
# 切换到 iframe
driver.switch_to.frame("iframe_name")# 返回主页面
driver.switch_to.default_content()
2.5.3 滚动页面
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

2.6 Cookie 和 JavaScript

2.6.1 操作 Cookie
# 获取所有 Cookies
print(driver.get_cookies())# 添加 Cookie
driver.add_cookie({"name": "test", "value": "123"})# 删除 Cookie
driver.delete_cookie("test")
2.6.2 执行 JavaScript
driver.execute_script("alert('Hello, Selenium!')")

2.7 处理弹窗

# 等待弹窗出现
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())# 获取弹窗文本
print(alert.text)# 接受弹窗
alert.accept()

3. 进阶技巧

3.1 动态 XPath

动态页面的元素属性可能变化,可以使用包含或正则表达式的 XPath:

element = driver.find_element(By.XPATH, "//button[contains(@class, 'submit')]")

 3.2 验证页面加载完成

WebDriverWait(driver, 10).until(lambda d: d.execute_script("return document.readyState") == "complete"
)


4. 常见问题和解决方案

  1. 元素未找到

    • 使用显式等待。
    • 检查选择器是否正确。
  2. 元素不可交互

    • 检查是否需要滚动或切换到 iframe。
    • 确保元素可见。
  3. 动态加载内容

    • 使用 WebDriverWait 处理延迟加载的内容。

5. 总结

Selenium 提供了丰富的 API,涵盖了浏览器操作、页面元素交互、动态等待等场景。熟练掌握这些 API,可以帮助我们轻松应对;爬虫、 Web 自动化测试的各种挑战。

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

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

相关文章

Go框架比较:goframe、beego、iris和gin

由于工作需要,这些年来也接触了不少的开发框架,Golang的开发框架比较多,不过基本都是Web"框架"为主。这里稍微打了个引号,因为大部分"框架"从设计和功能定位上来讲,充其量都只能算是一个组件&…

【华为OD-E卷-木板 100分(python、java、c++、js、c)】

【华为OD-E卷-木板 100分(python、java、c、js、c)】 题目 小明有 n 块木板,第 i ( 1 ≤ i ≤ n ) 块木板长度为 ai。 小明买了一块长度为 m 的木料,这块木料可以切割成任意块,拼接到已有的木板上,用来加…

sqlserver临时表来做表联查复杂查询

使用临时表,先查询出结果,在用于后面表的子查询或者联查 -- 删除表1if EXISTS ( SELECT 1 FROM tempdb.sys.objects where name like #temp_PublishRecord% ) beginDROP TABLE #temp_PublishRecordprint 已删除临时表 #temp_PublishRecordend--创…

OMG DDS 规范漫谈:分布式数据交互的演进之路

一、由来与起源脉络 OMG DDS(Object Management Group Data Distribution Service)的发展是计算机科学和技术进步的一个缩影,它反映了对高效、可靠的数据共享需求的响应。DDS 的概念萌生于20世纪90年代末,当时分布式计算已经从理…

1.使用 Couchbase 数仓和 Temporal(一个分布式任务调度和编排框架)实现每 5 分钟的增量任务

在使用 Couchbase 数仓和 Temporal(一个分布式任务调度和编排框架)实现每 5 分钟的增量任务时,可以按照以下步骤实现,同时需要注意关键点。 实现方案 1. 数据层设计(Couchbase 增量存储与标记) 在 Couchb…

Spring源码分析之AOP-@EnableAspectJAutoProxy

前言 这篇文章之前我们说了Springboot的启动流程,Bean对象怎么实现从无到有的一个过程还有一些接口的拓展的实现等等那么从这一篇文章开始的话我们就会开始说一说我们的常用的AOP它的底层实现原理所以大家一起加油加油!!! AOP: 1.简介: AOP的…

Linux(Centos 7.6)基本信息查看

1.服务器硬件信息查看 1.1.服务器厂商、产品名称查看 dmidecode -s system-manufacturer:查看服务器厂商信息 dmidecode -s system-product-name:查看服务器产品名称信息 1.Windows使用VMware安装的Linux(Centos 7.6)后,服务器厂商、产品名…

多个图片转换为PDF文件

将多个图片转换为PDF文件在Python中可以通过多个库来实现,其中最常用的库之一是Pillow(用于图像处理)和reportlab(用于生成PDF)。不过,对于直接图片转PDF的操作,更推荐使用Pillow配合PyMuPDF&am…

小程序app封装公用顶部筛选区uv-drop-down

参考ui:DropDown 下拉筛选 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 样式示例&#xff1a; 封装公用文件代码 dropDownTemplete <template><!-- 顶部下拉筛选区封装公用组件 --><view><uv-drop-down ref&…

LeetCode:101. 对称二叉树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输…

Docker-如何启动docker

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们在上一章&#xff0c;讲了虚拟化&#xff0c;虚拟化是把硬件虚拟化&#xff0c;然后创建出来的虚拟机完全隔离&#xff…

COMSOL with Matlab

文章目录 基本介绍COMSOL with MatlabCOMSOL主Matlab辅Matlab为主Comsol为辅 操作步骤常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 实例教学自动另存新档**把语法套用到边界条件**把语法套用到另存新档 函数及其微分…

游戏关卡设计方法的杂感

1、正规思路是&#xff1a;先写设计文档&#xff0c;画平面图&#xff0c;再做白模关卡&#xff0c;再做正规模型的关卡。 一步步扩大。 当然是有道理的&#xff0c;从小到大&#xff0c; 但实际上这需要很强的想象力&#xff0c;很多细节靠脑补&#xff0c;初学者很难做好。…

JVM系列(十二) -常用调优命令汇总

最近对 JVM 技术知识进行了重新整理&#xff0c;再次献上 JVM系列文章合集索引&#xff0c;感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…

bmp390l传感器的IIC命令通信(学习汇总)

参考链接&#xff1a; BMP390高精度压力传感器数据读取与处理&#xff08;基于STM32&#xff09;-CSDN博客 https://blog.csdn.net/qq_43862401/article/details/106502397 利用usb转iic模块测试bmp390l传感器采集当前环境的温度和气压数据&#xff0c;下图中reserved表示…

C/C++基础知识复习(43)

1) 什么是运算符重载&#xff1f;如何在 C 中进行运算符重载&#xff1f; 运算符重载是指在 C 中为现有的运算符定义新的行为&#xff0c;使得它们能够用于用户定义的数据类型&#xff08;如类或结构体&#xff09;。通过运算符重载&#xff0c;可以让自定义类型像内置数据类型…

Windows11 家庭版安装配置 Docker

1. 安装WSL WSL 是什么&#xff1a; WSL 是一个在 Windows 上运行 Linux 环境的轻量级工具&#xff0c;它可以让用户在 Windows 系统中运行 Linux 工具和应用程序。Docker 为什么需要 WSL&#xff1a; Docker 依赖 Linux 内核功能&#xff0c;WSL 2 提供了一个高性能、轻量级的…

2025系统架构师(一考就过):案例题之一:嵌入式架构、大数据架构、ISA

一、嵌入式系统架构 软件脆弱性是软件中存在的弱点(或缺陷)&#xff0c;利用它可以危害系统安全策略&#xff0c;导致信息丢失、系统价值和可用性降低。嵌入式系统软件架构通常采用分层架构&#xff0c;它可以将问题分解为一系列相对独立的子问题&#xff0c;局部化在每一层中…

新手SEO指南如何快速入门与提升网站排名

内容概要 搜索引擎优化&#xff08;SEO&#xff09;是提高网站可见度和排名的重要手段&#xff0c;尤其对新手来说&#xff0c;掌握其基本概念和实用技巧至关重要。本文将针对新手提供一系列的指导&#xff0c;帮助你快速入门并逐步提升网站排名。 首先&#xff0c;了解SEO的…

Oracle下载安装(保姆级教学)

方法1 1. 官网下载安装包 对于 Oracle 软件的下载&#xff0c;建议通过官网免费下载&#xff0c;安全且有保证。 下载地址&#xff1a; https://www.oracle.com/database/technologies/oracle19c-windows-downloads.html 通过下载页面可以选择安装压缩包&#xff08; WIND…