Actionchains在selenium中的使用方法

news2024/12/26 23:23:55

今天分享一下selenium最常用的ActionChains的使用,以及碰到的一些问题的解决。

1.selenium解决鼠标悬停的问题

今天抓取某个平台的数据时发现有的数据需要鼠标悬停在上面才能加载出来,于是就想到了使用ActionChains解决悬停的问题,下面是思路和举例:

首先需要定位到需要悬停的元素位置,然后使用ActionChains悬停,我这里使用的是xpath定位,有些网站可能会出现xpath定位不准的的情况,这个时候就需要切换使用css定位,定位到了以后就使用ActionChains中的move_to_element方法实现鼠标的移动,最后加上perform执行所有的操作,下面是使用方法:

 menu = self.wait.until(EC.presence_of_element_located((By.XPATH, ''xpath语法)) # 定位鼠标要悬停的元素
  mouse = ActionChains(self.driver)
  mouse.move_to_element(menu).perform()

2.selenium解决滑块拖动的问题
 

之前的文章中也提到过,使用selenium拖动滑块,这里需要注意的是滑块的拖动如果太快可能就会失败,所以咋拖动之前最好模拟生成一下滑块的轨迹,然后再去拖动,这里举个实例:

def get_list_x(self):
      """
      的到滑块轨迹
      :param distance:
      :param t:
      :return:
      """
      times = [1, 1.1, 1.3, 1.4, 1.7, 1.5, 1.8, 0.9, 1.6]
      t = random.choice(times)
      track = []
      current = 0
      mid = 258 * t / (t + 1)
      v = 0
      while current < 258:
          if current < mid:
              a = 3
          else:
              a = -1
          v0 = v
          v = v0 + a * t
          move = v0 * t + 1 / 2 * a * t * t
          current += move
          track.append(round(move))
      return track
  def check_block(self, data, listx):
      """
      检测滑块
      :return:
      """
      try:
          while '亲,请拖动下方滑块完成验证' in data:
              action = ActionChains(self.driver)
              hk_button = self.driver.find_element(By.XPATH, '//*[@id="nc_1_n1z"]')
              for x in listx:
                  action.click_and_hold(hk_button)
                  action.move_by_offset(xoffset=x, yoffset=random.randint(0, 2))
                  action.perform()
                  action.release()
              time.sleep(1)
              self.driver.refresh()
              time.sleep(1)
      except:
          time.sleep(1)

这里我定义了两个函数,一个用于检测滑块,另外一个用于滑块的拖动,这里需要注意的是,在我之前的文章分享中我是使用的drag_and_drop_by_offset方法拖动,这里却是使用move_by_offset,这是因为move_by_offset能实现连续的拖动,但是drag_and_drop_by_offset却只能实现拖动到指定的位置后松开,这就很容易会被检测出来是爬虫。

3.selenium中ActionChains的详细使用方法

·click(on_element=None) ——单击鼠标左键

· click_and_hold(on_element=None) ——点击鼠标左键,不松开

· context_click(on_element=None) ——点击鼠标右键

· double_click(on_element=None) ——双击鼠标左键

· drag_and_drop(source, target) ——拖拽到某个元素然后松开

· drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开

· key_down(value, element=None) ——按下某个键盘上的键

· key_up(value, element=None) ——松开某个键

· move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标

· move_to_element(to_element) ——鼠标移动到某个元素

· move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置

· perform() ——执行链中的所有动作

· release(on_element=None) ——在某个元素位置松开鼠标左键

· send_keys(keys_to_send) ——发送某个键到当前焦点的元素

· send_keys_to_element(element, keys_to_send) ——发送某个键到指定元素

4.使用selenium时遇到的问题

之前的文章里面有分享过可以去看看,无非是Chromedriver的版本问题以及定位的问题,定位的问题上面提到过了,xpath不行就换css定位,一般来说css定位的准确性还是很高的,另外selenium中也有其他的定位方法,例如根据Class和ID定位的,chromdriver的问题之前的文章里有提到怎么下载对应版本的Chromedriver。

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

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

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

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

相关文章

计算机组成原理 | 第九章:控制单元的功能 | 微操作命令 | 时钟周期

文章目录&#x1f4da;微操作命令的分析&#x1f407;取指周期&#x1f407;间址周期&#x1f407;执行周期&#x1f955;非访存指令&#x1f955;访存指令⭐️&#x1f955;转移指令&#x1f407;中断周期&#x1f4da;控制单元的功能&#x1f407;控制单元的外特性&#x1f9…

分享微信报名小程序怎么做_瑜伽健身房培训报名小程序开发介绍

活动报名收费签到小程序&#xff0c;支持个人免费组织报名收款和现场签到。随时随地管理活动、发布活动、查看收入明细提现资金更效率。 活动报名收费签到小程序主要功能有&#xff1a; 在线报名&#xff1a;通过二维码或链接分享活动入口&#xff0c;亦可轻松放进入公众号。 …

客户端通过SSH连接Linux服务器超时问题解决方法汇总

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

Windows无法进入睡眠模式怎么办?

睡眠模式是电脑的一种低功耗模式&#xff0c;能减少耗电。当你要离开电脑一阵&#xff0c;但又不想关闭文档和程序&#xff0c;就可以选择让电脑暂时休眠。 如果你的电脑无法进入睡眠模式&#xff0c;可以尝试下面几种方法&#xff1a; 更换电源选项检查电源命令使用电源疑难…

开源机器学习软件对AI的发展意味着什么?

作者&#xff5c; Max Langenkamp OneFlow编译 翻译&#xff5c;徐佳渝、杨婷 为什么要关注机器学习开源软件&#xff08;MLOSS&#xff09;&#xff1f;在我们看来&#xff0c;MLOSS对AI发展来说举足轻重&#xff0c;但未获重视。 机器学习开源软件是开源许可下发布的专为机器…

“易”起涨知识|人人都在追捧的低代码开发,到底有什么优势?

低代码的根本价值在于&#xff1a;劳动力转移。运营、产品能 cover 部分开发工作&#xff0c;实现研发流左移&#xff0c;敏捷迭代。 劳动力转移只是表面&#xff0c;低代码价值还是归属于自动化了信息传递。 产品用文字和交互图&#xff08;PRD&#xff09;表达了一遍完整的产…

List、Set、Map的区别

List、Set、Map的区别 ​ &#xff08;图一&#xff09; 1.面试题&#xff1a;你说说collection里面有什么子类。 &#xff08;其实面试的时候听到这个问题的时候&#xff0c;你要知道&#xff0c;面试官是想考察List&#xff0c;Set&#xff09; 正如图一&#xff0c;lis…

一文深入分析arm64 cache机制

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 先来看一下经典的存储器层次结构图&#xff1a; 不同存储器技术的访问时间差异很大&#xff0c;CPU和主存…

2023年深圳前端培训机构排名,评价较高的机构分享

深圳前端培训机构排行榜的前三名是哪家呢&#xff1f;不少学生在选择学习前端开发的时候&#xff0c;都会通过网络来找一些相关的排行&#xff0c;评判哪家机构的教学比较好&#xff0c;今天小编就来针对这类相关的培训为大家分享一些内容&#xff0c;帮助大家选择更适合自己的…

RabbitMQ面试知识点总结

1.消息模式 P2P Worker Pub/Sub(exchange 4种) 四种交换机&#xff1a;direct/topic/headers/fanout&#xff0c;默认交换机是direct&#xff0c;其中Publish/Subscribe&#xff0c;Routing&#xff0c;Topics三种模式可以统一归为Exchange模式&#xff0c;只是创建时交换机的…

【LeetCode每日一题】【2023/2/1】2325. 解密消息

文章目录2325. 解密消息方法1&#xff1a;哈希表2325. 解密消息 LeetCode: 2325. 解密消息 简单\color{#00AF9B}{简单}简单 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第…

SpringBoot 监控统计(SQL监控、慢SQL记录、Spring监控、去广告)

1 基本概念Druid 是Java语言中最好的数据库连接池。虽然 HikariCP 的速度稍快&#xff0c;但是&#xff0c;Druid能够提供强大的监控和扩展功能 &#xff0c;也是阿里巴巴的开源项目。Druid是阿里巴巴开发的号称为监控而生的数据库连接池&#xff0c;在功能、性能、扩展性方面&…

算法---冗余连接

题目 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges &#xff0c;edge…

蓝桥杯2022 python C组

蓝桥杯2022 python C组 跟之前的就四题不一样 第二题&#xff1a;特殊时间 就是i 从0-9&#xff0c;j从0-9 i是三个一样的&#xff0c;然后看看他们能不能成为 年 月日 时分 成为年只要大于0就好了&#xff0c;称为月日的话月要从1-12&#xff0c;日呢&#xff0c;特殊的日子…

Kylin入门实战(数据源添加 + Model定义 + Cube构建 + 结果查询 + 查询限制)

目录1. 入门实战目的2. Hive源数据准备3. 创建project并添加Hive数据源4. 定义model5. 定义Cube6. 构建cube7. 查询cube构建后的结果8. 查询限制1. 入门实战目的 实现从不同的维度统计员工的工资&#xff0c;例如从岗位类型、员工年龄、部门等不同维度&#xff0c;进行多维度的…

【LeetCode每日一题】【2023/1/30】1669. 合并两个链表

文章目录1669. 合并两个链表方法1&#xff1a;模拟1669. 合并两个链表 LeetCode: 1669. 合并两个链表 中等\color{#FFB800}{中等}中等 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。 请你将 list1 中下标从 a 到 b 的全部节点都删除&#xff0…

亚信科技通信、交通行业数据库项目入选“星河”标杆、优秀案例

近日&#xff0c;由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织的第六届大数据“星河”案例评选结果公示&#xff0c;亚信科技及旗下亚信安慧支持完成的中国移动通信集团上海有限公司“业务支撑系统核心数据库…

Day 17 springboot 监听机制

1 Java 监听机制springboot监听机制&#xff0c;其实是对java提供的事件监听机制的封装。Java中的事件监听机制定义了以下几个角色&#xff1a;事件&#xff1a;Event&#xff0c;继承EventObject类&#xff0c;例如点击&#xff0c;拖动等等。事件源&#xff1a;Source&#x…

Python 正确重写运算符(重载)

运算符重载的作用是让用户定义的对象使用中缀运算符&#xff08;如和|&#xff09;和一元运算符&#xff08;如-和~&#xff09;。在Python中&#xff0c;这些也算是运算符&#xff1a;函数调用&#xff1a;()属性访问&#xff1a;.元素访问和切片&#xff1a;[]运算符重载基础…

RabbitMQ消息转换器

文章目录RabbitMQ消息转换器RabbitMQ消息转换器 在SpringAMQP的发送方法中&#xff0c;发送消息和接受消息的类型都是Object&#xff0c;也就是说&#xff0c;我们可以发送任意对象类型的消息&#xff0c;SpringAMQP都会帮我们把发送的消息序列化为字节后再进行发送。下面&…