【问题标题】:How to cancel a download at chrome://downloads with Selenium in Python 3如何在 Python 3 中使用 Selenium 在 chrome://downloads 取消下载
【发布时间】:2020-07-12 15:50:17
【问题描述】:

这个问题和Selenium webdriver can't find elements at chrome://downloads很像

我正在尝试使用 Selenium 和 Python (3) 来获取 chrome://downloads 页面上的取消按钮。我的用例是我有一个模糊链接,每次用户点击它时都会生成一个随机令牌。如果你不点击它,你就无法开始下载(它似乎触发了一段生成令牌的 js,但我还没有成功地挖掘代码以弄清楚它是如何发生的)。

要通过我的测试,我只需要验证:

  1. 下载开始(并且没有给出 404),并且
  2. 它尝试下载的文件大小合适。

我尝试完成此操作的方法是通过单击按钮元素触发下载,然后让 Selenium 打开 chrome://downloads,取消下载,并捕获它尝试的文件的文件大小下载。

从理论上讲,这似乎应该可行,绊脚石是试图访问 chrome://downloads 页面上#shadow-root 标记中的任何元素。不幸的是,我上面链接的另一个问题的解决方案不再有效:

driver = webdriver.Chrome("chromedriver.exe")
driver.get("chrome://downloads/")

manager = driver.find_element_by_css_selector('body/deep/downloads-manager')
item = manager.find_element_by_css_selector('body/deep/downloads-item')
shadow = driver.execute_script('return arguments[0].shadowRoot;', item)
link = shadow.find_element_by_css_selector('div#title-area>a')

file_url = link.get_attribute("href")

...因为它在项目声明行上失败:

>>> item = manager.find_element_by_css_selector('body/deep/downloads-item')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 430, in find_element_by_css_selector
    return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 659, in find_element
    {"using": by, "value": value})['value']
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"body/deep/downloads-item"}
  (Session info: chrome=80.0.3987.149)

这超出了我的专业领域,如果能帮助我弄清楚如何点击取消按钮,我们将不胜感激。

【问题讨论】:

    标签: python selenium selenium-webdriver selenium-chromedriver shadow-dom


    【解决方案1】:

    请尝试以下。

    driver.execute_script("document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector("cr-button[focus-type='cancel']").click()")
    

    如果您需要更多关于如何处理 shadow-root 元素的信息,请参考here。如果您想进行下载,则可以参考this 并根据您的要求更新 js。

    【讨论】:

    • 哇——非常感谢!我会在早上试试这个。
    • 由于三重嵌套引号导致语法错误,我不得不做一个非常小的改动(将最内层的引号切换为 \x22),但是通过该编辑,它可以很好地工作!再次感谢你帮助我保持理智...... :)
    猜你喜欢
    • 1970-01-01
    • 2019-04-12
    • 2017-11-08
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多