Selenium遇预加载重定向无法加载页面,如何执行后续操作?
解决Selenium处理页面预加载重定向的问题
当目标页面在加载前立即触发重定向时,Selenium会抛出如下错误:
Message: unknown error: net::ERR_SOCKS_CONNECTION_FAILED
你的测试代码示例:
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://loginrequired.com/')
要在不直接访问重定向后URL的前提下,让Selenium处理重定向并执行后续操作,试试这几个方案:
方案1:修改页面加载策略
默认ChromeDriver会等待页面所有资源完全加载(normal策略),换成eager或none策略,就能提前介入重定向后的页面:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # eager策略:等待DOM结构加载完成即可,不用等图片、样式等资源 chrome_options.page_load_strategy = 'eager' browser = webdriver.Chrome(options=chrome_options) browser.get('http://loginrequired.com/') # 重定向完成后可执行操作,比如打印当前URL print(browser.current_url) # 定位元素、交互等后续操作...
方案2:等待重定向完成后再操作
用WebDriverWait监听URL变化,确认重定向完成后再执行后续逻辑:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By browser = webdriver.Chrome() original_url = 'http://loginrequired.com/' browser.get(original_url) # 等待URL发生变化,超时设为10秒 WebDriverWait(browser, 10).until(EC.url_changes(original_url)) # 现在可以操作重定向后的页面 print("重定向后的地址:", browser.current_url) # 示例:定位页面元素 # target_element = browser.find_element(By.CSS_SELECTOR, '.some-class')
方案3:拦截网络请求允许重定向
通过Chrome DevTools协议拦截请求,手动允许重定向流程继续:
from selenium import webdriver browser = webdriver.Chrome() # 启用网络监控 browser.execute_cdp_cmd('Network.enable', {}) # 设置请求拦截规则,针对文档类请求 browser.execute_cdp_cmd('Network.setRequestInterception', { 'patterns': [{'urlPattern': '*', 'resourceType': 'Document', 'interceptionStage': 'HeadersReceived'}] }) # 定义拦截处理逻辑:允许所有拦截的请求继续 def handle_intercepted_request(request): browser.execute_cdp_cmd('Network.continueInterceptedRequest', { 'interceptionId': request['interceptionId'] }) browser.request_interceptor = handle_intercepted_request browser.get('http://loginrequired.com/') # 重定向完成后执行后续操作...
内容的提问来源于stack exchange,提问作者Alfred G
相关产品推荐
相关产品推荐

