TypeError:通过Selenium调用Chrome Download Manager的execute_script()时,“ NoneType”对象不可下标

时间:2019-03-28 12:34:46

标签: javascript python selenium google-chrome selenium-chromedriver

我一直在使用此功能https://stackoverflow.com/a/48267887/11220889等待下载完成,并在完成后返回文件路径。到目前为止,它一直运转良好。

功能

def every_downloads_chrome(driver):
    if not driver.current_url.startswith("chrome://downloads"):
        driver.get("chrome://downloads/")
    return driver.execute_script('''
        var items = downloads.Manager.get().items_;
        if (items.every(e => e.state === "COMPLETE"))
            return items.map(e => e.file_url);
        ''')

它怎么称呼

paths = WebDriverWait(driver, 120, 1).until(every_downloads_chrome)

我收到错误

TypeError: 'NoneType' object is not subscriptable

因此,从我可以收集到的信息来看,某些变化已经开始,导致该函数无法返回路径。我相信这是由于chrome或更确切地说是chrome驱动程序发生了变化。我做出此假设的两个原因是:

1)我的同事正在使用的另一个代码中有此功能,她打电话给我,说昨天它产生了此错误。

2)两个代码都没有更改,因此更改必须是chrome

我想继续使用此脚本,但是如果不可能的话,还有另一个函数等待下载完成并返回路径,并且理想情况下是通过驱动程序而不是通过文件路径来完成所有操作,因为多个用户在多台计算机上使用我的代码

编辑:版本-

Name: selenium
Version: 3.141.0

Name: Chrome Browser
Version: 73.0.3683.86

Name: Chrome Driver
Version: 2.43.600210

Name: System
Version: Windows 10 Pro x64

1 个答案:

答案 0 :(得分:1)

根据错误消息:

TypeError: 'NoneType' object is not subscriptable

您的主要问题似乎是所使用的二进制版本之间的不兼容性

  • 您正在使用 chromedriver = 2.43
  • chromedriver=2.43的发行说明中明确提到以下内容:
  

支持 Chrome v69-71

  • 您正在使用 chrome = 73.0
  • ChromeDriver v2.46的发行说明中明确提到以下内容:
  

支持 Chrome v71-73

因此 ChromeDriver v2.43 Chrome浏览器v73.0

之间存在明显的不匹配

解决方案

  • ChromeDriver 升级到当前的ChromeDriver v2.46级别。
  • 保持 Chrome 版本为 Chrome v73 级别。 (as per ChromeDriver v2.46 release notes
  • 通过您的 IDE
  • 清理您的项目工作区重建您的项目,并且仅具有必需的依赖项。
  • 如果您的基本 Web客户端版本太旧,则将其卸载并安装最新版本的 Web客户端 GA。
  • 执行您的@Test
  • 始终在driver.quit()方法内调用tearDown(){},以优雅地关闭和销毁 WebDriver Web Client 实例。

更新

当前GAed Chrome v73 存在一些问题,您可能希望降级为 Chrome v72 。您可以在以下位置找到一些相关的讨论: