【问题标题】:IEDriverServer sends text very slowly using Selenium to the search fieldIEDriverServer 使用 Selenium 将文本非常缓慢地发送到搜索字段
【发布时间】:2019-01-16 13:10:31
【问题描述】:

我在 windows7 上使用 selenium 和 python。

我的代码:

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 内部,所以我的所有项目或每个项目内部只有一个文件(就像注释掉的部分一样)?

【问题讨论】:

标签: python selenium internet-explorer selenium-iedriver iedriverserver


【解决方案1】:

是的,你没看错。

使用 64 位 IEDriverServer.exe send_keys() 会非常缓慢地使用 字符序列 填充字段。

@JimEvans 在文章Screenshots, SendKeys, and Sixty-Four Bits 中提到...自 IE10 发布以来,Internet Explorer 驱动程序存在一些问题...

IE x64 slow typing 讨论中的评论提到任何修复都需要“对 IE 驱动程序的二进制组件进行大规模重新架构,[所以] 没有(或将)可用的时间表”的修复。是什么导致了这些问题?它们有什么关系?为什么修复会如此困难?这些问题的答案都可以用一个简单的答案来概括:“Windows Hooks”。


深入研究

当您在 64 位版本的 Windows 上运行 IE 10 或更高版本时,默认情况下,托管包含浏览器镶边(地址栏、导航按钮、菜单等)的包含窗口的进程是 64-位过程。承载实际呈现内容的窗口的进程(在每个选项卡内)是一个 32 位进程。

默认情况下,IE 驱动程序会尝试在内容呈现窗口上使用 Windows 挂钩,以确保在发送按键消息之前正确处理按键消息。这就是问题所在。未安装 windows 挂钩,因为 32 位进程(内容渲染进程)无法执行 64 位代码。正确解决此问题的唯一方法是创建第二个(32 位)可执行文件来等待按键完成。由于这将相当于对 IE 驱动程序的二进制组件进行大规模重新架构,因此没有(或将不会)可用于此更改的时间表。这意味着即使您运行的是 64 位 Windows,您也可能使用 32 位版本的 IE 来呈现内容。这是继续为 IE 10 及更高版本使用 32 位版本的 IE 驱动程序的有力论据:您实际上并没有在 64 位版本的 IE 上运行。

如果您坚持必须运行 64 位版本的 IEDriverServer.exe,您有两种可能的解决方法。首先,您可以通过使用您的语言绑定为此提供的任何机制将“nativeEvents”功能设置为 false 来禁用本机事件。从输入模拟的角度来看,更准确的解决方法是启用“requireWindowFocus”功能,尽管这也有一个窗口挂钩依赖项,这可能以其他方式表现出来。


Windows 挂钩

所有 Windows 应用程序中都有一个称为“消息循环”的例程。消息循环重复调用 GetMessage API 函数,并在发送到应用程序的消息到达其队列时对其进行处理。挂钩是 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多