web自动化时,sendkeys输入长文本时浏览器响应慢或错误时处理

在做某个测试时,要在文本框中输入大量的文本,文件内容如下:

"-----BEGIN CERTIFICATE-----
MIIBozCCAQwCAQEwDQYJKoZIhvcNAQEFBQAwGjEYMBYGA1UEAwwPY2EtaW50QGFj
"bWUuY29tMB4XDTE2MDMwNzExNTcyOVoXDTI2MDMwNTExNTcyOVowGjEYMBYGA1UE “
"AwwPc2VydmVyQGFjbWUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+ "
"RI+2JepsS1UuuLNne3sk/1nuLdXsDN/VH1+80tzfijSduFK3c+sg4NNwXsqV3D5Y "
"E1Ymi0/fvhRdo7J9yJJNq4ZM42nIgTM5jV9BW8JlE7UHZTUP3YomJcnTjfrsH2U5 "
"rJPuxvwxJukrDDYqrrS/37Nhrr3UbMUBDETLFGg9BQIDAQABMA0GCSqGSIb3DQEB "
"BQUAA4GBACKvFUpVayVWgDGdwZpkr0EgXyifjO36a8IqTA55Bj4/5VLyUt+sCvNz "
"6Up64t+akAGPajrDv5IrmwDGYj88fE/vTd1lmCkt8Xi8ODgDhASQYh0lzEQ2nzyU "
"L7gyKtPvfZG5BZuf7whrV6y7klGDia9qL4dCmNUbOyRBeJON2DR5 "
"-----END CERTIFICATE-----"

在FireFox中使用sendkeys输入时,等待很久后提示

此页面的某个脚本可能正忙,或者已停止响应。您可以立即终止该脚本、在调试器中打开该脚本,或者继续等待该脚本完成

在使用chrome sendkeys后,没有提示错误,但耗时很久。

解决思路:

1、查看问题原因:

看看sendkeys实现原理:

def send_keys(self, *value):
        """Simulates typing into the element.

        :Args:
            - value - A string for typing, or setting form fields.  For setting
            file inputs, this could be a local file path.

        Use this to send simple key events or to fill out form fields::

            form_textfield = driver.find_element_by_name('username')
            form_textfield.send_keys("admin")

        This can also be used to set file inputs.

        ::

            file_input = driver.find_element_by_name('profilePic')
            file_input.send_keys("path/to/profilepic.gif")
            # Generally it's better to wrap the file path in one of the methods
            # in os.path to return the actual path to support cross OS testing.
            # file_input.send_keys(os.path.abspath("path/to/profilepic.gif"))

        """
        # transfer file to another machine only if remote driver is used
        # the same behaviour as for java binding
        if self.parent._is_remote:
            local_file = self.parent.file_detector.is_local_file(*value)
            if local_file is not None:
                value = self._upload(local_file)

        self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': keys_to_typing(value)})
View Code

再看keys_to_typing 可以看出,sendkeys是一个字符一个字符发的,所以在长文本时时间肯定会长,且在firefox中好像还有相关超时限制,这个不得而知了。

既然这样的话,就不用senkeys 来输入文本了。

解决方案二个:

1、使用js来输入

示范代码

js='document.getElementsByTagName("textarea")[0].value="'+lb_cert+"'"
driver.execute_script(js)

因为元素没有id,所以只能用tagName

2、使用复制黏贴方式:

将文本写入粘贴板,然后再发送CTRL+v,快速输入,但需要安装第三方库

至于粘贴板后方法,python里太多库可以支持,这里偷懒,从stackoverflow 拿来一段代码直接使用

import win32clipboard  

def copy(text):
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardText(text, win32clipboard.CF_UNICODETEXT)
    win32clipboard.CloseClipboard()
def paste():
    win32clipboard.OpenClipboard()
    data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
    win32clipboard.CloseClipboard()
    return data

text=u"这里写需要粘贴的文字"
copy(text)  --放入粘贴板
driver.findElements(By.tagname("textarea")).type(Keys.chord(keys.control, 'v')); ---粘贴

这里,可以根据实际使用不用的方法来实现

原文地址:https://www.cnblogs.com/landhu/p/6110445.html