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

selenium合集

环境搭建步骤

  • 安装selenium
    pip install selenium

  • 安装浏览器

  • 安装浏览器驱动
    谷歌浏览器:chromdriver.exe
    ie浏览器:ieserverdriver.exe
    FireFox浏览器:geckodriver.exe
    特别注意⚠️:下载驱动版本必须与浏览器版本一致

    下载地址

  • 淘宝镜像:https://npmmirror.com/chromedriver

  • https://chromedriver.storage.googleapis.com/index.html

  • 火狐driver:​https://github.com/mozilla/geckodriver/releases

  • ie driver:​https://seleniumrelease.storage.googleapis.com/index.html

chromedriver.exe文件放置在python安装路径(python.exe所在路径)

mac环境下搭建selenium参考:https://www.cnblogs.com/hq0202/p/16273590.html
chrome 131版本驱动下载地址:https://googlechromelabs.github.io/chrome-for-testing/#stable


浏览器常用操作

driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#浏览器最大化
driver.maximize_window()
#最小化
driver.minimize_window()
#指定窗口大小
driver.set_window_size(2000,800)
#浏览器前后退
driver.forward()
driver.back()#浏览器标题及url,获取页面资源(断言)
print(driver.title,driver,current_url,driver.page_source)#截图
driver.get_screenshot_as_file("保存图片路径")#浏览器
driver.close()
driver.quit()

元素定位

driver.find_element_by_id()#通过id定位
driver.find_element_by_name()#通过name定位
driver.find_element_by_tag_name()#通过html标签定位,一般情况下不使用这个
driver.find_element_by_link_text()#通过链接文本定位,就是超链接的文本内容
driver.find_element_by_partial_link_text()#通过部分链接文本定位
driver.find_element_by_class_name()#通过类名定位

返回元素列表[]

driver.find_elements_by_partial_link_text()
driver.find_elements_by_id()#通过id定位
driver.find_elements_by_name()#通过name定位
driver.find_elements_by_class_name()#通过类名定位
driver.find_elements_by_tag_name()#通过html标签定位

xpath定位

绝对路径定位

使用浏览器右键复制绝对路径
绝对路径定位一般不要用,要考虑元素的稳定性

相对路径定位

//开头

  • 标签+索引定位
    //form/span[1]/input
  • 唯一定位标签+单个属性
    //form[@id=‘form’]/span[1]/input[@id=‘kw’]
  • 唯一定位标签+多个属性
    多个属性使用and
    //form[@id=‘form’ and @name=‘f’]/span[1]/input
  • 标签+部分属性定位
    //form/span[1]/input[substring(@class,3)=‘ipt’]
    //form/span[1]/input[contains(@class,‘ipt’)]
    //input[starts-with(@id,‘k’)]
  • 通过文本定位
    //a[text()=‘新闻’]

实例

路径表达式结果
bookstore选取 bookstore 元素的所有子节点
/bookstore选取根元素 bookstore。
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()< 3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素
//title[@lang=‘eng’]选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

chrome开发者工具定位元素:
在console中进行调试:
$x 可以通过xpath表达式进行定位
$$ 可以通过css选择器进行定位

调试常用操作:
修改元素的属性:$x(“xx”)[0].attr=“”
点击某个元素: $$(“xxx”)[0].click()

