我已经使用Selenium编写了一个(Python)脚本,以自动执行Box的某些下载操作(我知道有Box API,但是我正在访问学校资源,并且不确定该API可以与学校的外部认证很好地交互)。该脚本可以在非无头模式下使用Chrome驱动程序运行,但不能在无头模式下使用。
出现问题的步骤是尝试查询下载状态。我认为我的脚本实际上能够正确执行下载:我添加了some code from SO来禁用默认安全设置,以防止以无头模式下载。
我已经使用两种方法(都在Chrome中执行Javascript)成功查询了下载状态:
当我切换到无头模式时,两者都停止工作。
这是我正在使用的实际代码:
# Headless Chrome disables downloads by default (at least as of 2017).
# https://stackoverflow.com/questions/45631715/downloading-with-chrome-headless-and-selenium
def enable_download_in_headless_chrome(driver, download_dir):
# add missing support for chrome "send_command" to selenium webdriver
driver.command_executor._commands["send_command"] = \
("POST", '/session/$sessionId/chromium/send_command')
params = {
'cmd': 'Page.setDownloadBehavior',
'params': {'behavior': 'allow', 'downloadPath': download_dir},
}
return driver.execute("send_command", params)
def get_top_download_state(driver):
"""Call this after running driver.get("chrome://downloads")."""
[state, percent, progress] = driver.execute_script("""
var item = downloads.Manager.get().items_[0];
var state = item.state;
var percent = item.percent;
var progress = item.progressStatusText;
return [state, percent, progress];
""")
return state, percent, progress
第一种方法的错误表明未定义downloads
。第二种方法的错误表明您无法获得shadowRoot
的{{1}}属性(大概是查询选择器什么也没找到)。