欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python selenium 發送長文本卡頓問題

系統 1642 0

通過 Python \text{Python} Python 仿真一個 FireFox?or?Chrome \text{FireFox or Chrome} FireFox?or?Chrome 瀏覽器,然后通過 send_keys \text{send\_keys} send_keys 發送數據到 input \text{input} input 文本框,當數據字節數比較小時,完全不會發現任何異常,但是當發送長文本時,會出現卡頓或者阻塞的現象,導致數據的實時性下降了很多。

查看 send_keys \text{send\_keys} send_keys 源碼:

            
              
                def
              
              
                send_keys
              
              
                (
              
              self
              
                ,
              
              
                *
              
              keys_to_send
              
                )
              
              
                :
              
              
                """
    Sends keys to current focused element.

    :Args:
     - keys_to_send: The keys to send.  Modifier keys constants can be found in the
       'Keys' class.
    """
              
              
    typing 
              
                =
              
               keys_to_typing
              
                (
              
              keys_to_send
              
                )
              
              
                if
              
               self
              
                .
              
              _driver
              
                .
              
              w3c
              
                :
              
              
                for
              
               key 
              
                in
              
               typing
              
                :
              
              
            self
              
                .
              
              key_down
              
                (
              
              key
              
                )
              
              
            self
              
                .
              
              key_up
              
                (
              
              key
              
                )
              
              
                else
              
              
                :
              
              
        self
              
                .
              
              _actions
              
                .
              
              append
              
                (
              
              
                lambda
              
              
                :
              
               self
              
                .
              
              _driver
              
                .
              
              execute
              
                (
              
              
            Command
              
                .
              
              SEND_KEYS_TO_ACTIVE_ELEMENT
              
                ,
              
              
                {
              
              
                'value'
              
              
                :
              
               typing
              
                }
              
              
                )
              
              
                )
              
              
                return
              
               self
    

              
                def
              
              
                keys_to_typing
              
              
                (
              
              value
              
                )
              
              
                :
              
              
                """Processes the values that will be typed in the element."""
              
              
    typing 
              
                =
              
              
                [
              
              
                ]
              
              
                for
              
               val 
              
                in
              
               value
              
                :
              
              
                if
              
              
                isinstance
              
              
                (
              
              val
              
                ,
              
               Keys
              
                )
              
              
                :
              
              
            typing
              
                .
              
              append
              
                (
              
              val
              
                )
              
              
                elif
              
              
                isinstance
              
              
                (
              
              val
              
                ,
              
              
                int
              
              
                )
              
              
                :
              
              
            val 
              
                =
              
              
                str
              
              
                (
              
              val
              
                )
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                len
              
              
                (
              
              val
              
                )
              
              
                )
              
              
                :
              
              
                typing
              
                .
              
              append
              
                (
              
              val
              
                [
              
              i
              
                ]
              
              
                )
              
              
                else
              
              
                :
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                len
              
              
                (
              
              val
              
                )
              
              
                )
              
              
                :
              
              
                typing
              
                .
              
              append
              
                (
              
              val
              
                [
              
              i
              
                ]
              
              
                )
              
              
                return
              
               typing

            
          

可以發現 keys_to_typing \text{keys\_to\_typing} keys_to_typing 函數將 value \text{value} value 逐個拆分成字符放到列表中,然后再做其他處理,并不是特別理解他為什么要這樣去做(沒有進一步去探索原因),但是可以肯定的是,當數據量大的時候,這會大大的提高 send_keys \text{send\_keys} send_keys 的時間,繼而造成卡頓的狀況。

解決方案是內嵌 js \text{js} js 進行賦值:

            
              js 
              
                =
              
              
                "element = document.getElementById('text');"
              
               \
	 
              
                "element.value = 'xxx';"
              
              
driver
              
                .
              
              execute_script
              
                (
              
              js
              
                )
              
            
          

這樣便可以避免拆分字符所造成的卡頓問題,但是同樣帶來了一個新的問題——無法使用 selenimu.webdriver.common.keys \text{selenimu.webdriver.common.keys} selenimu.webdriver.common.keys 來觸發事件。因為如上發送文本后并不會觸發任何事件(例如 change \text{change} change 事件),而我們往往會用到這些事件來結束一次輸入刷新數據,所以需要找到對應的觸發方案。

解決這個問題的方法是使用 fireEvents?or?dispatchEvent \text{fireEvents or dispatchEvent} fireEvents?or?dispatchEvent ,前者是在較老或者低級的瀏覽器中可以使用,后者在 FireFox?or?Chrome \text{FireFox or Chrome} FireFox?or?Chrome 中使用。由于我使用的是 FireFox \text{FireFox} FireFox ,所以如下:

            
              js 
              
                =
              
              
                "element = document.getElementById('text');"
              
               \
	 
              
                "element.value = 'xxx';"
              
               \
	 
              
                "event = document.createEvent('HTMLEvents');"
              
               \
	 
              
                "event.initEvent('change', true, true);"
              
               \
	 
              
                "element.dispatchEvent(event);"
              
              
driver
              
                .
              
              execute_script
              
                (
              
              js
              
                )
              
            
          

完美解決發送長文本卡頓的問題,不過如果需要發送很多次數據的時候,上述 js \text{js} js 代碼中有些部分沒必要執行多次,但是由于是內嵌在 Python \text{Python} Python 中,所以么得法子……或者說,我不知道怎么優化,沒有學過 js \text{js} js 也是第一次嘗試嵌到 Python \text{Python} Python 中。

另外,有網友稱也可以通過將數據復制到粘貼板然后直接粘貼到輸入框,未測試。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品无码久久久久久国产 | 奇米4色 | 国产精品久久久久免费 | 一级黄色a视频 | av资源在线天堂 | 国产精品a久久久久 | 草草视频免费在线观看 | 亚洲国产精品综合久久 | 草久网| 国产欧美综合一区二区 | 成人午夜免费剧场 | 欧美在线一区二区三区 | 午夜欧美 | 精品久久久久久久 | 欧美在线视频一区二区 | 亚洲午夜日韩高清一区 | 国产一区 | 久久久久无码国产精品一区 | www.日日操| 日韩精品视频在线观看免费 | 国产成人精品福利网站在线观看 | 欧美一级欧美一级高清 | 亚州 色毛片免费观看 | 亚洲美女视频 | a黄在线观看 | 国产精品极品美女在线观看免费 | 日韩欧美二区 | 国产高清视频在线 | 超久久 | 精品一区二区三区的国产在线观看 | 91视频专区| 久久99久久99精品免观看不卡 | 精品久久久久久久久久久久久久 | 91视频高清| 欧美一区二区免费电影 | 综合网婷婷 | 国产精品久久久久久久免费大片 | 天天爽夜夜爽人人爽 | 日韩精品亚洲人成在线播放 | 久久伊人一区二区三区四区 | 国产一区二区视频在线观看 |