Да, вы правильно поняли.
Использование 64-битного IEDriverServer.exe send_keys()
заполняет поле с последовательностью символов очень медленно.
@ JimEvans в статье Снимки экрана, SendKeys и шестьдесят четыре бита упоминает Существует несколько проблем с драйвером Internet Explorer, возникших после выпуска IE10 .
Комментарии в обсуждении Медленная типизация IE x64 упоминает, что для любого исправления потребуется "массивная реархитектура двоичных компонентов драйвера IE, [поэтому] временная шкала недоступна (или не будет) доступна" для доставки исправления. Что вызывает эти проблемы? Как они связаны? Почему исправление так чертовски сложно? Все ответы на эти вопросы можно суммировать с простым ответом: «Windows Hooks».
Анализ
Когда вы используете IE 10 или выше в 64-битной версии Windows, по умолчанию процесс, в котором размещается содержащее окно, которое включает в себя браузер Chrome (адресная строка, кнопки навигации, меню и т. Д.), Является 64- немного процесса. Процесс, в котором размещается окно, в котором фактически отображается содержимое (в каждой вкладке), является 32-разрядным процессом.
По умолчанию драйвер IE пытается использовать хук окон в окне визуализации контента, чтобы убедиться, что сообщение о нажатии клавиши должным образом обрабатывается перед отправкой сообщения о ключе. Вот где проблема. Хук Windows не установлен, потому что 32-битный процесс (процесс рендеринга контента) не может выполнить 64-битный код. Единственный способ исправить это - создать второй (32-разрядный) исполняемый файл для ожидания завершения нажатия клавиши. Поскольку это может привести к масштабной реархитектуре двоичных компонентов драйвера IE, временная шкала не доступна (или не будет) для этого изменения. Это означает, что даже когда вы используете 64-битную Windows, вы, скорее всего, используете 32-битную версию IE для визуализации контента. Это мощный аргумент для продолжения использования 32-битной версии драйвера IE для IE 10 и выше: вы не на самом деле работаете с 64-битной версией IE.
Если вы настаиваете на необходимости запуска 64-разрядной версии IEDriverServer.exe, у вас есть два возможных обходных пути. Во-первых, вы можете отключить нативные события, установив для «nativeEvents» значение false, используя любой механизм, предусмотренный для этого вашей языковой привязкой. Более точный обходной путь с точки зрения моделирования ввода - включить возможность «requireWindowFocus», хотя она также имеет зависимость от хука окон, которая может проявляться и другими способами.
Windows Hook
Все приложения Windows содержат подпрограмму, называемую «цикл обработки сообщений». Цикл сообщений повторно вызывает функцию API GetMessage и обрабатывает сообщения, отправленные приложению, по мере их поступления в его очередь. Хуки - это функция системы обработки сообщений Windows, которая позволяет разработчику перехватывать, проверять и изменять сообщение, отправляемое приложению. Установив хук, разработчик может, например, проверить, что определенное сообщение было обработано перехватываемым окном. Или они могли бы изменить сообщение, отправленное в окно, чтобы показать, что операционная система может делать то, что на самом деле не может. Это умный механизм, но у него есть несколько требований, которые выходят за рамки этого обсуждения.
Решение
Вместо 64-битного IEDriverServer.exe начать использовать 32-битный IEDriverServer.exe
Куда положить IEDriverServer.exe?
Вы можете поместить IEDriverServer.exe в любом месте вашей системы и передать абсолютное местоположение двоичного файла через аргумент executable_path
следующим образом (пример ОС Windows):
from selenium import webdriver
driver = webdriver.Ie(executable_path=r'C:\path\to\IEDriverServer.exe')
driver.get("https://www.facebook.com/")
print("Page Title is : %s" %driver.title)
driver.quit()