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

selenium?drag_and_drop不生效的解決辦法

 更新時(shí)間:2023年03月19日 10:42:51   作者:joker_zsl  
本文主要介紹了selenium?drag_and_drop不生效的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

做自動(dòng)化時(shí)發(fā)現(xiàn)用drag_and_drop模擬拖拽沒效果,頁面上只能看到元素source閃了一下,但是并沒有拖拽到元素target上(推測(cè)可能是我用系統(tǒng)頁面在拖拽時(shí)有個(gè)JS效果,但是drag_and_drop模擬拖拽的時(shí)候執(zhí)行太快沒能觸發(fā)JS,所以沒有把這兩個(gè)元素拖拽到一起)。

通過不斷嘗試,終于解決了,這里記錄一下,希望其他人遇到類似情況時(shí)能有所啟發(fā)。方法1是我嘗試的過程;方法2是我看到的另一種方法,雖然試驗(yàn)了下沒效果,但說不定對(duì)其他的拖拽場(chǎng)景是有效的。

方法1:分解drag_and_drop動(dòng)作

從源碼可以看出drag_and_drop的源碼執(zhí)行了兩個(gè)操作,既然直接用drag_and_drop不行,那調(diào)整下這兩個(gè)操作或許可行

    def drag_and_drop(self, source, target):
        """
        Holds down the left mouse button on the source element,
           then moves to the target element and releases the mouse button.
        :Args:
         - source: The element to mouse down.
         - target: The element to mouse up.
        """
        self.click_and_hold(source)
        self.release(target)
        return self

drag_and_drop里有兩個(gè)動(dòng)作:click_and_hold(在source元素上單擊鼠標(biāo)不松開),release(在target元素上釋放點(diǎn)擊狀態(tài)的鼠標(biāo))。中間加一個(gè)鼠標(biāo)移動(dòng)的動(dòng)作是否可行呢?

我把拖拽的流程改成了:

        ActionChains(self.driver).click_and_hold(source).perform()       
        ActionChains(self.driver).move_by_offset(x, y).perform()
        ActionChains(self.driver).release(target).perform()

試驗(yàn)了一下,在執(zhí)行move_by_offset動(dòng)作的時(shí)候能觸發(fā)JS的效果,只不過位移的xy不準(zhǔn)確,觸發(fā)不了另一個(gè)JS,只要計(jì)算好要偏移的位置就好了

最終的實(shí)現(xiàn):

    def drag_and_drop(self):
        source = self.find_element_and_scroll_into_view(source_loc)
        target = self.find_element_and_scroll_into_view(target_loc)
        # 先移動(dòng)一點(diǎn) 觸發(fā)js效果 觸發(fā)后元素變小 重新獲取元素以便能準(zhǔn)確計(jì)算鼠標(biāo)偏移量
        ActionChains(self.driver).click_and_hold(source).move_by_offset(5, 0).perform()
        drag_source = self.find_element(change_source_loc)
 
        x1, x2 = (drag_source.location.get("x"), drag_source.location.get("x") + drag_source.size.get("width"))
        y1, y2 = (drag_source.location.get("y"), drag_source.location.get("y") + drag_source.size.get("height"))
        source_middle_x = (x1 + x2) / 2
        source_middle_y = (y1 + y2) / 2
        x3, x4 = (target.location.get("x"), target.location.get("x") + target.size.get("width"))
        y3, y4 = (target.location.get("y") + 0.5 * target.size.get("height"), target.location.get("y") + target.size.get("height"))
        target_middle_x = (x3 + x4) / 2
        target_middle_y = (y3 + y4) / 2
        x = target_middle_x - source_middle_x
        y = target_middle_y - source_middle_y
 
        ActionChains(self.driver).move_by_offset(x, y).perform()
        ActionChains(self.driver).release(target).perform()

 拖拽效果:

 方法2:使用seletools解決

雖然我試了下沒效果,但是感覺是有用的,這里一并記錄下。

selenium的drag_and_drop方法在某些場(chǎng)景下無效,這是官方很久就已經(jīng)知道的BUG,只不過沒有在源碼中修復(fù),而是提供了單獨(dú)的包,因?yàn)镈avid Burnes(核心 Selenium 提交者)認(rèn)為拖放錯(cuò)誤是一個(gè)webdriver網(wǎng)絡(luò)驅(qū)動(dòng)問題,在Selenium中提供任何暫時(shí)避開網(wǎng)絡(luò)的方法并不是一個(gè)好主意。詳細(xì)內(nèi)容可以閱讀文章「Selenium Drag and Drop Bug Workaround

