Загрузка файла с помощью type = "button" - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь автоматизировать веб-сайт для выполнения некоторых повседневных задач с помощью python селена. Мне нужно загрузить файл в процессе. Я провел некоторое исследование по этому поводу и понял, что когда люди проверяют кнопку «выбрать файл», он имеет тип «файл». Для меня есть разновидность "кнопки". Поэтому я попытался изменить тип на файл, и все заработало. Но, конечно, мне не нужно каждый раз менять код html. Вот мой код:

brow = driver.find_element_by_xpath('//*[@id="app"]/div[1]/div/div[3]/div/div[3]/div/div/div/div[1]/div/div[2]/form/fieldset/div[1]/div[2]/button').send_keys('/Users/test/Subtitle_1.srt')

Если вам интересно, какую ошибку я получаю, когда запускаю это хорошо, я ничего не получаю и ничего не происходит. Так как это кнопка типа, я попытался нажать на нее, а затем отправить ключи для загрузки файла:

brow = driver.find_element_by_xpath('//*[@id="app"]/div[1]/div/div[3]/div/div[3]/div/div/div/div[1]/div/div[2]/form/fieldset/div[1]/div[2]/button').click()
brow.send_keys('/Users/test/Subtitle_1.srt')

, и это дало мне ошибку:

Traceback (most recent call last):
  File "test.py", line 110, in <module>
    brow.send_keys('/Users/test/Subtitle_1.srt')
AttributeError: 'NoneType' object has no attribute 'send_keys'

Кто-нибудь знает как я могу загрузить файл с помощью кнопки типа?

введите описание изображения здесь

Еще одна вещь, которая поможет вам ответить на мой вопрос, вот код, который работает, он работает только потому, что файл выбора btn содержит type = "file". Не стесняйтесь попробовать код (измените путь к файлу):

#import modules
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
import time
driver =  webdriver.Chrome(executable_path='/Users/test/Desktop/chromedriver')
driver.get('https://cgi-lib.berkeley.edu/ex/fup.html')
time.sleep(2)
driver.find_element_by_xpath('/html/body/form/input[1]').send_keys('/Users/test/Subtitle_1.srt')
time.sleep(2)
driver.find_element_by_xpath('/html/body/form/input[3]').click()

1 Ответ

0 голосов
/ 21 июня 2020

Вы можете использовать такой код:

uploadBtn = driver.find_element_by_xpath('//*[@id="profilePicture"]')
uploadBtn.send_keys(localPathOfFile)

Он отлично работает для меня!

--- РЕДАКТИРОВАТЬ ---

Вы сказали, что когда кнопка тип - это файл, а не кнопка, он работает, поэтому я предлагаю вам это решение.

Он позволяет вам изменить атрибут кнопки.

С идентификатором:

driver.execute_script("document.getElementById('browBtn').setAttribute('type','file');");

Или с XPath:

driver.execute_script("document.evaluate(yourXpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.setAttribute('type','file');");

А вы go от этого

<button id="browBtn" type="button" name="button">Browse</button>

до этого:

<button id="browBtn" type="file" name="button">Browse</button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...