如何使用 Python 中的 Selenium 在 chrome://downloads 取消下载 3
How to cancel a download at chrome://downloads with Selenium in Python 3
这个问题和
非常相似
我正在尝试将 Selenium 与 Python (3) 结合使用以获取 chrome://downloads 页面上的取消按钮。我的用例是我有一个混淆的 link ,每次用户点击它时都会为其生成一个随机令牌。如果你不点击它,你就无法开始下载(它似乎触发了一段生成令牌的 js,但我没有成功地挖掘代码以弄清楚这是如何发生的)。
为了让我的测试通过,我只需要验证:
- 下载开始(并没有给出 404),并且
- 它尝试下载的文件大小正确。
我尝试完成此操作的方法是通过单击按钮元素触发下载,然后让 Selenium 打开 chrome://downloads,取消下载,并捕获文件大小它试图下载的文件。
理论上这似乎应该可行,障碍是试图访问 chrome://downloads 页面上 #shadow-root 标签中的任何元素。不幸的是,我在上面 link 编辑的另一个问题的解决方案不再有效:
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)
这超出了我的专业领域,如果您能帮助我了解如何使用取消按钮,我们将不胜感激。
请尝试以下操作。
driver.execute_script("document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector("cr-button[focus-type='cancel']").click()")
如果您需要有关如何处理 shadow-root 元素的更多信息,请参阅 . And if you want to work on the downloads then you can refer to 并根据您的要求更新 js。
这个问题和
我正在尝试将 Selenium 与 Python (3) 结合使用以获取 chrome://downloads 页面上的取消按钮。我的用例是我有一个混淆的 link ,每次用户点击它时都会为其生成一个随机令牌。如果你不点击它,你就无法开始下载(它似乎触发了一段生成令牌的 js,但我没有成功地挖掘代码以弄清楚这是如何发生的)。
为了让我的测试通过,我只需要验证:
- 下载开始(并没有给出 404),并且
- 它尝试下载的文件大小正确。
我尝试完成此操作的方法是通过单击按钮元素触发下载,然后让 Selenium 打开 chrome://downloads,取消下载,并捕获文件大小它试图下载的文件。
理论上这似乎应该可行,障碍是试图访问 chrome://downloads 页面上 #shadow-root 标签中的任何元素。不幸的是,我在上面 link 编辑的另一个问题的解决方案不再有效:
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)
这超出了我的专业领域,如果您能帮助我了解如何使用取消按钮,我们将不胜感激。
请尝试以下操作。
driver.execute_script("document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector("cr-button[focus-type='cancel']").click()")
如果您需要有关如何处理 shadow-root 元素的更多信息,请参阅