如何在Python/C#的Appium中用nativeWebTap实现文件上传?
Appium + Python/C# 网页文件上传问题
问题详情
在使用Appium结合Python测试https://the-internet.herokuapp.com/upload的文件上传功能时,遇到两个核心问题:
- 页面上的上传按钮("Choose File")无法点击
- 尝试直接通过
send_keys传入文件路径时,抛出**"The object is in an invalid state"**错误
已知Java环境下使用Appium 2.0.0并设置nativeWebTap: true可解决,但该配置在Python/C#环境中无效。以下是尝试过的Python代码(未成功):
capabilities = [ { "browserName": "Safari", "browserVersion": "13", "osVersion" : "Catalina", "os": "OS X ", "sessionName": "grandel test", "buildName": BUILD_NAME, "nativeWebTap": "true", "appiumVersion": "2.0.0" }, ] def get_browser_option(browser): switcher = { "chrome": ChromeOptions(), "firefox": FirefoxOptions(), "edge": EdgeOptions(), "safari": SafariOptions(), } return switcher.get(browser, ChromeOptions()) driver.get("https://the-internet.herokuapp.com/upload") driver.sleep(10) driver.find_element_by.accessibilityId("Choose File").click() WebDriverWait(driver, 30).until(EC.visibility_of_element_located( (By.accessibilityId, 'Choose File'))).click() WebDriverWait(driver, 30).until(EC.visibility_of_element_located( (By.ID, 'file-upload'))).click() WebDriverWait(driver, 30).until(EC.visibility_of_element_located( (By.XPATH, '//*[@id=\"file-upload\"]'))).click() driver.find_element_by.accessibilityId("Choose File").click() driver.find_element_by_id("file-upload").click() o = driver.find_element(By.ID, 'file-upload') o.send_keys("Files/On My iPhone/Chrome/sample") p = driver.find_element(By.XPATH, '//*[@id=\"file-upload\"]') driver.find_element_by_id("file-submit").click() driver.quit()
可行解决方案
Python 示例代码
核心调整点:
- 将
nativeWebTap设为布尔值True(而非字符串),同时启用autoAcceptAlerts避免系统弹窗干扰 - 跳过点击按钮步骤,直接定位文件输入框
file-upload,传入本地绝对路径 - 用显式等待确保元素处于可交互状态
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from appium import webdriver BUILD_NAME = "your-build-name" # 修正capabilities为字典格式,调整参数类型 capabilities = { "browserName": "Safari", "browserVersion": "13", "osVersion": "Catalina", "os": "OS X", "sessionName": "grandel test", "buildName": BUILD_NAME, "nativeWebTap": True, "autoAcceptAlerts": True, "appiumVersion": "2.0.0" } # 初始化driver(根据你的Appium服务地址调整) driver = webdriver.Remote("http://localhost:4723/wd/hub", capabilities) try: driver.get("https://the-internet.herokuapp.com/upload") # 等待文件输入框可交互 file_input = WebDriverWait(driver, 30).until( EC.element_to_be_clickable((By.ID, "file-upload")) ) # 替换为你的本地文件绝对路径,例:/Users/xxx/Documents/sample.txt file_input.send_keys("/absolute/path/to/your/file.txt") # 点击提交按钮 submit_btn = WebDriverWait(driver, 30).until( EC.element_to_be_clickable((By.ID, "file-submit")) ) submit_btn.click() # 可选:验证上传成功 success_msg = WebDriverWait(driver, 30).until( EC.visibility_of_element_located((By.TAG_NAME, "h3")) ) assert "File Uploaded!" in success_msg.text finally: driver.quit()
C# 示例代码
核心调整点:
- 配置
NativeWebTap为true,添加AutoAcceptAlerts处理系统弹窗 - 直接定位文件输入框,使用
SendKeys传入绝对路径 - 用显式等待保证元素状态
using OpenQA.Selenium; using OpenQA.Selenium.Appium; using OpenQA.Selenium.Support.UI; using System; class FileUploadTest { static void Main(string[] args) { AppiumOptions capabilities = new AppiumOptions(); capabilities.AddAdditionalCapability("browserName", "Safari"); capabilities.AddAdditionalCapability("browserVersion", "13"); capabilities.AddAdditionalCapability("osVersion", "Catalina"); capabilities.AddAdditionalCapability("os", "OS X"); capabilities.AddAdditionalCapability("sessionName", "grandel test"); capabilities.AddAdditionalCapability("buildName", "your-build-name"); capabilities.AddAdditionalCapability("nativeWebTap", true); capabilities.AddAdditionalCapability("autoAcceptAlerts", true); capabilities.AddAdditionalCapability("appiumVersion", "2.0.0"); // 初始化driver IWebDriver driver = new AppiumDriver(new Uri("http://localhost:4723/wd/hub"), capabilities); WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); try { driver.Navigate().GoToUrl("https://the-internet.herokuapp.com/upload"); // 等待文件输入框可交互 IWebElement fileInput = wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("file-upload"))); // 替换为你的本地文件绝对路径,Windows示例:C:\\xxx\\sample.txt;Mac示例:/Users/xxx/sample.txt fileInput.SendKeys(@"C:\absolute\path\to\your\file.txt"); // 点击提交 IWebElement submitBtn = wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("file-submit"))); submitBtn.Click(); // 可选:验证上传成功 IWebElement successMsg = wait.Until(ExpectedConditions.ElementIsVisible(By.TagName("h3"))); if (!successMsg.Text.Contains("File Uploaded!")) { throw new Exception("Upload failed"); } } finally { driver.Quit(); } } }
额外注意事项
- 必须使用文件绝对路径,相对路径会导致识别失败
- Mac上的Safari需开启自动化权限:系统偏好设置 → 安全性与隐私 → 隐私 → 自动化,允许Appium控制Safari
- 确保Appium服务正常运行,版本为2.0.0及以上
内容的提问来源于stack exchange,提问作者grandEL-dsouza
相关产品推荐
相关产品推荐

