成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:Selenium 如何獲取鼠標指向的元素?

開發 前端
每次都要等5秒,豈不是帶薪摸魚?那需求能不能改成獲取當前鼠標點擊的元素呢?如果你實踐一下,你會發現,當你點擊一個鏈接的時候,網頁自動就跳轉到另一個頁面去了,并不能獲取到你需要的數據。

有一個同學在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秒,豈不是帶薪摸魚?那需求能不能改成獲取當前鼠標點擊的元素呢?如果你實踐一下,你會發現,當你點擊一個鏈接的時候,網頁自動就跳轉到另一個頁面去了,并不能獲取到你需要的數據。

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2021-10-15 21:08:31

PandasExcel對象

2025-05-28 03:15:00

Scrapy數據sleep

2022-06-28 09:31:44

LinuxmacOS系統

2022-03-12 20:38:14

網頁Python測試

2021-12-16 19:04:26

瀏覽器SeleniumChrome

2020-12-04 06:39:25

爬蟲網頁

2023-10-28 12:14:35

爬蟲JavaScriptObject

2024-07-30 08:11:16

2024-07-30 08:16:18

Python代碼工具

2024-11-11 00:38:13

Mypy靜態類型

2021-05-08 19:33:51

移除字符零寬

2021-02-14 22:22:18

格式圖片 HTTP

2024-11-13 09:18:09

2021-04-05 14:47:55

Python多線程事件監控

2020-12-11 06:30:00

工具分組DataFrame

2021-04-12 21:19:01

PythonMakefile項目

2023-10-29 09:16:49

代碼安全命令

2021-05-13 09:01:51

Cloud Flare瀏覽器網站

2020-05-19 13:55:38

Python加密密碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九久久国产精品 | 久久久www成人免费无遮挡大片 | 国产精品成人一区二区三区 | 国产精品国产a级 | 国产免费一区二区 | 欧美综合一区二区三区 | www.日本在线播放 | 国产中文视频 | 婷婷免费视频 | 丝袜美腿一区二区三区动态图 | 欧美国产一区二区 | 九九热在线视频免费观看 | 337p日本欧洲亚洲大胆鲁鲁 | 亚洲网站免费看 | 91在线网站| 欧美激情精品久久久久久 | 日韩色在线 | 精品久久久久久久久久久久 | 国产亚洲一区二区三区 | 久久丝袜视频 | 天堂一区在线 | 黄色毛片一级 | 国产日韩视频在线 | 黄色一级免费 | 国产精品久久久乱弄 | 少妇淫片aaaaa毛片叫床爽 | 99成人在线视频 | 国产精品亚洲一区 | 久久久精品久久 | 色接久久 | 久久久久久久av麻豆果冻 | 国产精品美女久久久久久免费 | 欧美日韩福利视频 | 最新午夜综合福利视频 | 国产精品激情在线 | 在线观看中文字幕视频 | 久操av在线 | 在线免费观看毛片 | 日日夜夜天天 | 欧美激情欧美激情在线五月 | 欧美三级三级三级爽爽爽 |