为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
素胚勾勒不出你 2022-01-05 10:12:17
我正在使用一个试用网站案例来学习使用 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 webdriverUNZIPPED_DRIVER_PATH = 'C:/Users/....' # You need to specify this on your computerdriver = 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 peaceFind_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 computerFind_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@所有读者,希望这不会占用您太多时间,我们都可以从中学到一些东西。
查看完整描述

1 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

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


查看完整回答
反对 回复 2022-01-05
  • 1 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信