如何在 Linux 上使用 python 使用 Selenium 上传文件(图像)?

How to upload a file (image) with Selenium using python on Linux?

我想自动上传一个文件到这个网站(这不是我的网站)但是这个网站是在一些 js 框架中创建的(我认为它是反应)。现在我在上传文件时遇到问题,我尝试过的所有方法都不起作用。我使用 Linux(发行版 Manjaro),但无法使用 AutoIT。

这是我试过的。

file_image = 'image.jpg'

#this
uplod_image = browser.find_element_by_xpath('//input[@qa-id="selectFile"]').send_keys(file_image)

#and this
upload_image = browser.find_element_by_class_name("fileUploadBtn_dropzoneElement_38Gmm").send_keys(file_image)

这是经过检查的代码,主要问题是上传是像 div

我经常遇到这个错误...

selenium.common.exceptions.ElementNotInteractableException: Message: Element <div class="fileUploadBtn_dropzoneElement_38Gmm"> is not reachable by keyboard
Stacktrace:
WebDriverError@chrome://remote/content/shared/webdriver/Errors.jsm:183:5
ElementNotInteractableError@chrome://remote/content/shared/webdriver/Errors.jsm:293:5
webdriverSendKeysToElement@chrome://remote/content/marionette/interaction.js:624:13
interaction.sendKeysToElement@chrome://remote/content/marionette/interaction.js:600:11
sendKeysToElement@chrome://remote/content/marionette/actors/MarionetteCommandsChild.jsm:497:24
receiveMessage@chrome://remote/content/marionette/actors/MarionetteCommandsChild.jsm:151:31

知道如何解决这个问题吗?

通常使用 Selenium 上传文件是通过以下方式完成的:

browser.find_element_by_xpath('//input[@type="file"]').send_keys(file_location)

其中 file_location 是本地 PC 上文件的实际绝对路径。
喜欢C:/path_to_file/image.jpg

如果您检查 input 元素,样式属性显示为 display: none; 这就是即使使用有效定位器也无法交互的原因。

您需要将元素的样式更改为 display: block;,然后尝试使用 send_keys()

上传文件

使用java脚本执行器改变样式。

fileupload=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div[qa-id='dropZone']>input[type='file']")))
driver.execute_script("arguments[0].style.display = 'block';",fileupload)
fileupload.send_keys(path/to/file)

希望此代码对您有用。

您需要导入以下库。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By