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
相关产品推荐
相关产品推荐

