IEDriverServer очень медленно отправляет текст с помощью Selenium в поле поиска

Я использую селен и питон в 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, чтобы у меня был только один файл для всех моих проектов или внутри каждого проекта (как в закомментированной части)?


person fabio    schedule 16.01.2019    source источник
comment
Согласно комментариям к обзору, удален ответ и добавлен комментарий: Возможный дубликат stackoverflow.com/questions/27985300/   -  person elworthy    schedule 16.01.2019


Ответы (1)


Да, вы все правильно заметили.

При использовании 64-разрядного IEDriverServer.exe send_keys() поле очень медленно заполняется последовательностью символов.

@JimEvans в статье Скриншоты, SendKeys и Sixty- Four Bits упоминает, что ... есть пара проблем с драйвером Internet Explorer, которые возникли с момента выпуска IE10 ....

В комментариях к обсуждению IE x64 slow typing упоминается, что любое исправление потребует «массивной перестройки бинарных компонентов драйвера IE, [так что] нет (и не будет) временной шкалы» для доставки исправления. Что вызывает эти проблемы? Как они связаны? Почему исправить это так чертовски сложно? Ответы на эти вопросы можно свести к простому ответу: «Windows-хуки».


Глубокое погружение

Когда вы используете IE 10 или выше в 64-разрядной версии Windows, по умолчанию процесс, в котором размещается содержащее окно, включающее хром браузера (адресная строка, кнопки навигации, меню и т. Д.), Является 64-разрядным процессом. Процесс, в котором размещается окно, в котором фактически отображается контент (на каждой вкладке), является 32-битным процессом.

По умолчанию драйвер IE пытается использовать перехватчик Windows для окна рендеринга содержимого, чтобы убедиться, что сообщение о нажатии клавиши обрабатывается должным образом, перед отправкой сообщения о нажатии клавиши. Вот где проблема. Ловушка Windows не установлена, потому что 32-битный процесс (процесс рендеринга контента) не может выполнить 64-битный код. Единственный способ правильно исправить это - создать второй (32-битный) исполняемый файл для ожидания завершения нажатия клавиши. Поскольку это привело бы к масштабной перестройке бинарных компонентов драйвера IE, для этого изменения нет (или не будет) временной шкалы. Это означает, что даже когда вы используете 64-битную Windows, вы, скорее всего, используете 32-битную версию IE для рендеринга контента. Это веский аргумент в пользу продолжения использования 32-разрядной версии драйвера IE для IE 10 и более поздних версий: вы не на самом деле работаете с 64-разрядной версией IE.

Если вы настаиваете на запуске 64-разрядной версии IEDriverServer.exe, у вас есть два возможных решения. Во-первых, вы можете отключить собственные события, установив для возможности «nativeEvents» значение false, используя любой механизм, который для этого предоставляет привязка вашего языка. Более точным обходным путем с точки зрения моделирования ввода было бы включение возможности «requireWindowFocus», хотя она также имеет зависимость обработчика Windows, которая может проявляться другими способами.


Крюк для Windows

Все приложения Windows содержат подпрограмму, которая называется «цикл сообщений». Цикл сообщений неоднократно вызывает функцию API GetMessage и обрабатывает сообщения, отправленные приложению, по мере их поступления в его очередь. Хуки - это функция системы обработки сообщений Windows, которая позволяет разработчику перехватывать, исследовать и изменять сообщение, отправляемое приложению. Установив ловушку, разработчик мог, например, проверить, что определенное сообщение было обработано подключаемым окном. Или они могут изменить сообщение, отправленное в окно, чтобы показать, что операционная система может делать то, чего она на самом деле не может. Это умный механизм, но у него есть несколько требований, которые выходят за рамки нашего обсуждения.


Решение

Вместо исполняемого файла 64-разрядного IEDriverServer попробуйте использовать исполняемый файл 32-разрядного IEDriverServer.


Куда поставить 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()
person DebanjanB    schedule 16.01.2019