日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python selenium 發送長文本卡頓問題

系統 1705 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條評論
主站蜘蛛池模板: 庄浪县| 商都县| 临海市| 东宁县| 彰武县| 海原县| 金川县| 察哈| 临高县| 马边| 嘉鱼县| 石门县| 拜泉县| 郴州市| 曲靖市| 启东市| 金昌市| 双城市| 忻城县| 镇巴县| 井陉县| 宣城市| 师宗县| 石门县| 新郑市| 万安县| 石首市| 弋阳县| 洛宁县| 化隆| 北宁市| 新闻| 陕西省| 汕尾市| 克东县| 泸西县| 建阳市| 革吉县| 上蔡县| 阿合奇县| 益阳市|