我一直在用这个功能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
最佳答案
根据错误信息:
TypeError: 'NoneType' object is not subscriptable
您的主要问题似乎是您正在使用的二进制文件版本之间的不兼容,如下所示:
- 您正在使用 chromedriver=2.43
- chromedriver=2.43 的发行说明明确提到以下内容:
Supports Chrome v69-71
- 您正在使用 chrome=73.0
- ChromeDriver v2.46 的发行说明明确提到以下内容:
Supports 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 Client 版本太旧,则将其卸载并安装最新的 GA 和发布版本的 Web Client。
- 执行你的
@Test
。 - 始终在
tearDown(){}
方法中调用driver.quit()
以关闭和销毁 WebDriver 和 Web 客户端 实例优雅。
更新
当前 GAed Chrome v73 有一些问题,您可能希望降级到 Chrome v72。您可以在以下位置找到一些相关讨论:
关于javascript - 类型错误 : 'NoneType' object is not subscriptable while invoking execute_script() for Chrome Download Manager through Selenium,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55397792/