代码之家  ›  专栏  ›  技术社区  ›  fabio

iedriverserver使用Selenium非常缓慢地向搜索字段发送文本

  •  1
  • fabio  · 技术社区  · 6 年前

    我在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秒)。而在火狐中几乎是即时的。

    为什么呢?这是正常的吗?我做错什么了?

    还有,把我的iedriverserver.exe放在哪里更好?里面 C:\Python36\Scripts 所以,对于我的所有项目或每个项目中,我只有一个文件(比如在注释掉的部分中)?

    1 回复  |  直到 6 年前
        1
  •  0
  •   undetected Selenium    6 年前

    是的,你观察得很对。

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

    @文章中的吉米文斯 Screenshots, SendKeys, and Sixty-Four Bits 提到 IE10发布后,Internet Explorer驱动程序出现了一些问题。 .

    讨论中的评论 IE x64 slow typing 提到任何修复都需要 “大量重新构建IE驱动程序的二进制组件,[因此]没有可用的时间线。” 用于交付修复程序。这些问题的起因是什么?它们是如何联系的?为什么修复会如此困难?这些问题的答案可以用一个简单的答案来概括: “窗户挂钩。”

    分析

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

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

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

    窗口钩子

    所有Windows应用程序中都有一个称为“消息循环”的例程。消息循环反复调用getmessage api函数,并在消息到达应用程序队列时处理发送到该应用程序的消息。钩子是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()