IEDriverServer очень медленно отправляет текст с помощью Selenium в поле поиска - PullRequest
0 голосов
/ 16 января 2019

Я использую селен и питон на Windows7.

Мой код:

import os
from selenium import webdriver

# get the path of IEDriverServer
#dir = os.path.dirname(__file__)
#ie_driver_path = dir + "\IEDriverServer.exe"
ie_driver_path = "C:\Python36\Scripts\IEDriverServer.exe"

# create a new Internet Explorer session
driver = webdriver.Ie(ie_driver_path)
driver.implicitly_wait(30)
driver.maximize_window()

# create a new Firefox session
#driver = webdriver.Firefox()
#driver.implicitly_wait(30)
#driver.maximize_window()

# navigate to the application home page
driver.get("http://demo-store.seleniumacademy.com/")

# get the search textbox
search_field = driver.find_element_by_name("q")
search_field.clear()

# enter search keyword and submit
search_field.send_keys("phones")
search_field.submit()
...

Код работает, но когда открывается, т. Е. Оцифровка «телефонов» идет очень медленно (около 20 секунд). В Firefox вместо этого почти мгновенно.

Почему так? Это нормально? Я что-то не так делаю?

PS: также, где лучше поставить мой IEDriverServer.exe? Внутри C:\Python36\Scripts поэтому у меня есть только один файл для всех моих проектов или внутри каждого проекта (как в закомментированной части)?

1 Ответ

0 голосов
/ 16 января 2019

Да, вы правильно поняли.

Использование 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...