Python selenium 发送长文本卡顿问题

通过 Python \text{Python} Python 仿真一个 FireFox&nbs***bsp;Chrome \text{FireFox or Chrome} FireFox&nbs***bsp;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&nbs***bsp;dispatchEvent \text{fireEvents or dispatchEvent} fireEvents&nbs***bsp;dispatchEvent,前者是在较老或者低级的浏览器中可以使用,后者在 FireFox&nbs***bsp;Chrome \text{FireFox or Chrome} FireFox&nbs***bsp;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 中。

另外,有网友称也可以通过将数据复制到粘贴板然后直接粘贴到输入框,未测试。

全部评论

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器->这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题->后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务