我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

在这里插入图片描述

提示:本文默认你已经学会使用selenium的旧版本,因此对一些可以直接搜索到很多的内容,你应该是已经学会的

文章目录


前言

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

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


一、设置驱动

当前Selenium版本:4.3.0,请核对你的版本是否是4.0以上的版本。
Chrome驱动点击此处下载

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

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 webdriverfrom selenium.webdriver.chrome.service import Service as ChromeServicefrom webdriver_manager.chrome import ChromeDriverManagerservice = ChromeService(executable_path=ChromeDriverManager().install())driver = webdriver.Chrome(service=service)driver.quit()

2. 传统方法

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

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

from selenium import webdriverfrom 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 webdriverfrom selenium.webdriver.chrome.service import Service as ChromeServiceoptions = 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)

二、查找元素

在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"))

三、动作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+ashift+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.CONTROLActionChains(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.location    finish = driver.find_element(By.ID, "droppable").location    ActionChains(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在使用过程中常见的一些坑,以及官方所推荐使用的方式,此外,通过翻阅文档,将selenium4的动作API挖了出来,算是比较完整的selenium入门了,如果你对selenium4感兴趣,可以与我联系哦。

附录

以下内容不分先后,

来源地址:https://blog.csdn.net/weixin_47754149/article/details/125551434

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Python编写爬虫的基本模块及框架使用指南

基本模块python爬虫,web spider。爬取网站获取网页数据,并进行分析提取。 基本模块使用的是 urllib,urllib2,re,等模块 基本用法,例子: (1)进行基本GET请求,获取网页html#!coding=utf-8
2022-06-04

Conda使用指南:轻松升级Python版本

Conda使用指南:轻松升级Python版本,需要具体代码示例引言:在Python的开发过程中,我们经常需要升级Python版本来获取新的功能或修复已知的Bug。然而,手动升级Python版本可能会很麻烦,特别是当我们的项目和依赖包相对复
Conda使用指南:轻松升级Python版本
2024-02-22

使用pip升级Python版本的简易指南

一步步教你使用pip升级Python版本,需要具体代码示例导语:Python是一种功能强大的编程语言,常用于开发应用程序和网站。随着Python不断的发展和更新,升级Python版本变得非常重要。本文将教你如何使用pip升级Python版
使用pip升级Python版本的简易指南
2024-02-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录