You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium让Chrome应用模式下新标签仍保持应用模式

Chrome应用模式下新链接不保持应用模式的解决方案

Chrome的--app参数启动的应用模式,默认只会让初始窗口以应用模式运行,新打开的窗口/标签页会自动切换回普通浏览器模式,这是Chrome的原生行为。以下是几种无需使用kiosk模式的解决办法:


1. 拦截页面新窗口请求,强制在当前应用窗口打开

直接通过注入JavaScript,修改页面链接的打开行为,阻止新窗口创建,让所有链接在当前应用窗口内跳转:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--app=https://xxx.com')
driver = webdriver.Chrome(options=options)

# 注入脚本拦截window.open并修改所有新标签页链接
driver.execute_script("""
    // 替换window.open,强制在当前窗口跳转
    window.open = function(url) {
        window.location.href = url;
    };
    // 把所有target="_blank"的a标签改为_self
    document.querySelectorAll('a[target="_blank"]').forEach(link => {
        link.setAttribute('target', '_self');
    });
    // 监听页面动态加载的链接,实时修改target属性
    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            mutation.addedNodes.forEach(node => {
                if (node.tagName === 'A' && node.target === '_blank') {
                    node.setAttribute('target', '_self');
                }
            });
        });
    });
    observer.observe(document.body, { childList: true, subtree: true });
""")

这个方法覆盖了静态和动态加载的链接,适合大多数需要在同一应用窗口操作的场景。

2. 用CDP将新打开的窗口转为应用模式

如果必须保留新窗口,可以通过Chrome DevTools Protocol(CDP)监听新窗口事件,切换到新窗口后将其转为应用模式:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def switch_to_app_mode(driver):
    # 通过CDP命令将当前窗口设置为应用模式
    driver.execute_cdp_cmd("Browser.setWindowMode", {
        "windowId": driver.current_window_handle,
        "mode": "app"
    })

options = Options()
options.add_argument('--app=https://xxx.com')
driver = webdriver.Chrome(options=options)

# 开启自动监听新目标窗口
driver.execute_cdp_cmd("Target.setAutoAttach", {
    "autoAttach": True,
    "waitForDebuggerOnStart": False,
    "flatten": True
})

# 遍历所有窗口,将非初始窗口转为应用模式
current_handle = driver.current_window_handle
for handle in driver.window_handles:
    if handle != current_handle:
        driver.switch_to.window(handle)
        switch_to_app_mode(driver)

注意:该方法需要Chrome版本≥90,且ChromeDriver版本与Chrome版本匹配。

3. 修改Chrome偏好设置(兼容性有限)

尝试通过Chrome的实验性偏好设置,强制新窗口以应用模式启动:

options = Options()
options.add_argument('--app=https://xxx.com')
# 添加偏好设置
options.add_experimental_option("prefs", {
    "browser.window_mode": "app",
    "browser.link.open_newwindow": 1  # 1=在当前窗口打开新链接
})
driver = webdriver.Chrome(options=options)

这个方法的效果因Chrome版本而异,部分新版本可能不再支持该偏好键,建议优先测试前两种方法。


内容的提问来源于stack exchange,提问作者zooray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:01:04