获取 JavaScript 重定向的 URL 而不改变当前页面

本文介绍了一种使用 Selenium 获取由 JavaScript 代码触发的重定向 URL,同时保持在当前页面不跳转的方法。通过修改 JavaScript 代码,将目标 URL 存储到全局变量中,然后使用 Selenium 获取该变量,从而避免页面跳转。该方法适用于按钮触发复杂 JavaScript 函数的情况,绕过直接点击按钮导致页面重定向的问题。

在 Web 自动化测试中,经常会遇到点击按钮后由 JavaScript 代码触发页面重定向的情况。直接使用 driver.current_url 获取 URL 会导致页面跳转,这在某些场景下是不可接受的,例如需要在当前页面继续执行其他操作。本文提供了一种解决方案,通过修改 JavaScript 代码,在不跳转页面的情况下获取目标 URL。

核心思路:

  1. 定位导致重定向的 JavaScript 代码。
  2. 修改 JavaScript 代码,阻止重定向,并将目标 URL 存储到全局变量。
  3. 使用 Selenium 执行 JavaScript 代码,获取全局变量中的 URL。

具体步骤:

步骤 1:定位 JavaScript 代码

首先需要找到负责重定向的 JavaScript 代码。Chrome 开发者工具提供了强大的调试功能,可以帮助我们定位代码。

  1. 打开 Chrome 开发者工具 (F12)。
  2. 切换到 "Sources" (或 "源代码") 标签。
  3. 使用 Event Listener Breakpoints 功能。在 "Event Listener Breakpoints" 面板中,展开 "Script" (或 "脚本"),勾选 "click" 事件。
  4. 点击页面上的目标按钮。
  5. 开发者工具会自动在 JavaScript 代码中暂停,方便我们逐步调试,找到负责重定向的代码。 还可以添加 Event Listener Breakpoints for the load event。

步骤 2:修改 JavaScript 代码

找到负责重定向的代码后,需要修改它,阻止页面跳转,并将目标 URL 存储到全局变量 target_url 中。

例如,如果 JavaScript 代码如下:

window.location.href = "https://www.example.com/new_page";

可以修改为:

target_url = "https://www.example.com/new_page";
// window.location.href = "https://www.example.com/new_page"; // 注释掉重定向的代码

步骤 3:使用 Resource Override 扩展自动修改 JavaScript 代码

手动修改 JavaScript 代码比较繁琐,可以使用 Chrome 扩展 Resource Override 来自动完成。

Resource Override 允许我们拦截特定的网络请求,并使用本地文件替换响应内容。

  1. 安装 Resource Override 扩展。
  2. 配置 Resource Override,拦截包含重定向代码的 JavaScript 文件。
  3. 使用修改后的 JavaScript 文件替换原始文件。

步骤 4:Selenium 获取 URL

在 Selenium 中,可以使用 driver.execute_script() 方法执行 JavaScript 代码,并获取全局变量 target_url 的值。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("your_website_url")

# 点击按钮 (假设按钮的 id 是 "my_button")
button = driver.find_element("id", "my_button")
button.click()

# 获取 target_url 的值
my_target_url = driver.execute_script("return target_url;")

print(my_target_url)

driver.quit()

注意事项:

  • 确保在执行 driver.execute_script() 之前,JavaScript 代码已经执行完毕,并且 target_url 已经被赋值。
  • 如果 JavaScript 代码中使用了异步操作,需要等待异步操作完成后再获取 target_url 的值。
  • 如果页面上存在多个按钮触发 JavaScript 重定向,需要为每个按钮设置不同的全局变量名,例如 target_url1、target_url2 等。

总结:

通过修改 JavaScript 代码,我们可以绕过页面重定向,在不改变当前页面的情况下获取目标 URL。这种方法适用于按钮触发复杂 JavaScript 函数的场景,为 Web 自动化测试提供了更大的灵活性。使用 Resource Override 扩展可以自动化修改 JavaScript 代码,提高效率。