Python-Selenium-使用 pywinauto 实现 Input 上传文件

当前环境:Win10 + Python3.7 + pywinauto==0.6.8,selenium==3.14.1

示例代码

from pywinauto import Desktop
import os

app = Desktop()
dialog = app['打开']
dialog['Edit'].set_edit_text(os.getcwd() + '.\\example-01.jpg')
dialog['Button'].click()


'''
其他方法:
from pywinauto import application
import os

app = application.Application()
app.connect(title='打开')
# app['Dialog']['Edit1'].type_keys(os.getcwd() + '.\\example-01.jpg')
# app['Dialog']['Edit1'].SetEditText(os.getcwd() + '.\\example-01.jpg')
app['Dialog']['Edit1'].set_edit_text(os.getcwd() + '.\\example-01.jpg')

app['Dialog']['Button1'].click()
'''

参考:

https://mp.weixin.qq.com/s?__biz=MzU1NzgyNDI3NQ==&mid=2247484679&idx=1&sn=a340747f16f0c5697764ede7f448a63d&chksm=fc2ea57bcb592c6da51fd3f186a557ac29994bb78b919c618f17ae10fbbdfb16d7c8230e427a&mpshare=1&scene=1&srcid=1216DMzWHdhTgZYFFbVGZHsW&sharer_shareinfo=c65396678acf6d09bcf06fc57ed0addd&sharer_shareinfo_first=c65396678acf6d09bcf06fc57ed0addd&exportkey=n_ChQIAhIQduawNpbBAqP4iyR8%2FYTAShLyAQIE97dBBAEAAAAAAM%2FgFUW0vVIAAAAOpnltbLcz9gKNyK89dVj0DOxgVp8EciivdLsqOeEOeDn%2FVPMouyiXKMKo40Fk76NmX8%2B9UecOMBQOLNgS3oM3USy95IGseYWfWmx08Blkzlyllc0Fobk7aCaaipck4W8pJ%2BLJX6rD5iywpWQwG6vffOs6llL8yGnU6e30ZjFrjPV9IILsurSLzrVbglwwjtgTOb1FpTslaJw4PK6nBzF4Qos2x0Zj9%2FSFKiEKhPosme7v7ePriXmNDr7iQFaEOlp4p5f69wL9O1BWV0CY6ovevQu2D9r1iYKzjsn1&acctmode=0&pass_ticket=gc%2Bk84qheb1bQ6ScSF35lH7APcEXiU415dFWdmHHbPZqiETZGvHPyD4ZC2OJMHN7hRX2TdXRrFc16LrLv0llyg%3D%3D&wx_header=0#rd

https://mp.weixin.qq.com/s?__biz=MjM5NTU0MDg0MA==&mid=2651267611&idx=1&sn=c1ae1a4a17b1c63c18dc223d8ba23af3&chksm=bd05781c8a72f10a81cf6239044a6354d9137f8e322dcea9383852f90c89fb3b554eb766eb94&mpshare=1&scene=1&srcid=12164RziUu8kd3yryjnvtZbU&sharer_shareinfo=8f38390e1fc6e5b07aaa3bd8c3e68f07&sharer_shareinfo_first=8f38390e1fc6e5b07aaa3bd8c3e68f07&exportkey=n_ChQIAhIQrwmNtaFAKwU0xpCrjCRctRLyAQIE97dBBAEAAAAAAHDQCsJVPy0AAAAOpnltbLcz9gKNyK89dVj0MmfYFIQO3IjAltC9jzxNXjdYR%2F31Ok%2BvtyLtDB6OaZNw%2BGBsHYRd%2BsXSUrbrXLC1ONnJ%2FPAiluSRe0iQILwcgzD8LboFF%2F8YfhIBFIAVsAYDAJfNzFpstvgOkiXf0PZsuw1p%2Bg3M7N25llXF7VQ21%2FDqePZcYMEc7JXRtEfo1%2BkWgf1VJU%2Bp9SA8EuCaSu1Tbb3CXWb0Fy%2FwCDld8LB9zJ%2FppHyc9dG6uIdBES8AiHoZDHwHkYHGvhpjrlf8ZOpDjH%2BsVwa%2BIFR0ulX2&acctmode=0&pass_ticket=gc%2Bk84qheb1bQ6ScSF35lH7APcEXiU415dFWdmHHbPZoefKqE%2BuBGd4YY3MF66ov5%2FCbx0d5wkGWluKyPGNFrA%3D%3D&wx_header=0#rd

https://www.qiniu.com/qfans/qnso-60569025

 