css定位

  • 通过绝对路径定位,一般不用
    driver.find_element_by_css_selector(“”)
  • 通过id定位
    driver.find_element_by_css_selector(“#kw”)
  • 通过class定位
    driver.find_element_by_css_selector(“.s_ipt”)
  • 通过属性定位
    driver.find_element_by_css_selector(“[autocompplete=‘off’]”)
    driver.find_element_by_css_selector(“[autocompplete=‘off’][class=‘s_ipt’]”)
  • 通过标签定位 标签名+属性/id/class定位
    driver.find_element_by_css_selector(“input#kw”)
    driver.find_element_by_css_selector(“input.s_ipt”)
    driver.find_element_by_css_selector(“input[autocompplete=‘off’]”)
  • 通过层级定位 层级之间通过>或者空格隔开
    driver.find_element_by_css_selector(“form>span>input”)
  • 通过兄弟节点定位
    场景:同一个元素下面有多个相同的元素
    第一个元素标签:first-child
    第n个元素标签:nth-child(n)
    最后元素标签:last-child
    driver.find_element_by_css_selector(“div#s-top-left>a:first-child”)

1.定位元素名为tag的元素:tag 对应于xpath ://tag

2.属性限制表达式

  • 拥有attr属性的任意元素 [attr] ----对应于xpath : //*[@attr]
  • 拥有attr属性的tag元素。tag[attr] ---- 对应于xpath: //tag[@attr]
  • attr=value [attr=value]---- 对应于xpath: //*[@attr=‘value’]
  • css没有用元素内容进行定位的选择器 xpath://tag[text()=“元素内容”]
例子描述
.intro选择class=intro的所有元素
#firstname选择id=firstname的所有元素
*选择所有元素
p选择所有

元素

div,p选择所有

的所有元素

div p选择所有
元素内部的所有

元素

div>p选择父元素为
元素的所有

元素

div+p选择紧接在
元素之后的所有

元素

[target]选择带有target属性所有元素
[target=_blank]选择targer=“_blank"的所有元素
p:nth-child(2)选择属于其父元素的第二个子元素的每个

元素

支持所有定位方式

from selenium.webdriver.common.by import By
driver.find_element(By.xpath,“xx”)


元素的常用操作

四大操作:

  • 点击 click()
  • 输入 send_keys()
  • 获取文本 text
  • 获取属性 get_attribute()

等待方式

直接等待

缺点:

  • 使用死板,难以衡量具体等待时间,有时间等待也解决不了问题

解决方案:在报错元素操作之前添加等待
原理:强制等待,线程休眠一段时间

隐式等待

隐式等待只能解决元素查找问题,不能解决元素交互问题
问题:难以确定元素加载的具体时间
原理:设置一个等待时间,轮询查找元素是否出现,如果没有出现就抛出异常

隐式等待无法解决的问题

  • 元素可以找到,使用点击等操作,出现报错
  • 原因:
    • 页面元素加载是异步加载过程,通常会html先加载完成,js,css其后
    • 元素存在与否是由html决定,元素的交互是由css或js决定
    • 隐式等待只关注元素能否找到,不关注元素能否点击或者进行其他的交互
  • 解决方案:使用显示等待

显示等待

WebDriverWait(driver实例, 最长等待时间, 轮询时间).until(结束条件)
原理:在最长等待时间内,轮询,是否满足结束条件


多窗口处理

  1. 先获取到当前窗口句柄(driver.current_window_handle)
  2. 再获取到所有的窗口句柄(driver.window_handles)最早打开的窗口在列表最前面
  3. 判断是否想要操作的窗口,如果是,就可以对窗口进行操作;如果不是就跳转到另一个窗口(driver.switch_to_window);

driver.switch_to_window(win[-1])//切换至最后一个窗口

相关文章:

selenium合集

环境搭建步骤 安装selenium pip install selenium 安装浏览器 安装浏览器驱动 谷歌浏览器&#xff1a;chromdriver.exe ie浏览器:ieserverdriver.exe FireFox浏览器:geckodriver.exe 特别注意⚠️&#xff1a;下载驱动版本必须与浏览器版本一致 下载地址 淘宝镜像&#xff1…...

JVM生产环境常用参数配置及调优建议

一、生产常用参数配置 JAVA_OPTS"-server -Xms3000m -Xmx3000m -Xmn1500m -XX:UseG1GC -XX:ConcGCThreads8 -XX:PrintGCDetails -XX:PrintGCTimeStamps -Xloggc:./g1-gc.log -XX:MaxMetaspaceSize256m -XX:-UseGCOverheadLimit -XX:UseCompressedOops -XX:HeapDumpOnOu…...

Spring Boot 3 实现 MySQL 主从数据库之间的数据同步

✅ Spring Boot 3 实现 MySQL 主从数据库之间的数据同步 在实际项目中&#xff0c;为了提高 系统的读性能 和 数据的可用性&#xff0c;通常会使用 主从数据库架构。Spring Boot 提供了对 多数据源 的良好支持&#xff0c;可以轻松配置 主从数据库 的数据同步&#xff0c;实现…...

【小程序开发】- 小程序版本迭代指南(版本发布教程)

一&#xff0c;版本号 版本号是小程序版本的标识&#xff0c;通常由一系列数字组成&#xff0c;如 1.0.0、1.1.0 等。版本号的格式通常是 主版本号.次版本号.修订号 主版本号&#xff1a;当小程序有重大更新或不兼容的更改时&#xff0c;主版本号会增加。 次版本号&#xff1a…...

MySQL 间隙锁避免“可重复读”出现“幻读”

在数据库事务处理中&#xff0c;可重复读&#xff08;Repeatable Read&#xff09;是一个常用的隔离级别&#xff0c;但其默认行为可能导致幻读现象。然而&#xff0c;在 MySQL 的实现中&#xff0c;通过 **间隙锁&#xff08;Gap Lock&#xff09;**机制&#xff0c;能够避免幻…...

揭秘区块链隐私黑科技:零知识证明如何改变未来

文章目录 1. 引言&#xff1a;什么是零知识证明&#xff1f;2. 零知识证明的核心概念与三大属性2.1 完备性&#xff08;Completeness&#xff09;2.2 可靠性&#xff08;Soundness&#xff09;2.3 零知识性&#xff08;Zero-Knowledge&#xff09; 3. 零知识证明的工作原理4. 零…...

JavaWeb开发:从入门到精通

近年来&#xff0c;JavaWeb开发已经成为了互联网开发领域的重要技术之一。无论是大型企业还是个人项目&#xff0c;都离不开JavaWeb开发。本文将为您介绍JavaWeb开发的基本概念、常用技术和开发流程&#xff0c;帮助您快速入门并掌握这一技术。 一、JavaWeb开发的基本概念 Jav…...

2025年01月07日Github流行趋势

项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;20105今日star数&#xff1a;363项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, shantanuSakpal项目简介&#xff1a;你…...

c#集成npoi根据excel模板导出excel

NuGet中安装npoi 创建excel模板&#xff0c;替换其中的内容生成新的excel文件。 例子中主要写了这四种情况&#xff1a; 1、替换单个单元格内容&#xff1b; 2、替换横向多个单元格&#xff1b; 3、替换表格&#xff1b; 4、单元格中插入图片&#xff1b; using System.IO; …...

Vue2移动端(H5项目)项目封装switch组件支持动态设置开启关闭背景色、值及组件内显示文字描述、禁用、switch 的宽度

前言 近期产品需求&#xff1a;Vue2移动端项目需要在switch开关内显示文字&#xff0c;看Vantui没有对应功能&#xff0c;因此自己手撸写了这个组件。 一、最终效果 二、参数配置 1、代码示例&#xff1a; <t-switch v-model"check"/>2、配置参数&#xff08;…...

MATLAB语言的语法糖

MATLAB语言的语法糖 引言 在编程语言的发展历程中&#xff0c;语法糖&#xff08;Syntactic Sugar&#xff09;被广泛提及。它指的是一种编程语言的语法特性&#xff0c;旨在使代码更易读、更易写&#xff0c;虽然这些特性并不增加语言的表达能力&#xff0c;但能使程序员的生…...

数字IC设计高频面试题

在数字IC设计领域&#xff0c;面试是评估候选人技术能力和问题解决能力的重要环节。数字IC设计的复杂性和要求在不断提高。面试官通常会提出一系列面试题&#xff0c;以考察应聘者在数字设计、验证、时钟管理、功耗优化等方面的专业知识和实践经验。 这些题目不仅涉及理论知识…...

OpenCV 4.5至4.10版本更新概述

OpenCV 4.5至4.10版本更新概述 OpenCV 从 4.5 到 4.10 版本的更迭中&#xff0c;每个版本都引入了新功能、优化和修复。以下是主要版本的更新内容概述&#xff1a; OpenCV 4.5.x 系列 4.5.0 (2020年10月) 新增对 YOLOv4 的支持。引入 DNN 模块的改进&#xff0c;包括对 ONNX …...

OSPF - LSA对照表

LSA的三要素&#xff0c;如何唯一表示一条LSA  Type&#xff1a;表示是几类的LSA  Link-id&#xff1a;这个比较特殊&#xff0c;不同的LSA的Link-ID不同  Advertising router&#xff1a;谁产生的LSA 常用的就是1、2、3、4、5、7型LSA 点击蓝字跳转LSA详细介绍(持续更新中…...

游戏引擎学习第77天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾昨天的 bug 今天我们继续开发进度&#xff0c;进行调试昨天代码的问题&#xff0c;主要是关于如何跟踪玩家和敌人在世界中的高度位置。虽然我们做的是一款 2D 游戏&#xff0c;但我们希望能够处理多层的房间&#xff0c;玩家…...

【项目实战1】五子棋游戏

目录 C语言编程实现五子棋&#xff1a;&#xff1a; game.h game.c 1.打印菜单 2.打印棋盘 3.玩家下棋 4.判断五子连珠 5.判断输赢 6.游戏运行 game.c完整源代码展示 test.c C语言编程实现五子棋&#xff1a;&#xff1a; game.h #pragma once #include<stdio.h> …...

HTML5 动画效果:淡入淡出(Fade In/Out)详解

HTML5 动画效果&#xff1a;淡入淡出&#xff08;Fade In/Out&#xff09;详解 淡入淡出&#xff08;Fade In/Out&#xff09;是一种常见的动画效果&#xff0c;使元素逐渐显现或消失&#xff0c;增强用户体验。以下是淡入淡出的详细介绍及实现示例。 1. 淡入淡出的特点 平滑…...

Conmi的正确答案——Cordova使用“src-cordova/config.xml”编辑“Android平台”的“uses-permission”

Cordova版本&#xff1a;12.0.0 (cordova-lib12.0.1) 1、配置例程&#xff1a; <platform name"android"><config-file target"AndroidManifest.xml" parent"/manifest"><uses-permission android:name"android.permission…...

在Mysql环境下对数据进行增删改查

一、插入数据&#xff1a; insert into 表名 [(字段名)] values (字段对应的值1,字段对应的值2,…)[,(字段对应的值1,字段对应的值2,…)]; insert into students (id,name,age,height,gender,cls_id,is_delete) values (0,小明,18,180.00,2,1,0)在学生表中插入“小明”数据的…...

Spring 设计模式:经典设计模式

Spring 设计模式&#xff1a;经典设计模式 引言 Spring 框架广泛使用了经典设计模式。 这些模式在 Spring 内部发挥着重要作用。 通过理解这些设计模式在 Spring 中的应用&#xff0c;开发者可以更深入地掌握 Spring 框架的设计哲学和实现细节。 经典设计模式 控制反转&am…...

SAP MM BAPI_PO_CHANGE 报错请输入净价,明明已经传值净价!

1、问题&#xff1a;明明已经传入净价&#xff0c; BAPI_PO_CHANGE 修改采购订单价格报错&#xff0c;请输入净价&#xff01; 2、先说下这个创建的函数 &#xff1a;BAPI_PO_CREATE1 ls_poitem-po_price ‘1’. " 价格采纳&#xff1a;1 总值 ls_poit…...

iMakerPS2:多PS2手柄高可靠通信协议栈

1. 项目概述iMakerPS2 是一款专为嵌入式系统设计的 PlayStation 1/2 控制器通信协议栈&#xff0c;由越南 iMaker 团队重构并持续维护。该库并非简单封装&#xff0c;而是基于对 PS2 协议物理层、时序逻辑与命令帧结构的深度逆向解析所构建的轻量级、高鲁棒性驱动框架。其核心目…...

肿瘤微创治疗适用人群有哪些?

肿瘤微创治疗以创伤小、恢复快、精准度高为特点&#xff0c;并非人人适用&#xff0c;但覆盖人群广泛&#xff0c;尤其为无法耐受传统手术或中晚期肿瘤患者提供了重要治疗选择&#xff0c;主要适用人群如下&#xff1a;高龄、体质虚弱患者老年患者常合并高血压、糖尿病、心肺功…...

手机号查QQ号:3个步骤找回遗忘的QQ账号,你试过吗?

手机号查QQ号&#xff1a;3个步骤找回遗忘的QQ账号&#xff0c;你试过吗&#xff1f; 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经因为忘记QQ号而陷入数字身份的困境&#xff1f;当新设备需要验证时&#xff0c;只记得…...

Python+scikit-fuzzy实战:5分钟搞定电机速度模糊控制(附完整代码)

Pythonscikit-fuzzy实战&#xff1a;5分钟搞定电机速度模糊控制&#xff08;附完整代码&#xff09; 最近在开发一个智能小车项目时&#xff0c;遇到了电机速度控制的难题。传统PID控制虽然稳定&#xff0c;但面对复杂路况时响应总是不够理想。尝试改用模糊控制后&#xff0c;发…...

DXVK深度解析:彻底解决GTA IV在Linux平台的纹理模糊问题终极指南

DXVK深度解析&#xff1a;彻底解决GTA IV在Linux平台的纹理模糊问题终极指南 【免费下载链接】dxvk Vulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk DXVK是一个基于Vulkan的D3D8、9、10和11实现…...

CVPR 2023论文CDDFuse实战:用Python复现多模态图像融合的双分支特征分解模型

CVPR 2023论文CDDFuse实战&#xff1a;用Python复现多模态图像融合的双分支特征分解模型 当红外与可见光图像在军事侦察、医疗诊断等领域需要协同工作时&#xff0c;传统融合方法往往难以平衡细节保留与特征互补。CVPR 2023最佳论文候选CDDFuse提出了一种创新方案——通过双分支…...

AI原生研发的“冰山协议”:SITS2026首次公开未写入文档的8项隐性契约(含法律、运维、伦理三维度合规 checklist)

第一章&#xff1a;SITS2026专家解读&#xff1a;AI原生研发的核心挑战 2026奇点智能技术大会(https://ml-summit.org) AI原生研发并非简单地将大模型API嵌入传统系统&#xff0c;而是重构软件生命周期的范式——从需求建模、架构设计、代码生成到验证运维&#xff0c;全部以L…...

肺部音频数据集:从咳嗽检测到呼吸音分类的全面解析

1. 肺部音频数据集的价值与应用场景 当你听到咳嗽声时&#xff0c;能分辨出是普通感冒还是更严重的肺部疾病吗&#xff1f;这个问题正是肺部音频数据集要解决的核心问题。这类数据集通过收集大量咳嗽、呼吸等声音样本&#xff0c;为AI模型提供训练素材&#xff0c;最终实现自动…...

如何开发Day.js插件:从零开始构建自定义日期功能扩展

如何开发Day.js插件&#xff1a;从零开始构建自定义日期功能扩展 【免费下载链接】dayjs ⏰ Day.js 2kB immutable date-time library alternative to Moment.js with the same modern API 项目地址: https://gitcode.com/gh_mirrors/da/dayjs Day.js作为一款轻量级的日…...