有一个同学在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 } 然后我们再来看看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}) 运行效果如下图所示: 获取到了当前鼠标所在的元素的标签和标签里面的文字。 到这里,这个同学需要的功能已经完全实现了。 但可能有聪明的同学会发现,他这个需求是云服务器提供商有问题的。我们能看到至少有三个问题: 实际上,我觉得真正的需求应该是这样的:如果鼠标在网页上面某个元素停留时间超过5秒,那么获取这个元素。 但这样做太费时间了。每次都要等5秒,岂不是带薪摸鱼?那需求能不能改成获取当前鼠标点击的元素呢?如果你实践一下,你会发现,当你点击一个链接的时候,网页自动就跳转到另一个页面去了,并不能获取到你需要的数据。