Selenium:获取JS触发的跳转URL且不跳转当前页面
实现方案
方案1:拦截页面跳转行为(推荐用Selenium)
如果用Selenium控制浏览器,可以通过重写浏览器的跳转方法来阻止跳转,同时捕获目标URL。比如覆盖window.location.href或者window.open的默认行为:
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("你的目标页面URL") # 注入JS代码,拦截跳转并存储目标URL driver.execute_script(""" window.targetUrl = null; // 覆盖location.href的setter Object.defineProperty(window.location, 'href', { set: function(val) { window.targetUrl = val; // 不执行实际跳转 } }); // 同时覆盖window.open以防用新窗口跳转 window.open = function(url) { window.targetUrl = url; return null; }; """) # 点击按钮 driver.find_element(By.CSS_SELECTOR, "你的按钮选择器").click() # 获取捕获到的URL target_url = driver.execute_script("return window.targetUrl;") print("目标URL:", target_url) driver.quit()
这个方法不需要深入分析复杂JS,直接在浏览器环境里拦截跳转动作,拿到目标URL后页面不会跳转,还能继续操作原页面。
方案2:逆向提取URL生成逻辑
如果拦截方法失效(比如JS用了更底层的跳转方式),就得定位生成URL的代码:
- 打开Chrome DevTools的Sources面板,给按钮的点击事件加断点(右键按钮→检查→在元素面板右键→Break on→Attribute modifications)
- 点击按钮后触发断点,沿着调用栈往上找,看哪一步生成了跳转URL
- 把生成URL的关键JS代码提取出来,用Python的
execjs库在本地执行:
import execjs # 提取到的生成URL的JS代码片段 js_code = """ function generateTargetUrl() { // 这里是从页面源码中提取的URL生成逻辑 var baseUrl = "https://example.com/"; var params = {id: 123, token: getToken()}; return baseUrl + "?" + new URLSearchParams(params).toString(); } // 如果有依赖的函数,也要一并提取 function getToken() { return "abc123"; } """ # 执行JS获取URL ctx = execjs.compile(js_code) target_url = ctx.call("generateTargetUrl") print("目标URL:", target_url)
如果JS依赖页面环境的变量(比如document、window),可以直接用Selenium的execute_script在浏览器环境里执行提取的代码。
方案3:沙箱环境模拟页面执行
如果要完全模拟页面环境,推荐用playwright(比Selenium更灵活),它可以在隔离的上下文里加载页面,执行点击动作并拦截所有网络请求:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() # 监听所有跳转请求 target_url = None def handle_request(request): nonlocal target_url # 判断是否是跳转请求(根据请求类型或URL特征) if request.resource_type == "document" and request.url != page.url: target_url = request.url request.abort() # 阻止跳转 page.on("request", handle_request) page.goto("你的目标页面URL") page.click("你的按钮选择器") print("目标URL:", target_url) browser.close()
Playwright的请求监听可以精准捕获跳转请求,直接abort就能阻止页面跳转,同时拿到目标URL。
内容的提问来源于stack exchange,提问作者hellohawaii
相关产品推荐
相关产品推荐

