Selenium点击按钮触发请求时出现「请求的URL在服务器上未找到」错误
问题分析与解决方案
问题概述
在网站https://www1.mbrace.or.jp/od2/B/dindex.html上执行Selenium代码时,前序步骤(切换frame、选择月份、输入日期)都正常,但点击input类型的「ダウンロード開始」按钮后,页面返回「The requested URL was not found on this server」,代码无报错。
解决思路与步骤
修正Frame切换逻辑
代码中通过src="none.html"定位JYOUframe可能存在问题——该frame的src会随月份选择动态更新,并非固定值。直接通过name属性切换frame更可靠:driver.switch_to.frame("JYOU")点击按钮前,务必确认当前处于正确的frame上下文,避免页面刷新导致上下文丢失。
替换硬编码Sleep为显式等待
不要依赖sleep()等待页面加载,改用显式等待确保元素或表单完全就绪:# 等待按钮所在的表单加载完成 wait.until(EC.presence_of_element_located((By.TAG_NAME, "form")))尝试JavaScript点击按钮
部分场景下,Selenium原生click()会因元素覆盖、JS事件绑定异常失效,改用JS执行点击:driver.execute_script("arguments[0].click();", button)模拟按钮的原生JS事件
查看页面源码,确认按钮的onclick绑定的函数(比如downloadStart()),直接调用该函数触发下载:driver.execute_script("downloadStart();")核对请求参数
手动点击按钮时,通过浏览器开发者工具的「网络」面板查看请求URL和参数,对比代码执行时的请求差异,确保月份、日期等参数正确传递。
修改后的示例代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait, Select from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Edge() url = 'https://www1.mbrace.or.jp/od2/B/dindex.html' driver.get(url) wait = WebDriverWait(driver, 20) # 切换到月份选择frame driver.switch_to.frame("menu") select = Select(wait.until(EC.presence_of_element_located((By.NAME, 'MONTH')))) select.select_by_value('202311') driver.switch_to.default_content() # 切换到日期输入frame driver.switch_to.frame("JYOU") input_day = wait.until(EC.presence_of_element_located((By.NAME, 'MDAY'))) input_day.send_keys('01') # 等待表单就绪 wait.until(EC.presence_of_element_located((By.TAG_NAME, "form"))) # 定位按钮并通过JS点击 button = wait.until(EC.element_to_be_clickable((By.XPATH, '//input[@type="BUTTON" and @value="ダウンロード開始"]'))) driver.execute_script("arguments[0].click();", button)
内容的提问来源于stack exchange,提问作者Ten
相关产品推荐
相关产品推荐

