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

我正在使用一个试用网站案例来学习使用 Python Selenium 上传文件,其中上传窗口不是 HTML 的一部分。上传窗口是系统级更新。这已经使用 JAVA 解决了(下面的 stackoverflow 链接)。如果这无法通过 Python 实现,那么我打算转而使用 JAVA 来完成这项任务。


但,


亲爱的所有 Python 爱好者,为什么不能使用 Python webdriver-Selenium。因此这个追求。


在 JAVA 中解决 URL:http ://www.zamzar.com/ stackoverflow 中的解决方案(和 JAVA 代码):如何使用 Selenium WebDriver 处理 windows 文件上传?


这是我的 Python 代码,应该是不言自明的,包括 chrome webdriver 下载链接。


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


Note_1:我不需要这个工具来做任何工作,因为有更好的包来做这个 word 到 pdf 的转换。相反,这仅用于学习和完善 Python Selenium 代码/应用程序。


Note_2:下载并解压 chrome 驱动程序后,您将不得不在下面的代码中煞费苦心地输入 2 个路径(下面的评论中的链接)。这 2 个路径是:[a] a(/any) 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?),这应该很有魅力。但是瞧……完全失败,因此有机会学习新东西。


我也试过:


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:与系统交互模态对话框)。


但是即使在执行后,上面链接中的“警报”功能似乎也不存在于我的 Python 设置中


from selenium import webdriver

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


素胚勾勒不出你
浏览 259回答 1
1回答

MMMHUHU

你得到('//*[@id="file-uploader"]')哪个是<a>标签但是你必须使用隐藏的<input type="file">(后面<a>)import selenium.webdriveryour_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.webdriverfrom selenium.webdriver.support.ui import Selectimport timeyour_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 ---&nbsp;# 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:&nbsp; &nbsp; print('len(file_input):', len(file_input))&nbsp;&nbsp; &nbsp; time.sleep(0.5)&nbsp; &nbsp; 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')&nbsp; &nbsp; &nbsp;&nbsp;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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go