<think>好的,我现在需要帮用户解决如何使用SeleniumPython实现文件上传的问题。用户已经提供了几个站内引用,我需要仔细分析这些引用,并结合自己的知识来给出准确的回答。 首先,用户提到了两种文件上传的情况:一种是使用input标签,另一种是通过Windows系统弹窗。引用[1]和[2]详细说明了input标签的处理方法,直接使用send_keys即可。而引用[3]则介绍了使用pywinauto处理Windows弹窗的方法。引用[4]可能不太相关,因为它是关于使用curl上传的,但用户的需求是Selenium,所以可以暂时忽略。 用户之前的问题中遇到了AttributeError,因为元素定位返回了None。这可能是因为元素未正确找到或者语法问题。现在用户的问题是关于文件上传,需要确保元素定位正确,并且使用正确的方法。 接下来,我需要组织回答结构。根据用户的要求,回答需要分点说明,包括直接上传和Windows弹窗处理两种方法,并提供代码示例。同时,要注意使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$,不过在这个问题中可能用不上数学公式,但需要确保代码块正确。 还要注意用户提到的系统级指令,比如生成相关问题,所以回答最后需要添加相关问题。同时,引用的内容需要在末尾添加引用标识,比如[^1]、[^3]等。 现在,我需要检查代码示例是否符合最新的Selenium语法。用户之前的错误可能是因为使用了旧版的find_element_by_xpath,而Selenium 4推荐使用find_element(By.XPATH, ...),所以应该在代码中更新这一点,避免用户再次遇到同样的问题。 对于Windows弹窗的处理,pywinauto是一个可行的方法,但需要确保用户了解如何安装和使用这个库,可能需要添加相关的安装命令,比如pip install pywinauto。 另外,需要注意路径的处理,比如在send_keys中使用双反斜杠或原始字符串,避免转义错误。例如,element.send_keys(r"D:\test.jpg")。 最后,确保回答结构清晰,分点说明,代码示例正确,并且相关问题与主题相关,比如可能的问题包括如何处理动态元素、其他工具比较等。 总结步骤: 1. 分两种情况说明文件上传的方法。 2. 提供每种方法的代码示例,使用正确的Selenium 4语法。 3. 提示注意事项,如路径处理、等待元素加载。 4. 添加相关问题,帮助用户深入理解。 5. 确保引用正确,符合用户提供的引用内容。</think>通过Selenium实现文件上传主要有两种场景,以下是具体实现方法和Python示例代码: --- ### 一、直接通过`<input type="file">`元素上传(推荐方法) #### 适用场景 当网页文件上传控件使用标准HTML的`<input type="file">`标签时,可直接通过`send_keys()`方法发送文件路径[^1][^2]。 #### Python示例代码 ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("https://example.com/upload") # 定位上传按钮(关键步骤) upload_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//input[@type='file']")) ) # 发送文件绝对路径(注意路径格式) upload_element.send_keys(r"C:\Users\test\Desktop\example.jpg") # 提交表单(可选) driver.find_element(By.ID, "submit-btn").click() ``` #### 注意事项 1. **路径格式**:Windows路径需使用双反斜杠`\\`或原始字符串`r"..."` 2. **显式等待**:通过`WebDriverWait`确保元素加载完成[^2] 3. **隐藏元素**:若元素被隐藏,需通过JavaScript强制显示: ```python driver.execute_script("arguments[0].style.display='block';", upload_element) ``` --- ### 二、通过Windows系统弹窗上传(非标准控件) #### 适用场景 当文件上传触发操作系统原生弹窗时,需借助`pywinauto`等工具模拟键盘操作。 #### Python示例代码 ```python from selenium import webdriver from selenium.webdriver.common.by import By import pywinauto driver = webdriver.Chrome() driver.get("https://example.com/upload") # 点击触发弹窗的按钮 driver.find_element(By.CLASS_NAME, "upload-btn").click() # 使用pywinauto操作弹窗 app = pywinauto.Desktop() dialog = app['打开'] # 根据弹窗标题匹配 dialog["Edit"].set_edit_text(r"C:\Users\test\Desktop\example.jpg") dialog["Button"].click() # 点击"打开"按钮 ``` #### 必要依赖 ```bash pip install pywinauto ``` #### 风险提示 - 仅限Windows系统 - 弹窗标题必须严格匹配(如中文系统为`打开`,英文系统为`Open`) --- ### 三、方法对比 | 方法 | 稳定性 | 跨平台性 | 实现复杂度 | 推荐指数 | |--------------|--------|----------|------------|----------| | 直接发送路径 | ★★★★★ | ★★★★★ | ★★☆☆☆ | 首选方案 | | pywinauto | ★★☆☆☆ | ★☆☆☆☆ | ★★★★☆ | 备用方案 | --- ### 四、扩展优化 1. **动态文件路径**:使用`os.path`处理路径兼容性 ```python import os file_path = os.path.join(os.getcwd(), "test_files", "example.jpg") ``` 2. **多文件上传**:向`<input>`元素发送多个路径(用换行符分隔) ```python upload_element.send_keys("file1.jpg\nfile2.jpg") ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值