安裝

pip install seletools

使用

from seletools.actions import drag_and_drop
 
source = driver.find_element(xxx)
target = driver.find_element(xxx)
drag_and_drop(driver, source, target)

到此這篇關(guān)于selenium drag_and_drop不生效的解決辦法的文章就介紹到這了,更多相關(guān)selenium drag_and_drop不生效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作

    Python利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作

    Appium 是一個(gè)開源、跨平臺(tái)的自動(dòng)化測(cè)試工具,用于測(cè)試原生和輕量移動(dòng)應(yīng)用,支持 iOS, Android 和 FirefoxOS 平臺(tái)。本文將利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作,感興趣的可以了解一下
    2022-07-07
  • 用python畫城市輪播地圖

    用python畫城市輪播地圖

    輪播地圖可以在很多方面有實(shí)際應(yīng)用,所以就介紹給大家,并給出個(gè)實(shí)際操作案例,感興趣的朋友可以參考下
    2021-05-05
  • python namedtuple函數(shù)的使用

    python namedtuple函數(shù)的使用

    今天介紹collections里面的一個(gè)好用的小函數(shù): namedtuple函數(shù)(不創(chuàng)類而可以擁有類的便利),例如可以使用object.attribute
    2021-06-06
  • python中文編碼與json中文輸出問題詳解

    python中文編碼與json中文輸出問題詳解

    Python的編碼問題還是很讓人頭疼的,做下筆記幫助別人,也幫助自己,下面這篇文章主要給大家介紹了關(guān)于python中文編碼與json中文輸出問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-08-08
  • Python機(jī)器學(xué)習(xí)之決策樹算法實(shí)例詳解

    Python機(jī)器學(xué)習(xí)之決策樹算法實(shí)例詳解

    這篇文章主要介紹了Python機(jī)器學(xué)習(xí)之決策樹算法,較為詳細(xì)的分析了實(shí)例詳解機(jī)器學(xué)習(xí)中決策樹算法的概念、原理及相關(guān)Python實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-12-12
  • 利用Python爬取微博數(shù)據(jù)生成詞云圖片實(shí)例代碼

    利用Python爬取微博數(shù)據(jù)生成詞云圖片實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于利用Python爬取微博數(shù)據(jù)生成詞云圖片的相關(guān)資料,文中通過示例代碼介紹非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • python使用請(qǐng)求頭部headers處理403錯(cuò)誤

    python使用請(qǐng)求頭部headers處理403錯(cuò)誤

    有時(shí)候請(qǐng)求一個(gè)網(wǎng)頁的時(shí)候,無論是GET請(qǐng)求還是POST請(qǐng)求都訪問不了,并出現(xiàn)403錯(cuò)誤,這是因?yàn)檫@些網(wǎng)頁為了防止惡意采集信息,使用了反爬機(jī)制,本文給大家介紹了python如何使用請(qǐng)求頭部headers處理403錯(cuò)誤,需要的朋友可以參考下
    2024-03-03
  • Pygame庫200行代碼實(shí)現(xiàn)簡易飛機(jī)大戰(zhàn)

    Pygame庫200行代碼實(shí)現(xiàn)簡易飛機(jī)大戰(zhàn)

    本文主要介紹了Pygame庫200行代碼實(shí)現(xiàn)簡易飛機(jī)大戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • OpenCV制作Mask圖像掩碼的案例

    OpenCV制作Mask圖像掩碼的案例

    這篇文章主要介紹了OpenCV制作Mask圖像掩碼的案例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • python人工智能TensorFlow自定義層及模型保存

    python人工智能TensorFlow自定義層及模型保存

    這篇文章主要為大家介紹了python人工智能TensorFlow自定義層及模型保存示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11

最新評(píng)論

永德县| 南靖县| 巴林右旗| 大悟县| 黄龙县| 新河县| 隆子县| 法库县| 汉源县| 邵东县| 龙泉市| 大姚县| 定日县| 吉木萨尔县| 屏东县| 梧州市| 晋城| 慈利县| 南安市| 邵东县| 阜康市| 渝北区| 忻城县| 深州市| 巴彦县| 昌图县| 万年县| 永安市| 邹平县| 柞水县| 波密县| 织金县| 商南县| 旬阳县| 思南县| 凭祥市| 闽清县| 尤溪县| 灵寿县| 新营市| 富平县|