当前位置: 首页 > 面试题库 >

IEDriverServer使用Selenium将文本发送到搜索字段的速度非常慢

韦修文
2023-03-14
问题内容

我在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所以对于我的所有项目或在每个项目中,我只有一个文件(例如注释掉的部分)?


问题答案:

是的,您没看错。

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

@JimEvans在“屏幕快照”,“
SendKeys”和“六十四位”一文中
提到 ……自IE10发行以来,Internet Explorer驱动程序存在一些问题……

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

深潜

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

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

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

窗户挂钩

所有Windows应用程序中都有一个称为“消息循环”的例程。消息循环重复调用GetMessage
API函数,并处理发送到应用程序的消息,当它们到达其队列时。挂钩是Windows消息处理系统的一项功能,允许开发人员拦截,检查和修改发送到应用程序的消息。通过安装钩子,开发人员可以例如验证某个消息是否已被钩住的窗口处理。或者他们可以修改发送到窗口的消息,以表示操作系统可以执行实际上无法执行的操作。这是一个聪明的机制,但是确实有一些要求,超出了本讨论的范围。

尝试使用 32位IEDriverServer* 可执行文件,而不是 64位IEDriverServer 可执行文件 *

将IEDriverServer.exe放在哪里?

您可以将 IEDriverServer.exe 放在系统内的任何位置, executable_path
并按如下所示通过参数传递二进制文件的绝对位置(Windows OS示例):

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()


 类似资料:
  • null 我想更改该字段并输入任何其他金额。 我标识的Xpath- 第一次输入时是否需要使用第1个xpath..然后在输入500、1000等值时使用第2个xpath? 在每一种方式中,Click工作..但sendkeys不工作。我使用chromedriver执行,使用Selenium版本3.141.59

  • 我在尝试使用后期映射更新对象时遇到以下异常: 原因:org.thymeleaf.exceptions。TemplateProcessingException:异常评估SpringEL表达式:“libro.id”(模板:“formulario-modificar-libros-p”-第18行,第15列) 原因:org.springframework.expression.spel。SpelEvalu

  • 问题内容: 我正在尝试创建一个程序,该程序可以自动在屏幕上搜索文本字段,然后在该文本字段中重复输入一个单词。有没有可以找到文本字段的类?还是可以找到文本字段的任何方式?因为我知道Robot类可以键入文本,所以我只需要将光标移到文本字段上并使用mousePress()和mouseRelease()方法即可。 谢谢 问题答案: 我无法直接为您提供解决方案,但是我弄乱了一些代码,也许可以为您指明正确的方

  • 问题内容: 我正在使用JNDI连接到LDAP活动目录,并且我想搜索名称包含搜索字符串的用户,因此我的搜索方法如下: 这是我与LDAP建立连接的方式: LDAP凭证如下: 为什么搜索需要那么多时间来检索数据?由于广告中只有285个联系人,我可以做些什么来加快搜索速度吗? 问题答案: 解决方案是更改为

  • 在我编写的一个应用程序中,我有一个从Core-Data解析大量数据并将其显示到图形中的过程。在进行此处理时,我最终还将数据写入CSV文件。我创建了一个名为CSVLine的单独类,它有助于创建CSV文件。 对于我的140k测试用例,记录了我的Objective-C代码需要大约12秒才能运行。将类“迁移”到swift后,现在需要280-360秒才能运行。显然我做了一些可怕的事情。 使用仪器,我能够识别

  • 如果我想搜索那些名字中包含巴黎的地方,我会做以下操作: 这样我就能看到所有有巴黎这个名字的地方。 然而,我如何能够搜索到其他标准的地方,如 null 在Cloud Firestore中这甚至是可能的吗?如果没有的话,有没有其他方法可以做到这一点?