通過 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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
