【Python爬虫】selenium4新版本使用指南

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11)Mozilla FirefoxSafariGoogle ChromeOperaEdge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。

随着时代的发展,在使用python做自动化时,与之前差生了很大的变化,这些变化都是一个老程序员所必须要踩坑的地方,也是由于已经会了老版本,在使用新版本的时候,需要多次探索,本文从当前最新版的Selenium出发,以Chrome驱动为例,总结了新版的使用方法,免得到处去搜索、踩坑。

01、设置驱动

当前Selenium版本:4.3.0,请核对你的版本是否是4.0以上的版本

注意:
请查看你的浏览器版本,然后再去下载对应的驱动,通常来说版本号时一致的,如果没有你的版本号,那就选择和你浏览器版本号最相近的版本。

1. selenium4推荐方法

由于传统的设置驱动方式过于繁琐,因此GitHub大佬SergeyPirogov写了浏览器驱动管理器,可以使设置驱动变得更加方便。

首先,需要安装该管理器,使用以下命令

pip install webdriver-manager

然后导入该包

from webdriver_manager.chrome import ChromeDriverManager

设置service,通过ChromeDriverManager().install()来获取驱动,从而省去了下载驱动和设置驱动的步骤

service = ChromeService(executable_path=ChromeDriverManager().install())

然后驱动加载该service

driver = webdriver.Chrome(service=service)

