Использование Selenium с Python и PhantomJS для загрузки файла в файловую систему

Я пытался использовать PhantomJS/Selenium/python-selenium для загрузки файла в файловую систему. Я могу легко перемещаться по DOM и щелкать, наводить курсор и т. д. Однако загрузка файла оказывается довольно проблематичной. Я пробовал безголовый подход с Firefox и pyvirtualdisplay, но это тоже не сработало и было невероятно медленным. Я знаю, что CasperJS позволяет загружать файлы. Кто-нибудь знает, как интегрировать CasperJS с Python или как использовать PhantomJS для загрузки файлов. Очень признателен.


person Encinoman818    schedule 10.09.2014    source источник


Ответы (4)


Несмотря на то, что этот вопрос довольно старый, загрузка файлов через PhantomJS все еще является проблемой. Но мы можем использовать PhantomJS, чтобы получить ссылку для скачивания и получить все необходимые файлы cookie, такие как токены csrf и так далее. И тогда мы можем использовать requests, чтобы загрузить его на самом деле:

import requests
from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get('page_with_download_link')
download_link = driver.find_element_by_id('download_link')
session = requests.Session()
cookies = driver.get_cookies()

for cookie in cookies: 
    session.cookies.set(cookie['name'], cookie['value'])
response = session.get(download_link)

И теперь в response.content должно появиться актуальное содержимое файла. Затем мы можем написать это с помощью open или сделать что угодно.

person valignatev    schedule 27.02.2016

В настоящее время PhantomJS не поддерживает загрузку файлов. Соответствующие проблемы с обходными путями:

Насколько я понимаю, у вас есть как минимум 3 варианта:

  • переключитесь на casperjs (и вы должны оставить здесь python)
  • попробуй с безголовым на xvfb
  • переключиться на обычные безголовые браузеры

Вот еще несколько ссылок, которые тоже могут помочь:

person alecxe    schedule 10.09.2014
comment
Похоже, с тех пор в PhantomJS была добавлена ​​возможность загрузки файлов (включая комментарии на этот счет в теме , на которую вы ссылаетесь к). Однако я не уверен, что в Selenium это представлено простым в использовании способом. - person John Y; 24.06.2015

Мой вариант использования требовал отправки формы для получения файла. Я смог сделать это, используя функцию драйвера execute_async_script().

 js = '''
    var callback = arguments[0];
    var theForm = document.forms['theFormId'];
    data = new FormData();
    data.append('eventTarget', "''' + target + '''"); // this is the id of the file clicked
    data.append('otherFormField', theForm.otherFormField.value);

    var xhr = new XMLHttpRequest();
    xhr.open('POST', theForm.action, true);
'''

for cookie in driver.get_cookies():
    js += ' xhr.setRequestHeader("' + cookie['name'] + '", "' + cookie['value'] + '"); '

js += '''
    xhr.onload = function () {
        callback(this.responseText);
    };
    xhr.send(data);
'''

driver.set_script_timeout(30)
file = driver.execute_async_script(js)
person dnbwise    schedule 20.12.2016

Не возможно таким образом. Вы можете использовать другие альтернативы для загрузки файлов, такие как wget o curl.

Используйте firefox, чтобы найти правильный запрос и селен, чтобы получить значения для этого, и, наконец, используйте «из коробки» для загрузки файла.

curlCall=" curl 'http://www_sitex_org/descarga.jsf' -H '...allCurlRequest....' > file.xml"
subprocess.call(curlCall, shell=True)
person hkeyland    schedule 28.02.2017