Не удалось загрузить файл с открытой новой вкладкой в ​​режиме без головы на Linux - PullRequest
0 голосов
/ 10 января 2020

Как мне ответить на этот вопрос: Как загружать файлы без заголовка в Selenium (Java), когда загрузка происходит в новой вкладке?

Если кнопка загрузки вызывает действие загрузки в открывшейся новой вкладке , Я переключусь на новую вкладку и отправлю команду (как показано ниже в коде) для загрузки файла.

def enable_download_in_headless_chrome(self, driver, download_path):
    driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
    params = {
        'cmd': 'Page.setDownloadBehavior',
        'params': {'behavior': 'allow', 'downloadPath': download_path}
    }

    driver.execute("send_command", params)

Я обнаружил, что указанный выше метод иногда не удался linux.

Когда драйвер получит ошибку, она будет долго падать. (Я обнаруживаю ситуацию по моей обработке ошибок с повторной попыткой.)

Сообщение об ошибке:

Сообщение: время ожидания
(Информация о сеансе: chrome без головы = 77.0.3865.120)

И я посмотрел на решение с обсуждением проблемы, но никто не может решить его: https://bugs.chromium.org/p/chromium/issues/detail?id=696481

Я думаю, причина root в том, что я отправляю включить команду загрузки перед новой вкладкой в состоянии готовности ?

Пожалуйста, помогите мне найти решение. Спасибо.

Ответы [ 2 ]

1 голос
/ 10 января 2020

, если при нажатии на ссылку для скачивания открывается новая вкладка (например, если она имеет атрибут target="_blank"). В этом случае загрузка в автономном режиме с помощью метода enable_download_in_headless_ chrome, решение не работает. Таким образом, вы можете удалить атрибут target="_blank" с помощью JS или получить href и попытаться загрузить, открыв ссылку в той же вкладке.

, если есть ссылка и открыть в новой вкладке, вы можете открыть в та же вкладка, переписав javascript

def open_link_same_tab_download_file(current_user_driver, element):
    # open element in same tab add target to self
    current_user_driver.execute_script('arguments[0].target="_self"',element)

    # click on element to download file
    current_user_driver.execute_script("arguments[0].click()", element

, если нет атрибута ссылки, тогда вы можете переопределить javascript открытого окна в новой вкладке, как показано ниже

def open_new_tab_download_file(current_user_driver, element):
    # open element in same tab override javascript for that
    current_user_driver.execute_script('window.open = function(url) {window.location=url}')

    # click on element to download file
    current_user_driver.execute_script("arguments[0].click()", element)
0 голосов
/ 14 января 2020

При Linux я обнаружил, что файл будет загружен два раза с помощью приведенного ниже кода:

# Open new tab by clicking download button
download_button.click()
# Switch to new tab
driver.switch_to.window(driver.window_handles[-1])
# Wait for ready state 
WebDriverWait(driver, 60).until(lambda driver: driver.execute_script('return document.readyState') == 'complete')

##### The file will be downloaded to original download path ##### 

# Change download directory
enable_download_in_headless_chrome(driver, download_path)
# Refresh to trigger download behavior again
driver.refresh()

##### The file will be downloaded to your specific path again #####

Если отправить команду «enable download» до состояния готовности, он не сможет успешно изменить каталог загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...