最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python?Selenium如何獲取鼠標(biāo)指向的元素

 更新時(shí)間:2022年03月07日 10:13:07   作者:未聞Code  
這篇文章主要介紹了如何通過Selenium獲取當(dāng)前鼠標(biāo)指向的元素,本文方法的核心,是借助JavaScript的事件(event)來獲取鼠標(biāo)所在的元素,感興趣的可以試一試

有一個(gè)同學(xué)在Gne的群里面咨詢?nèi)绾瓮ㄟ^Selenium獲取當(dāng)前鼠標(biāo)指向的元素,在我講了方法以后,他過了兩天又來問:

那么,我今天就來寫一篇文章,具體說說應(yīng)該怎么操作。

這個(gè)方法的核心,是借助JavaScript的事件(event)來獲取鼠標(biāo)所在的元素。然后再把這個(gè)元素傳遞給Selenium。我們先來第一步,不考慮Selenium,只使用JavaScript,如何獲取當(dāng)前鼠標(biāo)指向的元素呢?

我們首先需要知道在JavaScript中的一個(gè)事件句柄,叫做window.onmousemove。默認(rèn)情況下,它的值是null:

我們可以把它的值修改成一個(gè)函數(shù),這個(gè)函數(shù)接收一個(gè)event參數(shù),這樣當(dāng)鼠標(biāo)在網(wǎng)頁上移動(dòng)的時(shí)候,這個(gè)函數(shù)就會(huì)被調(diào)用。而event參數(shù)是一個(gè)對(duì)象,這個(gè)對(duì)象有兩個(gè)屬性.clientX.clientY,分別表示鼠標(biāo)相當(dāng)于網(wǎng)頁的橫坐標(biāo)和縱坐標(biāo):

function?track_mouse(event){
?var?x?=?event.clientX,?y?=?event.clientY
?console.log('當(dāng)前鼠標(biāo)所在位置的坐標(biāo):x='?+??x?+?'y='?+?y)
}

運(yùn)行效果如下圖所示:

你執(zhí)行命令以后,只要在頁面上移動(dòng)鼠標(biāo),你就會(huì)在控制臺(tái)看到大量的坐標(biāo)被打印出來。

接下來,既然你有了當(dāng)前鼠標(biāo)所在位置的坐標(biāo),那么你只需要根據(jù)坐標(biāo)查詢到這個(gè)元素是什么就可以了。在JavaScript中,有一個(gè)函數(shù)叫做document.elementFromPoint,就能實(shí)現(xiàn)這個(gè)效果:

function?track_mouse(event){
?var?x?=?event.clientX,?y?=?event.clientY
?var?element?=?document.elementFromPoint(x,?y)
??if?(!element)?{
??return?//?當(dāng)前位置沒有元素
?}?
??return?element
}

那么,如何把這個(gè)參數(shù)返回給Selenium呢?其實(shí)也非常簡(jiǎn)單,我們?cè)O(shè)置一個(gè)全局變量window.hovered_element,然后把當(dāng)前鼠標(biāo)對(duì)應(yīng)的元素賦值給它。然后在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?//?當(dāng)前位置沒有元素
?}?
??window.hovered_element?=?element
}
window.onmousemove?=?track_mouse

然后我們?cè)賮砜纯碨elenium中的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?//?當(dāng)前位置沒有元素
?}?
??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'當(dāng)前鼠標(biāo)所在的標(biāo)簽為:{element.tag_name}, 其中的文本內(nèi)容為:{element.text}')
????time.sleep(1)

運(yùn)行效果如下圖所示:

獲取到了當(dāng)前鼠標(biāo)所在的元素的標(biāo)簽和標(biāo)簽里面的文字。

到這里,這個(gè)同學(xué)需要的功能已經(jīng)完全實(shí)現(xiàn)了。

但可能有聰明的同學(xué)會(huì)發(fā)現(xiàn),他這個(gè)需求是有問題的。我們能看到至少有三個(gè)問題:

  • 因?yàn)?code>window.onmousemove太靈敏了,它的采樣時(shí)間是毫秒級(jí)別的,鼠標(biāo)稍稍移動(dòng)一點(diǎn)點(diǎn)就會(huì)生成一個(gè)事件。但是,一個(gè)元素的區(qū)域是很大的,在一個(gè)元素內(nèi)部移動(dòng)鼠標(biāo),其實(shí)根本沒有必要更新window.hovered_element。
  • 在Selenium里面,是通過while True每1秒查詢一次window.hovered_element,雖然我們已經(jīng)降低了頻率,但大家從上面的圖中可以看到,還是會(huì)獲取到很多重復(fù)的數(shù)據(jù)。這是由于有一些元素非常大,我們鼠標(biāo)如果在上面慢慢移動(dòng),時(shí)間會(huì)超過1秒,那么Selenium就會(huì)重復(fù)獲取到數(shù)據(jù)。
  • 由于window.onmousemove的采樣時(shí)間間隔很小,所以我們可以近似把鼠標(biāo)的移動(dòng)看做是連續(xù)的移動(dòng)。因此,這段代碼會(huì)記錄鼠標(biāo)軌跡路徑上面的每一個(gè)元素。但實(shí)際上,我們并不會(huì)對(duì)網(wǎng)頁上所有的內(nèi)容都感興趣,我們只會(huì)對(duì)特定的內(nèi)容感興趣。因此,獲取當(dāng)前鼠標(biāo)所在位置的元素,其實(shí)是一個(gè)偽需求,它根本沒有什么實(shí)際上用處,因?yàn)樵肼曁罅?,無用的數(shù)據(jù)太多了!

