Python Selenium中submit仅调试模式生效问题求助
解决方案:调试模式正常但FromDate参数不被识别的问题
针对你遇到的DevExpress ASPxDateEdit控件在Selenium正常模式下无法识别输入值的问题,以下是几个可行的解决思路:
1. 触发输入框的DOM变更事件
DevExpress的日期控件通常需要手动触发change或blur事件来确认输入值,仅用send_keys可能无法让控件内部更新状态。可以通过模拟按键实现:
from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By url = "https://my.elexys.be/MarketInformation/SpotBelpex.aspx" driver = webdriver.Chrome() driver.get(url) # 等待FromDate输入框可交互 FromDate = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "ctl00$contentPlaceHolder$fromASPxDateEdit"))) FromDate.clear() FromDate.send_keys("01/11/2023") # 模拟TAB键触发失去焦点,让控件确认值 FromDate.send_keys(Keys.TAB) # 同样处理UntilDate UntilDate = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "ctl00$contentPlaceHolder$untilASPxDateEdit"))) UntilDate.clear() UntilDate.send_keys("01/12/2023") UntilDate.send_keys(Keys.TAB) # 等待按钮可点击后提交 ShowData_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "ctl00$contentPlaceHolder$refreshBelpexCustomButton"))) ShowData_button.submit()
2. 使用JavaScript直接设置控件值并触发事件
如果模拟按键无效,可以直接通过JS强制设置输入框的value并触发变更事件:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By url = "https://my.elexys.be/MarketInformation/SpotBelpex.aspx" driver = webdriver.Chrome() driver.get(url) # 等待输入框加载完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, "ctl00$contentPlaceHolder$fromASPxDateEdit"))) # 用JS设置FromDate值并触发change事件 driver.execute_script(""" const fromDate = document.querySelector('[name="ctl00$contentPlaceHolder$fromASPxDateEdit"]'); fromDate.value = '01/11/2023'; fromDate.dispatchEvent(new Event('change')); """) # 同样处理UntilDate driver.execute_script(""" const untilDate = document.querySelector('[name="ctl00$contentPlaceHolder$untilASPxDateEdit"]'); untilDate.value = '01/12/2023'; untilDate.dispatchEvent(new Event('change')); """) # 等待按钮可点击后提交 ShowData_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "ctl00$contentPlaceHolder$refreshBelpexCustomButton"))) ShowData_button.submit()
3. 优化等待逻辑,确保控件完全初始化
调试模式下速度慢,控件有足够时间初始化,正常模式下可能需要等待控件的内部脚本加载完成:
from selenium.webdriver.support.ui import WebDriverWait url = "https://my.elexys.be/MarketInformation/SpotBelpex.aspx" driver = webdriver.Chrome() driver.get(url) # 等待页面JS加载完成(判断document.readyState为complete) WebDriverWait(driver, 15).until(lambda d: d.execute_script('return document.readyState') == 'complete') # 后续操作同方案1或2
4. 尝试替换submit为click方法
部分情况下submit可能不会触发控件的验证逻辑,尝试改用click:
# 等待按钮可点击后点击 ShowData_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "ctl00$contentPlaceHolder$refreshBelpexCustomButton"))) ShowData_button.click()
内容的提问来源于stack exchange,提问作者Jean Marc Canon
相关产品推荐
相关产品推荐

