Загрузка файла с использованием Python Selenium System через системное окно - PullRequest
0 голосов
/ 09 апреля 2019

Я использую пробный веб-сайт, чтобы научиться загружать файлы с помощью Python Selenium, где окно загрузки не является частью HTML.Окно загрузки является обновлением системного уровня.Это уже решено с использованием JAVA (ссылка (и) на stackoverflow ниже).Если это невозможно через Python, я собираюсь перейти на JAVA для этой задачи.

НО,

Дорогие все мои коллеги, любители Python, почему это не должно быть возможно с помощью Python webdriver-Selenium.Отсюда этот квест.

Решено в JAVA для URL: http://www.zamzar.com/ Решение (и код JAVA) в stackoverflow: Как обрабатывать загрузку файлов Windows с помощью Selenium WebDriver?

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

Задача (загрузка файла) Я пытаюсь вкратце: Веб-сайт: https://www.wordtopdf.com/

Примечание_1: мне не нужен этот инструмент для какой-либо работы, так как есть гораздо лучшие пакеты для этого словав PDF преобразование.Вместо этого это просто для изучения и полировки кода / приложения Python Selenium.

Примечание_2: Вам придется тщательно ввести 2 пути в мой код ниже после загрузки и разархивирования драйвера chrome (ссылка ниже в комментариях).2 пути: [a] путь к файлу (/ любому) слова и [b] путь к разархивированному драйверу Chrome.

Мой код:


from selenium import webdriver
UNZIPPED_DRIVER_PATH = 'C:/Users/....' # You need to specify this on your computer

driver = webdriver.Chrome(executable_path = UNZIPPED_DRIVER_PATH)

# Driver download links below (check which version of chrome you are using if you don't know it beforehand):
# Chrome Driver 74 Download: https://chromedriver.storage.googleapis.com/index.html?path=74.0.3729.6/
# Chrome Driver 73 Download: https://chromedriver.storage.googleapis.com/index.html?path=73.0.3683.68/
New_Trial_URL = 'https://www.wordtopdf.com/'

driver.get(New_Trial_URL)
time.sleep(np.random.uniform(4.5, 5.5, size = 1)) # Time to load the page in peace

Find_upload = driver.find_element_by_xpath('//*[@id="file-uploader"]')

WORD_FILE_PATH = 'C:/Users/..../some_word_file.docx' # You need to specify this on your computer

Find_upload.send_keys(WORD_FILE_PATH) # Not working, no action happens here

На основе чего-то оченьаналогично в JAVA ( Как обработать загрузку файлов Windows с помощью Selenium WebDriver? ), это должно работать как чудо.Но вуаля ... полный провал и, следовательно, шанс узнать что-то новое.

Я также попробовал:

Click_Alert = Find_upload.click()
Click_Alert(driver).send_keys(WORD_FILE_PATH)

Не сработало.«Оповещение» должно быть встроенной функцией согласно этим двум ссылкам (https://seleniumhq.github.io/selenium/docs/api/py/webdriver/selenium.webdriver.common.alert.html & Selenium-Python: взаимодействовать с модальными диалоговыми окнами системы ).

Но функция 'Alert' в приведенной выше ссылке, похоже, не существует в моей настройке Python даже после выполнения

from selenium import webdriver

@ Все читатели, надеюсь, это не займет многовашего времени, и мы все узнаем что-то из этого.

Приветствия

1 Ответ

0 голосов
/ 09 апреля 2019

Вы получаете ('//*[@id="file-uploader"]'), который является <a> тегом

, но есть скрытый <input type="file"> (позади <a>), который вы должны использовать

import selenium.webdriver

your_file = "/home/you/file.doc"
your_email = "you@example.com"

url = 'https://www.wordtopdf.com/'

driver = selenium.webdriver.Firefox()
driver.get(url)

file_input = driver.find_element_by_xpath('//input[@type="file"]')
file_input.send_keys(your_file)

email_input = driver.find_element_by_xpath('//input[@name="email"]')
email_input.send_keys(your_email)

driver.find_element_by_id('convert_now').click()

Протестировано с Firefox66 / Linux Mint 19.1 / Python 3.7 / Selenium 3.141.0


РЕДАКТИРОВАТЬ: Тот же метод для загрузки на zamzar.com

Ситуация, с которой я столкнулся в первый раз (так что создание решения заняло у меня больше времени): <input type="file"> скрыто под кнопкой, но оно не использует его для загрузки файла.Он динамически создает второй <input type="file">, который использует для загрузки файла (или, может быть, даже много файлов - я не проверял это).

import selenium.webdriver
from selenium.webdriver.support.ui import Select
import time


your_file = "/home/furas/Obrazy/37884728_1975437959135477_1313839270464585728_n.jpg"
#your_file = "/home/you/file.jpg"
output_format = 'png'

url = 'https://www.zamzar.com/'
driver = selenium.webdriver.Firefox()
driver.get(url)

#--- file --- 

# it has to wait because paga has to create second `input[@type="file"]`
file_input = driver.find_elements_by_xpath('//input[@type="file"]')
while len(file_input) < 2:
    print('len(file_input):', len(file_input)) 
    time.sleep(0.5)
    file_input = driver.find_elements_by_xpath('//input[@type="file"]')

file_input[1].send_keys(your_file)

#--- format ---

select_input = driver.find_element_by_id('convert-format')      
select = Select(select_input)
select.select_by_visible_text(output_format)

#--- convert ---

driver.find_element_by_id('convert-button').click()

#--- download ---

time.sleep(5)

driver.find_elements_by_xpath('//td[@class="status last"]/a')[0].click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...