Как отменить загрузку в chrome: // загрузка с Selenium в Python 3 - PullRequest
0 голосов
/ 01 апреля 2020

Этот вопрос очень похож на Веб-драйверу Selenium не удается найти элементы на chrome: // загрузка

Я пытаюсь использовать Selenium с Python (3) чтобы попасть на кнопку отмены на странице chrome: //. Мой пример использования - у меня есть запутанная ссылка, для которой каждый раз, когда пользователь нажимает на нее, генерируется случайный токен. Если вы не нажмете на нее, вы не сможете начать загрузку (кажется, что она запускает кусок js, который генерирует токен, но мне не удалось рыться в коде, чтобы выяснить, как это происходит ).

Чтобы пройти тест, все, что мне нужно, это убедиться, что:

  1. Загрузка начинается (и не дает 404), и
  2. файл, который он пытается загрузить, имеет правильный размер.

Способ, которым я пытаюсь выполнить sh, заключается в том, чтобы запустить загрузку, нажав на элемент кнопки, а затем открыть Selenium * 1029. *: // загружает, отменяет загрузку и фиксирует размер файла, который он пытался загрузить.

Теоретически кажется, что это должно сработать, камень преткновения пытается получить доступ к любым элементам в # shadow- root теги на странице chrome: // загрузки. Решение другого вопроса, который я связал выше, к сожалению, больше не работает:

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)

Это вне моего область знаний, и любая помощь в выяснении, как добраться до кнопки отмены, будет принята с благодарностью.

1 Ответ

0 голосов
/ 01 апреля 2020

Пожалуйста, попробуйте следующее.

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

Если вам нужна дополнительная информация о том, как работать с элементами shadow- root, см. здесь . А если вы хотите работать с загрузками, вы можете обратиться к this и обновить js согласно вашему требованию.

...