在做某個測試時,要在文本框中輸入大量的文本,文件內容如下:
"-----BEGIN CERTIFICATE-----\n
MIIBozCCAQwCAQEwDQYJKoZIhvcNAQEFBQAwGjEYMBYGA1UEAwwPY2EtaW50QGFj\n
\"bWUuY29tMB4XDTE2MDMwNzExNTcyOVoXDTI2MDMwNTExNTcyOVowGjEYMBYGA1UE\n“
\"AwwPc2VydmVyQGFjbWUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+\n"
"RI+2JepsS1UuuLNne3sk/1nuLdXsDN/VH1+80tzfijSduFK3c+sg4NNwXsqV3D5Y\n"
"E1Ymi0/fvhRdo7J9yJJNq4ZM42nIgTM5jV9BW8JlE7UHZTUP3YomJcnTjfrsH2U5\n"
"rJPuxvwxJukrDDYqrrS/37Nhrr3UbMUBDETLFGg9BQIDAQABMA0GCSqGSIb3DQEB\n"
"BQUAA4GBACKvFUpVayVWgDGdwZpkr0EgXyifjO36a8IqTA55Bj4/5VLyUt+sCvNz\n"
"6Up64t+akAGPajrDv5IrmwDGYj88fE/vTd1lmCkt8Xi8ODgDhASQYh0lzEQ2nzyU\n"
"L7gyKtPvfZG5BZuf7whrV6y7klGDia9qL4dCmNUbOyRBeJON2DR5\n"
"-----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)})
再看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')); ---粘貼
這里,可以根據實際使用不用的方法來實現