zoukankan      html  css  js  c++  java
  • 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')); ---粘贴

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

  • 相关阅读:
    AutoCAD 相关的在线多级同步的一些资料收集 beta
    FUSLOGVW 工具来报告错误的具体信息
    [转]阿朱:帮助过我的那些书和人
    Accelerated C++ 习题答案
    一些帮助理解的短视频
    Visual Studio 控制台程序无法输出中文
    [翻译]ObjectArx.Net下Invoke非托管的函数
    LINQ&EF任我行(二)LinQ to Object (转)
    软件编程中的21条法则[转]
    VAssistX的VA Snippet Editor使用小讲 [转]
  • 原文地址:https://www.cnblogs.com/landhu/p/6110445.html
Copyright © 2011-2022 走看看