通过系统窗口使用Python Selenium系统上传文件

时间:2019-04-09 15:05:03

标签: python selenium-chromedriver

我正在试用一个网站案例,以学习使用Python Selenium上传文件的方式,其中上传窗口不是HTML的一部分。上载窗口是系统级别的更新。使用JAVA(下面的stackoverflow链接)已经解决了这一问题。如果通过Python无法做到这一点,那么我打算转移到JAVA进行此任务。

但是

亲爱的所有Python爱好者,为什么不可以使用Python webdriver-Selenium。因此,此任务。

在JAVA中已解决以下网址:http://www.zamzar.com/ stackoverflow中的解决方案(和JAVA代码):How to handle windows file upload using Selenium WebDriver?

这是我的Python代码,应该可以自我解释,包括chrome webdriver下载链接。

任务(上传文件),我正在简要尝试: 网站:https://www.wordtopdf.com/

注意_1:我不需要此工具进行任何工作,因为有更好的软件包可以将该词转换为pdf。相反,这只是为了学习和完善Python Selenium代码/应用程序。

注意_2:下载并解压缩chrome驱动程序后,您将需要在下面的代码中输入2条路径(注释中的链接)。这两个路径是:[a](/任何)word文件的路径和[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(How to handle windows file upload using Selenium WebDriver?)中非常相似的内容,这应该像一种魅力。但是Voila ...完全失败,因此有机会学习新知识。

我也尝试过:

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.htmlSelenium-Python: interact with system modal dialogs),“警报”应为内置函数。

但是即使执行了

,我的Python设置中似乎也没有上述链接中的“警报”功能
from selenium import webdriver

@@所有读者,希望这不会花费您太多时间,我们都可以从中学到一些东西。

欢呼

1 个答案:

答案 0 :(得分:0)

您获得('//*[@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()

在Firefox 66 / 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() 用于上传文件(甚至可能有很多文件-我没有测试过)。

Animal & Veterinary