You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 示例代码

核心调整点:

  1. 将nativeWebTap设为布尔值True(而非字符串),同时启用autoAcceptAlerts避免系统弹窗干扰
  2. 跳过点击按钮步骤,直接定位文件输入框file-upload,传入本地绝对路径
  3. 用显式等待确保元素处于可交互状态
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# 示例代码

核心调整点:

  1. 配置NativeWebTap为true,添加AutoAcceptAlerts处理系统弹窗
  2. 直接定位文件输入框,使用SendKeys传入绝对路径
  3. 用显式等待保证元素状态
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:55:59