我在Windows7上使用硒和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
内,所以我所有项目或每个项目内只有一个文件(就像注释掉的部分一样)?
答案 0 :(得分:0)
是的,您没看错。
使用 64位IEDriverServer.exe send_keys()
会非常缓慢地用字符序列填充字段。
@JimEvans在文章Screenshots, SendKeys, and Sixty-Four Bits中提到自IE10发布以来,Internet Explorer驱动程序存在一些问题。
讨论IE x64 slow typing中的评论提到,任何修复都需要“对IE驱动程序的二进制组件进行大规模的重新构造,[因此]没有(或将有)可用的时间表” 修复程序的交付。是什么原因导致这些问题?它们有什么关系?为什么修复如此困难?这些问题的答案都可以用一个简单的答案来概括:“ Windows挂钩”。
在64位版本的Windows上运行IE 10或更高版本时,默认情况下,托管包含浏览器镶边(包含地址栏,导航按钮,菜单等)的包含窗口的进程为64-位过程。托管实际呈现内容的窗口(在每个选项卡中)的进程是一个32位进程。
默认情况下,IE驱动程序尝试在内容呈现窗口上使用Windows挂钩,以确保在发送按键消息之前正确处理了按键消息。这就是问题所在。未安装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消息处理系统的一项功能,允许开发人员拦截,检查和修改发送到应用程序的消息。通过安装一个钩子,开发人员可以例如验证某个消息是否已被钩住的窗口处理。或者他们可以修改发送到窗口的消息,以表示操作系统可以执行实际上无法执行的操作。这是一个聪明的机制,但确实有一些要求,超出了本讨论的范围。
代替 64位IEDriverServer.exe 开始使用 32位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()