實(shí)際上,我覺得真正的需求應(yīng)該是這樣的:如果鼠標(biāo)在網(wǎng)頁上面某個(gè)元素停留時(shí)間超過5秒,那么獲取這個(gè)元素。

但這樣做太費(fèi)時(shí)間了。每次都要等5秒,豈不是帶薪摸魚?那需求能不能改成獲取當(dāng)前鼠標(biāo)點(diǎn)擊的元素呢?如果你實(shí)踐一下,你會(huì)發(fā)現(xiàn),當(dāng)你點(diǎn)擊一個(gè)鏈接的時(shí)候,網(wǎng)頁自動(dòng)就跳轉(zhuǎn)到另一個(gè)頁面去了,并不能獲取到你需要的數(shù)據(jù)。

到此這篇關(guān)于詳解Python Selenium如何獲取鼠標(biāo)指向的元素的文章就介紹到這了,更多相關(guān)Selenium鼠標(biāo)指向元素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中字典創(chuàng)建、遍歷、添加等實(shí)用操作技巧合集

    Python中字典創(chuàng)建、遍歷、添加等實(shí)用操作技巧合集

    這篇文章主要介紹了Python中字典創(chuàng)建、遍歷、添加等實(shí)用操作技巧合集,本文講解了字典中常見方法列表、創(chuàng)建字典的五種方法、字典中鍵值遍歷方法等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • Pandas中根據(jù)條件替換列中的值的四種方式

    Pandas中根據(jù)條件替換列中的值的四種方式

    本文主要介紹了Pandas中根據(jù)條件替換列中的值的四種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • python提取包含關(guān)鍵字的整行數(shù)據(jù)方法

    python提取包含關(guān)鍵字的整行數(shù)據(jù)方法

    今天小編就為大家分享一篇python提取包含關(guān)鍵字的整行數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 18個(gè)Python腳本可加速你的編碼速度(提示和技巧)

    18個(gè)Python腳本可加速你的編碼速度(提示和技巧)

    Python的可讀性和設(shè)計(jì)簡(jiǎn)單性是其廣受歡迎的兩個(gè)主要原因。文中通過實(shí)例給大家介紹的很清楚,本文重點(diǎn)給大家分享18個(gè)Python腳本可加速你的編碼速度,感興趣的朋友一起看看吧
    2019-10-10
  • Jupyter Notebook折疊輸出的內(nèi)容實(shí)例

    Jupyter Notebook折疊輸出的內(nèi)容實(shí)例

    這篇文章主要介紹了Jupyter Notebook折疊輸出的內(nèi)容實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python利用numpy存取文件案例教程

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

    這篇文章主要介紹了python利用numpy存取文件案例教程,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Python安裝OpenCV的示例代碼

    Python安裝OpenCV的示例代碼

    這篇文章主要介紹了Python安裝OpenCV的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Django實(shí)現(xiàn)下載超大CSV文件的示例代碼

    Django實(shí)現(xiàn)下載超大CSV文件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用 Django 進(jìn)行大型 CSV 文件的流傳輸,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Python實(shí)戰(zhàn)之使用PyQt5構(gòu)建HTTP接口測(cè)試工具

    Python實(shí)戰(zhàn)之使用PyQt5構(gòu)建HTTP接口測(cè)試工具

    在現(xiàn)代軟件開發(fā)中,測(cè)試接口的有效性與響應(yīng)情況變得尤為重要,本文將指導(dǎo)構(gòu)建一個(gè)簡(jiǎn)單的HTTP接口測(cè)試工具,使用Python的PyQt5庫(kù)創(chuàng)建用戶界面,并通過requests庫(kù)發(fā)送 HTTP 請(qǐng)求,需要的可以參考下
    2024-11-11
  • Python批量查詢關(guān)鍵詞微信指數(shù)實(shí)例方法

    Python批量查詢關(guān)鍵詞微信指數(shù)實(shí)例方法

    在本篇文章中小編給大家整理的是關(guān)于Python批量查詢關(guān)鍵詞微信指數(shù)實(shí)例方法以及相關(guān)代碼,需要的朋友們可以跟著學(xué)習(xí)下。
    2019-06-06

最新評(píng)論

泸溪县| 上栗县| 河池市| 太仆寺旗| 南华县| 砚山县| 资中县| 栖霞市| 镇江市| 资中县| 突泉县| 前郭尔| 上杭县| 祁连县| 江都市| 雷波县| 苏州市| 永福县| 正宁县| 黔南| 上栗县| 濮阳县| 陇南市| 神木县| 玛沁县| 仁寿县| 江油市| 兴业县| 梁山县| 瑞金市| 淮北市| 哈尔滨市| 集贤县| 运城市| 共和县| 罗田县| 平湖市| 彭阳县| 仙桃市| 荥经县| 化隆|