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

Selenium图片上传失败:点击提交后页面无法访问求助

Selenium图片上传提交后显示“无法访问”的排查思路

问题背景

HTML表单代码:

<form enctype='multipart/form-data' method='post' action='./upload_ss.cgi'>
    <h1>Upload a new photo here</h1>
    <br>
    Allowed files:<br>
    <ul>
        <li>Format: PNG</li>
        <li>Maximum resolution: 1366 x 768 </li>
    </ul>
    <input type='hidden' name='csrf_token' value='qxASP72Kg4RFVpSHyCt0_zFA8CYkSB9Rc89bVx8mFHc.'>
    <input type='file' name='file' accept='image/*' style='width:100%'>
    <br>
    <br>
    <input type='submit' name='file' value='Upload File' style='width:100%'>
</form>

Python代码:

self.form_screen = self.wait.until(EC.presence_of_element_located((By.XPATH,'//form[@action="./upload_ss.cgi"]')))

#Inserting the picture
self.change_picture = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'input[name="file"][accept="image/*"]')))
self.change_picture.send_keys(picture1_path)
time.sleep(4)
self.button_picture = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="content"]/section[2]/form/input[3]')))
self.button_picture.click()
self.wait.until(EC.staleness_of(self.form_screen))

执行send_keys正常,但点击提交后页面显示“无法访问”,以下是排查思路:

  • 优化提交按钮定位逻辑
    当前用的//*[@id="content"]/section[2]/form/input[3]依赖元素位置索引,一旦页面结构调整就会定位错误。建议改用更稳定的定位方式,比如通过类型和属性匹配:

    self.button_picture = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[type="submit"][name="file"]')))
    
  • 验证CSRF Token有效性
    表单包含CSRF Token字段,若页面加载后会话超时、或操作过程中页面隐性刷新,可能导致Token失效。可以在提交前重新获取当前页面的Token值,确认是否和初始加载的一致;或者直接通过表单元素提交(而非点击按钮),确保Token被正确携带:

    self.form_screen.submit()
    
  • 检查文件本身及路径合法性
    确认picture1_path是绝对路径,且文件存在、格式为PNG、分辨率不超过1366x768。部分服务器会因文件不符合要求返回错误,导致页面跳转失败。

  • 替换硬编码等待为智能等待
    time.sleep(4)无法保证文件上传完成或页面状态就绪,建议替换为等待文件输入框的value属性变化,确认文件已被正确加载:

    self.wait.until(lambda driver: self.change_picture.get_attribute('value') != '')
    
  • 排查请求拦截或反爬机制
    部分网站会检测Selenium特征(如navigator.webdriver标识)并拦截请求。可以给浏览器添加参数规避检测,以Chrome为例:

    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options)
    
  • 查看网络请求详情
    打开浏览器开发者工具的Network面板,观察提交表单时的请求状态码和响应内容:

    • 若返回403:大概率是CSRF验证失败
    • 若返回500:可能是服务器端处理文件出错(如格式、分辨率不达标)
    • 若返回404:确认action属性中的./upload_ss.cgi路径是否正确,是否存在相对路径解析问题

内容的提问来源于stack exchange,提问作者Antonio J'unior

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:35:59