详解Python Selenium如何获取鼠标指向的元素

 更新时间:2022年03月07日 10:13:07   作者:未闻Code  
这篇文章主要介绍了如何通过Selenium获取当前鼠标指向的元素,本文方法的核心,是借助JavaScript的事件(event)来获取鼠标所在的元素,感兴趣的可以试一试

有一个同学在Gne的群里面咨询如何通过Selenium获取当前鼠标指向的元素,在我讲了方法以后,他过了两天又来问:

那么,我今天就来写一篇文章,具体说说应该怎么操作。

这个方法的核心,是借助JavaScript的事件(event)来获取鼠标所在的元素。然后再把这个元素传递给Selenium。我们先来第一步,不考虑Selenium,只使用JavaScript,如何获取当前鼠标指向的元素呢?

我们首先需要知道在JavaScript中的一个事件句柄,叫做window.onmousemove。默认情况下,它的值是null:

我们可以把它的值修改成一个函数,这个函数接收一个event参数,这样当鼠标在网页上移动的时候,这个函数就会被调用。而event参数是一个对象,这个对象有两个属性.clientX.clientY,分别表示鼠标相当于网页的横坐标和纵坐标:

function track_mouse(event){
 var x = event.clientX, y = event.clientY
 console.log('当前鼠标所在位置的坐标:x=' +  x + 'y=' + y)
}

运行效果如下图所示:

你执行命令以后,只要在页面上移动鼠标,你就会在控制台看到大量的坐标被打印出来。

接下来,既然你有了当前鼠标所在位置的坐标,那么你只需要根据坐标查询到这个元素是什么就可以了。在JavaScript中,有一个函数叫做document.elementFromPoint,就能实现这个效果:

function track_mouse(event){
 var x = event.clientX, y = event.clientY
 var element = document.elementFromPoint(x, y)
  if (!element) {
  return // 当前位置没有元素
 } 
  return element
}

那么,如何把这个参数返回给Selenium呢?其实也非常简单,我们设置一个全局变量window.hovered_element,然后把当前鼠标对应的元素赋值给它。然后在Selenium中,使用.execute_script获取window.hovered_element就可以了。

我们先来看看完整的JavaScript:

window.hovered_element = null
function track_mouse(event){
 var x = event.clientX, y = event.clientY
 var element = document.elementFromPoint(x, y)
  if (!element) {
      window.hovered_element = null
  return // 当前位置没有元素
 } 
  window.hovered_element = element
}
window.onmousemove = track_mouse

然后我们再来看看Selenium中的Python代码:

import time
from selenium.webdriver import Chrome

driver = Chrome('./chromedriver')
driver.get('https://www.kingname.info/')

js = '''
window.hovered_element = null
function track_mouse(event){
 var x = event.clientX, y = event.clientY
 var element = document.elementFromPoint(x, y)
  if (!element) {
      window.hovered_element = null
  return // 当前位置没有元素
 } 
  window.hovered_element = element
}
window.onmousemove = track_mouse
'''

driver.execute_script(js)
while True:
    element = driver.execute_script('return window.hovered_element')
    if element:
        print(f'当前鼠标所在的标签为:{element.tag_name}, 其中的文本内容为:{element.text}')
    time.sleep(1)

运行效果如下图所示:

获取到了当前鼠标所在的元素的标签和标签里面的文字。

到这里,这个同学需要的功能已经完全实现了。

但可能有聪明的同学会发现,他这个需求是有问题的。我们能看到至少有三个问题:

  • 因为window.onmousemove太灵敏了,它的采样时间是毫秒级别的,鼠标稍稍移动一点点就会生成一个事件。但是,一个元素的区域是很大的,在一个元素内部移动鼠标,其实根本没有必要更新window.hovered_element
  • 在Selenium里面,是通过while True每1秒查询一次window.hovered_element,虽然我们已经降低了频率,但大家从上面的图中可以看到,还是会获取到很多重复的数据。这是由于有一些元素非常大,我们鼠标如果在上面慢慢移动,时间会超过1秒,那么Selenium就会重复获取到数据。
  • 由于window.onmousemove的采样时间间隔很小,所以我们可以近似把鼠标的移动看做是连续的移动。因此,这段代码会记录鼠标轨迹路径上面的每一个元素。但实际上,我们并不会对网页上所有的内容都感兴趣,我们只会对特定的内容感兴趣。因此,获取当前鼠标所在位置的元素,其实是一个伪需求,它根本没有什么实际上用处,因为噪声太大了,无用的数据太多了!

实际上,我觉得真正的需求应该是这样的:如果鼠标在网页上面某个元素停留时间超过5秒,那么获取这个元素。

但这样做太费时间了。每次都要等5秒,岂不是带薪摸鱼?那需求能不能改成获取当前鼠标点击的元素呢?如果你实践一下,你会发现,当你点击一个链接的时候,网页自动就跳转到另一个页面去了,并不能获取到你需要的数据。

到此这篇关于详解Python Selenium如何获取鼠标指向的元素的文章就介绍到这了,更多相关Selenium鼠标指向元素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中字典创建、遍历、添加等实用操作技巧合集

    Python中字典创建、遍历、添加等实用操作技巧合集

    这篇文章主要介绍了Python中字典创建、遍历、添加等实用操作技巧合集,本文讲解了字典中常见方法列表、创建字典的五种方法、字典中键值遍历方法等内容,需要的朋友可以参考下
    2015-06-06
  • Pandas中根据条件替换列中的值的四种方式

    Pandas中根据条件替换列中的值的四种方式

    本文主要介绍了Pandas中根据条件替换列中的值的四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • python提取包含关键字的整行数据方法

    python提取包含关键字的整行数据方法

    今天小编就为大家分享一篇python提取包含关键字的整行数据方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 18个Python脚本可加速你的编码速度(提示和技巧)

    18个Python脚本可加速你的编码速度(提示和技巧)

    Python的可读性和设计简单性是其广受欢迎的两个主要原因。文中通过实例给大家介绍的很清楚,本文重点给大家分享18个Python脚本可加速你的编码速度,感兴趣的朋友一起看看吧
    2019-10-10
  • Jupyter Notebook折叠输出的内容实例

    Jupyter Notebook折叠输出的内容实例

    这篇文章主要介绍了Jupyter Notebook折叠输出的内容实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python利用numpy存取文件案例教程

    python利用numpy存取文件案例教程

    这篇文章主要介绍了python利用numpy存取文件案例教程,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Python安装OpenCV的示例代码

    Python安装OpenCV的示例代码

    这篇文章主要介绍了Python安装OpenCV的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Django实现下载超大CSV文件的示例代码

    Django实现下载超大CSV文件的示例代码

    这篇文章主要为大家详细介绍了如何利用 Django 进行大型 CSV 文件的流传输,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Python实战之使用PyQt5构建HTTP接口测试工具

    Python实战之使用PyQt5构建HTTP接口测试工具

    在现代软件开发中,测试接口的有效性与响应情况变得尤为重要,本文将指导构建一个简单的HTTP接口测试工具,使用Python的PyQt5库创建用户界面,并通过requests库发送 HTTP 请求,需要的可以参考下
    2024-11-11
  • Python批量查询关键词微信指数实例方法

    Python批量查询关键词微信指数实例方法

    在本篇文章中小编给大家整理的是关于Python批量查询关键词微信指数实例方法以及相关代码,需要的朋友们可以跟着学习下。
    2019-06-06

最新评论