此处贴出完整代码,以供参考

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
service = ChromeService(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.quit()

2. 传统方法

这里使用传统方法来设置Selenium的驱动,也就是导入webdriver,然后设置可执行程序的路径。

首先,在Selenium4中,设置驱动位置,不再是直接在webdriver.Chrome中直接设置,而是引入了Service。

因此先导入Service的包

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService

然后通过Service设置驱动,CHROMEDRIVER_PATH替换为你的驱动位置

service = ChromeService(executable_path=CHROMEDRIVER_PATH)

最后在webdriver.Chrome中调用这个service

driver = webdriver.Chrome(service=service)

给出完整代码予以参考

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
service = ChromeService(executable_path=CHROMEDRIVER_PATH)
driver = webdriver.Chrome(service=service, options=options)

02、查找元素

在selenium4中,一系列的findElement方法如findElementByClassNamefindElementById等都被整合成为了一个方法——findElement。并且通过By.method来选择你的查找元素方法,例如下。

如果你想根据类名查找元素,你可以使用以下方法

driver.findElement(By.className("className"));

如果你想通过css选择器来查找元素,你可以使用以下方法

driver.findElement(By.cssSelector(".className"));

这里贴出与以往对应的所有查找元素方法,更新前

driver.findElementByClassName("className");driver.findElementByCssSelector(".className");
driver.findElementById("elementId");
driver.findElementByLinkText("linkText");
driver.findElementByName("elementName");
driver.findElementByPartialLinkText("partialText");
driver.findElementByTagName("elementTagName");
driver.findElementByXPath("xPath");

更新后

driver.find_element(By.XPATH,'XPATH')
driver.find_element(By.CLASS_NAME,'CLASS_NAME')
driver.find_element(By.CSS_SELECTOR,'CSS_SELECTOR')
driver.find_element(By.ID,'ID')
driver.find_element(By.LINK_TEXT,'LINK_TEXT')
driver.find_element(By.PARTIAL_LINK_TEXT,'PARTIAL_LINK_TEXT')
driver.find_element(By.TAG_NAME,'TAG_NAME')

如果你查找的是多个元素,只需要将其中的find_element替换成find_elements即可。

等待元素出现

有时候某个元素不是直接出现的,如果不做判断则会导致程序崩溃,因此一般可以做异常处理,这里还有等待元素出现的方法。

首先,需要导入等待的包

from selenium.webdriver.support.ui import WebDriverWait

然后使用以下方法等待元素出现,driver就是浏览器驱动,timeout就是等待的时长,until后是判断元素是否出现的,

el = WebDriverWait(driver, timeout=3).until(lambda d: d.find_element_by_tag_name("p"))

03、动作API

动作API是网上资料比较少的,因为之前的查找元素,调用click等已经可以解决很多的问题了,在翻看官方文档时,发现selenium还支持动作API来模拟动作。

动作API分为四个部分,分别是键盘鼠标滚轮。这里先说明以下公共部分的。

暂停(pause)

光标移动,滚轮滚动期间,会有一些时间空隙,这里可以使用暂停来实现,这里是支持链式调用的,这里贴出官方给出的例子

clickable = driver.find_element(By.ID, "clickable")
ActionChains(driver)\.move_to_element(clickable)\.pause(1)\.click_and_hold()\.pause(1)\.send_keys("abc")\.perform()

释放所有动作

当前有动作执行时,可以使用以下方法停止这些动作

ActionBuilder(driver).clear_actions()

键盘

键盘代码表

如果你有兴趣,可以看一下,地址在这里,可以看到完整的列表。

按下某键,以输入shift+abc为例

    ActionChains(driver)\.key_down(Keys.SHIFT)\.send_keys("abc")\.perform()

弹起某键,以输入shift+a和shift+b为例

    ActionChains(driver)\.key_down(Keys.SHIFT)\.send_keys("a")\.key_up(Keys.SHIFT)\.send_keys("b")\.perform()

浏览器输入某串字符(不指定元素)

    ActionChains(driver)\.send_keys("abc")\.perform()

指定元素输入字符串

    text_input = driver.find_element(By.ID, "textInput")ActionChains(driver)\.send_keys_to_element(text_input, "abc")\.perform()

复制和粘贴

cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
ActionChains(driver)\.send_keys("Selenium!")\.send_keys(Keys.ARROW_LEFT)\.key_down(Keys.SHIFT)\.send_keys(Keys.ARROW_UP)\.key_up(Keys.SHIFT)\.key_down(cmd_ctrl)\.send_keys("xvv")\.key_up(cmd_ctrl)\.perform()

鼠标

鼠标点击保持,该方法将鼠标移动到元素中心与按下鼠标左键相结合。

这有助于聚焦特定元素:

    clickable = driver.find_element(By.ID, "clickable")ActionChains(driver)\.click_and_hold(clickable)\.perform()

鼠标点击释放

    clickable = driver.find_element(By.ID, "click")ActionChains(driver)\.click(clickable)\.perform()

鼠标定义的5种按键

  • 0——鼠标左键
  • 1——鼠标中键
  • 2——鼠标右键
  • 3——X1(后退键)
  • 4——X2(前进键)

鼠标右击

    clickable = driver.find_element(By.ID, "clickable")ActionChains(driver)\.context_click(clickable)\.perform()

按下鼠标3键

    action = ActionBuilder(driver)action.pointer_action.pointer_down(MouseButton.BACK)action.pointer_action.pointer_up(MouseButton.BACK)action.perform()

按下鼠标4键

    action = ActionBuilder(driver)action.pointer_action.pointer_down(MouseButton.FORWARD)action.pointer_action.pointer_up(MouseButton.FORWARD)action.perform()

鼠标双击

    clickable = driver.find_element(By.ID, "clickable")ActionChains(driver)\.double_click(clickable)\.perform()

鼠标移动到元素上

    hoverable = driver.find_element(By.ID, "hover")ActionChains(driver)\.move_to_element(hoverable)\.perform()

鼠标位移

就是通过像素点来进行位移操作

从元素左顶边进行位移

    mouse_tracker = driver.find_element(By.ID, "mouse-tracker")ActionChains(driver)\.move_to_element_with_offset(mouse_tracker, 8, 11)\.perform()

从元素中心进行位移(请期待)

从当前窗口左上角位移

    action = ActionBuilder(driver)action.pointer_action.move_to_location(8, 12)action.perform()

从当前鼠标位置位移

    ActionChains(driver)\.move_by_offset( 13, 15)\.perform()

拖拽元素

该方法首先单击并按住源元素,移动到目标元素的位置,然后释放鼠标。

    draggable = driver.find_element(By.ID, "draggable")droppable = driver.find_element(By.ID, "droppable")ActionChains(driver)\.drag_and_drop(draggable, droppable)\.perform()

通过位移拖拽

    draggable = driver.find_element(By.ID, "draggable")start = draggable.locationfinish = driver.find_element(By.ID, "droppable").locationActionChains(driver)\.drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y'])\.perform()

笔(部分浏览器生效)

由于笔只在部分浏览器生效,这里就不写了,如果你感兴趣,或者有需求可以去官方文档查看,这里贴出官方文档地址。

滚轮(只有谷歌内核浏览器生效)

滚动到某元素位置

iframe = driver.find_element(By.TAG_NAME, "iframe")ActionChains(driver)\.scroll_to_element(iframe)\.perform()

定量滚动

    footer = driver.find_element(By.TAG_NAME, "footer")delta_y = footer.rect['y']ActionChains(driver)\.scroll_by_amount(0, delta_y)\.perform()

从一个元素滚动指定量

    iframe = driver.find_element(By.TAG_NAME, "iframe")scroll_origin = ScrollOrigin.from_element(iframe)ActionChains(driver)\.scroll_from_origin(scroll_origin, 0, 200)\.perform()

从一个元素滚动,并指定位移

    footer = driver.find_element(By.TAG_NAME, "footer")scroll_origin = ScrollOrigin.from_element(footer, 0, -50)ActionChains(driver)\.scroll_from_origin(scroll_origin, 0, 200)\.perform()

从一个元素的原点位移

    ActionChains(driver)\.scroll_from_origin(scroll_origin, 0, 200)\.perform()

总结

以上就是本文的所有内容,总结了selenium4在使用过程中常见的一些坑,以及官方所推荐使用的方式

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

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

相关文章

真实经历分享:性能测试需求分析详解

在实际的工作中系统的性能需求通常是一个笼统的需求,而且有可能给提需求的人并不知道具体的性能需要,所以只能含糊的列出。如果测试人员不搞清楚,就会出现实际要把杀猪刀,需求标明能屠龙!!! 下面…

【烧火柴问题】奇思妙想火柴

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

坚持#第420天~阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法

阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法,亲测有效: Mobax好卡啊,那就直接在阿里云后台操作即可,阿里云后台也可以上传文件。 Navicat mysql好卡啊,那就直接在阿里云后台最上面帮助的右边有个数据库&…

前端基础之JavaScript

JavaScript是一种能够在网页上添加交互效果的脚本语言,也被称为客户端语言。它可以在网页中操作HTML元素、改变CSS样式,以及处理用户的交互事件等。 以下是JavaScript的常见基础知识点: 变量和数据类型:JavaScript中的变量可以存…

如何使用查看器筛选、搜索功能进行数据定位?

前言 我们曾探讨过观测云如何通过将内置视图与查看器相联结,实现更全面的数据关联分析。(参见《内置视图联动查看器,实现数据关联分析》)这里提到的查看器,实际是一个功能全面且强大的数据查看分析工具。其提供多种搜…

软考中项集成如何画图?计算题怎么考的?

2023下半年软考集成一共考6个批次,10月28日、29日软考集成考了第一、二、三、四批次,11月4日软考集成再考第五批和第六批。 先说一下通过10.28-29得出的软考机考注意事项: 1、草稿纸不能自带,考试现场会发放草稿纸,草…

python的pytorch和torchvision利用wheel文件安装

python的pytorch和torchvision利用wheel文件安装 在做人工智能的时候,我们需要下载pytorch和torchvision,那么如何下载呢。利用wheel文件pip安装 下载 首先要看你的python版本,打开命令行,输入: python -V就可以看…

回归预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积神经网络-支持向量机的多输入单输出回归预测

回归预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积神经网络-支持向量机的多输入单输出回归预测 目录 回归预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积神经网络-支持向量机的多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.WOA-CNN-SVM鲸鱼算法…

UML类图关系

1.依赖 依赖关系由箭头表示,含义为A类在类中用到了B类,如B类作为A类的属性、参数、返回值等都属于依赖关系。 2.泛化(继承) 泛化用三角箭头和直线表示,extend。 3.实现 实现用三角箭头和虚线表示,在…

智能井盖传感器有哪些?万宾科技智能井盖效果

在城市治理过程之中,小小的井盖却成为影响民生的一个重要方面,因为井盖一旦出现问题,会严重影响市民的生命安全,并且传统的井盖一般都会采用人工巡检的方式,这就导致了巡检的难度较大,从而不能对城市各个角…

CSS3媒体查询与页面自适应

2017年9月,W3C发布媒体查询(Media Query Level 4)候选推荐标准规范,它扩展了已经发布的媒体查询的功能。该规范用于CSS的media规则,可以为文档设定特定条件的样式,也可以用于HTML、JavaScript等语言。 1、媒体查询基础 媒体查询…

兴业银行养老金拉新项目上线啦,地推百搭项目

兴业银行养老金就在 ”聚量推客“ 申请开通 今年最火的银行拉新项目就是养老金的 单价高 数据好 目前开通养老金的银行有 兴业银行养老金拉新 交通银行养老金拉新 工商银行养老金拉新 招商银行养老金拉新 浦发银行养老金拉新 广发银行养老金拉新等。。还有很多都开通了…

Youtube DNN:Deep Neural Networks for YouTube Recommendations

1.介绍 本文主要解决的三个挑战: 大规模的推荐场景,能够支持分布式训练和提供有效率的服务。不断更新的新物料。稀疏的用户行为,包含大量的噪声。 2.推荐系统 文章包含推荐系统的两阶段模型:召回和排序。 召回网络根据用户的历…

三国杀中的概率学问题2——神郭嘉

前言 四年前,我写过一篇博客三国杀中的概率学问题。当时有一条评论,让我算一算神郭嘉慧识的摸牌数。这也是我写这篇博客的动力来源。相比起四年前,我的数学水平渐长,于是想做一些更深入的数学问题。这篇文章将从更加理论的角度来…

密码学基础

密码学总览 信息安全面临的危险与应对这些威胁的密码技术: 关于上图中的威胁,这里在简单的说明: 窃听:指的是需要保密的消息被第三方获取。篡改:指的是消息的内容被第三方修改,达到欺骗的效果。伪装&…

Window下SRS服务器的搭建

---2023.7.23 准备材料 srs下载:GitHub - ossrs/srs at 3.0release 目前srs release到5.0版本。 srs官方文档:Introduction | SRS (ossrs.net) Docker下载:Download Docker Desktop | Docker 进入docker官网选择window版本直接下载。由…

7.多线程之单例模式

单例模式 文章目录 单例模式1. 什么是单例模式2. 饿汉模式3. 懒汉模式3.1 单线程版:3.2 多线程版 1. 什么是单例模式 单例模式是一种设计模式,常见的设计模式还有工厂模式、建造者模式等。 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码…

Vue3前端100个必要的知识点

为什么是必要的,就是这100个知识点学完后,能独立完成一个小项目。最终能得到一个解决方案。也算是前端知识的积累。如果后面有需要的地方可以回来查。100个其实比较多,我会按新手老鸟,大神来分成3个等级,话不多说&…

SQLyog连接数据库报plugin caching_sha2_password could not be loaded......解决方案

问题描述 问题分析 因为MySQL新版默认使用caching_sha2_password作为身份验证的插件,而旧版本使用的是mysql_native_password。当出现plugin caching_sha2_password could not be loaded报错,我们更换为旧版本 如何解决 先使用cmd命令登录MySQL&a…

【IDEA】设置sql提示

第一步:注入SQL语言 1.首先选择任意一条sql语句,右击,选择 ‘显示上下文操作’ 2.选择 ‘注入语言或引用’ 3. 往下翻,找到MySQL 第二步:配置MySQL数据库连接 1.首先点击侧边的数据库,再点击上面的加号 2…