Selenium+Python:点击提交后浏览器自动返回初始页的解决办法
问题描述
我尝试在页面填写信息:选择日期、球员人数、地点后点击提交。以下代码能完成这些操作,但点击提交按钮后,新页面短暂打开后立即返回原页面(所有填写字段重置,类似刷新)。试过用ActionChains按住Ctrl点击提交按钮以在新标签页打开,但未成功;也试过多种脚本暂停方式(time.sleep()、input()等),结果相同。如何让Selenium停留在新页面?
原代码:
driver = webdriver.Chrome() driver.get("https://cityoflapcp.ezlinksgolf.com/index.html#/preSearch") driver.find_element(By.CLASS_NAME, "preSearch-calendar-input").clear() driver.find_element(By.CLASS_NAME, "preSearch-calendar-input").send_keys(date_of_play) # for some reason can't do clear and send keys in one line Select(driver.find_element(By.ID, 'pc')).select_by_visible_text(num_players) driver.find_element(By.XPATH,"//input[@value='6171']").click() driver.find_element(By.XPATH,"//button[@type='submit']").click() time.sleep(10) # to keep the browser open for testing/debugging
解决方案
1. 切换到新打开的窗口/标签页
提交后页面大概率会在新窗口打开,但原窗口会自动刷新,这时候需要主动切换到新窗口:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 点击提交前先记录当前窗口的句柄 original_window = driver.current_window_handle # 执行提交操作 driver.find_element(By.XPATH,"//button[@type='submit']").click() # 等待新窗口出现,最长等待10秒 WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2)) # 遍历所有窗口句柄,切换到新窗口 for handle in driver.window_handles: if handle != original_window: driver.switch_to.window(handle) break # 等待新页面加载完成,这里以等待body元素为例 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body"))) # 可以加个sleep验证是否停留在新页面 time.sleep(5)
2. 拦截原页面的刷新请求
如果原页面是通过JavaScript触发的自动刷新,可通过Chrome DevTools协议拦截这个刷新请求:
# 开启Chrome的网络请求监控 driver.execute_cdp_cmd('Network.enable', {}) # 定义拦截规则:取消原页面的刷新请求 def block_refresh(request): target_url = "https://cityoflapcp.ezlinksgolf.com/index.html#/preSearch" if request['request']['url'] == target_url: driver.execute_cdp_cmd('Network.cancelRequest', {'requestId': request['requestId']}) # 注册拦截回调 driver.execute_cdp_cmd('Network.requestWillBeSent', {}, block_refresh) # 继续执行原有提交流程 driver.find_element(By.XPATH,"//button[@type='submit']").click()
3. 直接获取跳转URL并访问
如果提交是AJAX异步完成后跳转,可等AJAX结束后直接获取目标URL,用driver.get()访问:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 执行提交 driver.find_element(By.XPATH,"//button[@type='submit']").click() # 等待AJAX操作完成(需替换为页面上标识提交成功的元素) WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[contains(text(), '搜索结果')]"))) # 获取跳转后的URL并直接访问 target_url = driver.execute_script("return window.location.href") driver.get(target_url)
内容的提问来源于stack exchange,提问作者Hostile Amigo
相关产品推荐
相关产品推荐

