selenium4新版本使用指南

2023-11-07

提示:本文默认你已经学会使用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 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)
            

              二、查找元素

              在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.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.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感兴趣,可以与我联系哦。

                                                                          附录

                                                                          以下内容不分先后,

                                                                          本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

                                                                          selenium4新版本使用指南 的相关文章

                                                                          随机推荐

                                                                          • flask中ORM的使用

                                                                            目录 1 ORM是什么 2 flask sqlalchemy介绍及安装 3 设计数据库模型并创建表 4 使用ORM插入 修改 删除数据 5 使用ORM查询数据并展示 1 ORM是什么 对象关系的映射 它的作用是在关系型数据库和对象之间作一个
                                                                          • 前端三件套原理遗忘复习(一)

                                                                            1 BOM事件 事件就是用户或浏览器自身执行的某种动作 事件可能是用户在某些内容上的点击 鼠标经 过某个特定元素或按下键盘上的某些按键 事件还可能是 Web 浏览器中发生的事情 比如说 某个 Web 页面加载完成 或者是用户滚动窗口或改变窗
                                                                          • 在切瓦片时transform的包围盒会偏移一个位置,查看这个是否需要在坐标上减去该值,或者直接用tmspackage

                                                                            这个用apply transfrom 即可 因为transform后面addChild的是整个几何体 关键是如何判断整体的包围盒 所有的几何体包围盒 这样四叉树或者八叉树才行 如果说对单个模型的八叉树切片是对drawable的切片 那么多个
                                                                          • Android解决调用JNI报java.lang.UnsatisfiedLinkError: No implementation found for的错误

                                                                            最近公司项目需求接入即时通讯功能 现在第三方的即时通讯做的比较完善 接入也很方便 最近在调试语音的时候遇到了一个 so库加载失败的问题 在网上查看都是说由于原有项目的so库和新添加的model的so库数量不一致 具体报错如下 java la
                                                                          • 认真分析mmap:是什么 为什么 怎么用

                                                                            mmap基础概念 mmap是一种内存映射文件的方法 即将一个文件或者其它对象映射到进程的地址空间 实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系 实现这样的映射关系后 进程就可以采用指针的方式读写操作这一段内存 而系统会自动
                                                                          • oracle delete了数据表,吓死我了!!

                                                                            我用的是第一种方法 华丽分割线 一 根据时间来恢复 1 查询数据库当前时间 目的是为了检查数据库时间是否与你电脑时间相近 避免时间不同而将数据恢复到错误时间点 select to char sysdate yyyy mm dd hh24 m
                                                                          • Datawhale-数据类型、关键字、标识符

                                                                            Go 语言的空格 Go 语言中变量的声明必须使用空格隔开 如 var age int 语句中适当使用空格能让程序更易阅读 无空格 fruit apples oranges 在变量与运算符间加入空格 程序看起来更加美观 如 fruit app
                                                                          • Spring Bean xml定义说明

                                                                            转自 Spring Bean xml定义说明 在前一篇文章中 我们知道了Spring IoC容器管理的对象称之为 Spring Bean Spring Bean根据配置文件或注解创建 那么这个配置文件该如何编写呢首先Spring Bean的
                                                                          • 区间预测

                                                                            区间预测 MATLAB实现基于QRCNN BiGRU卷积双向门控循环单元多变量时间序列区间预测 目录 区间预测 MATLAB实现基于QRCNN BiGRU卷积双向门控循环单元多变量时间序列区间预测 效果一览 基本介绍 模型描述 程序设计 参
                                                                          • 三种振幅调制AM、DSB、SSB

                                                                            1 调制与解调 调制 用调制信号去控制载波信号的某一个参量的过程 解调 调制的逆过程 即从已调波中恢复原调制信号 2 振幅调制AM AM调幅波的数学表达式 波形 频谱 单一频率信号的频谱 限带信号调幅波的频谱 AM信号的生成原理框图 调幅波
                                                                          • 【山河送书第四期】:《Python之光:Python编程入门与实战》参与活动,免费送书五本!!

                                                                            山河送书第四期 Python之光 Python编程入门与实战 参与活动 免费送书五本 书本简介 本书亮点 配套丰富 购买链接 参与方式 往期赠书回顾 书本简介 作为一种极其流行的编程语言 Python已经成为了当今最为重要的生产力工具之一
                                                                          • Error: Rule can only have one resource source (provided resource and test + include + exclude)

                                                                            前言 vue3 0报错记录 报错描述和过程 1 在使用vue3 0的时候 经常会报错 vue loader v16 找不到 2 在使用中发现一个很奇怪的问题 刚报错找不到 vue loader v16 我使用 cnpm i save vue
                                                                          • 计算机桌面无法中英文切换,解决中文和英文无法正常切换问题

                                                                            近日多特小编的电脑系统重装了 安装上搜狗拼音输入法后 使用以前常用按键 ctrl space 切换中英文输入法状态 发现无法切换到英文输入状态 小编从网上寻找解决方法时 发现很多网友都遇到这个问题 网上的解决方法都不能解决问题 于是小编 决
                                                                          • Ubuntu 学习笔记

                                                                            1 实时监视系统log输出 tail f var log syslog 2
                                                                          • 学习 Python 之 Pandas库

                                                                            学习 Python 之 Pandas库 Pandas库 什么是Pandas库 DataFrame 创建和存储 1 使用DataFrame构造函数 1 使用列表创建 2 使用字典创建 3 从另一个DataFrame对象创建 2 从文件读取 1
                                                                          • 【正则表达式】去除首尾空格

                                                                            function Trim str return str replace s s g
                                                                          • 【华为oj】蛇形矩阵

                                                                            问题描述 题目说明 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形 样例输入 5 样例输出 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 接口说明 原型 void GetResult int Num cha
                                                                          • GridLayout 居中显示

                                                                            GridLayout 居中显示 如果大家有使用过GridLayout来给RecyclerView使用 会发现其实是没有居中的 而官方也没有给出居中的方法 这里就讲讲如何让其居中 原理 要做的这一点其实很简单 只要我们自己计算每一个item的
                                                                          • 什么是 CSRF 、原理及其解决方式

                                                                            什么是 CSRF 跨站请求伪造 CSRF Cross site request forgery 也称为 XSRF Sea Surf 或Session Riding 是一个攻击向量 它欺骗 Web 浏览器在登录用户的应用程序中执行不需要的动作
                                                                          • selenium4新版本使用指南

                                                                            提示 本文默认你已经学会使用selenium的旧版本 因此对一些可以直接搜索到很多的内容 你应该是已经学会的 文章目录 前言 一 设置驱动 1 selenium4推荐方法 2 传统方法 二 查找元素 等待元素出现 三 动作API 暂停 pa