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

ChromeDriver+Selenium多标签页创建失效:IInputSimulator问题求解决方案

解决方案:Selenium ChromeDriver 批量创建标签页(含独立会话实现)

一、替代方案:用JavaScript打开新标签页(推荐)

直接通过Selenium的JavaScript执行能力创建新标签,无需依赖键盘模拟,不受窗口焦点影响,稳定性更高。

代码示例

for (var i = 0; i < TabCount - 1; i++)
{
    try
    {
        _logger.Info($"正在创建第{i+2}个标签页,目标总数:{TabCount}");
        // 切换回主窗口
        _driver.SwitchTo().Window(mainHandler);
        
        // 执行JS打开新标签页
        ((IJavaScriptExecutor)_driver).ExecuteScript("window.open();");
        
        // 切换到新生成的标签页
        var newTabHandle = _driver.WindowHandles.Last();
        _driver.SwitchTo().Window(newTabHandle);
        
        // 导航到目标URL
        _driver.Navigate().GoToUrl(Constant.TabUrls.Google_URL);
        
        // 用显式等待替代固定休眠,等待页面加载完成
        new WebDriverWait(_driver, TimeSpan.FromSeconds(10)).Until(
            d => d.Url.Equals(Constant.TabUrls.Google_URL, StringComparison.OrdinalIgnoreCase) 
                 || d.Title.Contains("Google")
        );
    }
    catch (Exception ex)
    {
        _logger.Error(ex.Message, ex);
    }
}

优势

  • 无需依赖第三方模拟工具,完全基于Selenium原生能力
  • 不受窗口焦点、系统环境干扰,执行逻辑稳定
  • 显式等待比Thread.Sleep更灵活,避免不必要的等待或等待不足

二、实现独立会话的标签页(Cookie/缓存隔离)

Chrome普通标签页默认共享会话(Cookie、缓存等),若需每个标签页完全独立,可通过隐身模式+远程调试实现同一浏览器窗口内的隔离会话。

步骤与代码

  1. 启动主浏览器时启用远程调试端口:
var mainOptions = new ChromeOptions();
// 启用远程调试,端口可自定义
mainOptions.AddArgument("--remote-debugging-port=9222");
var mainDriver = new ChromeDriver(mainOptions);
string mainHandler = mainDriver.CurrentWindowHandle;
mainDriver.Navigate().GoToUrl(Constant.TabUrls.Google_URL);
  1. 批量创建独立会话的标签页:
for (var i = 0; i < TabCount - 1; i++)
{
    try
    {
        _logger.Info($"正在创建第{i+2}个独立会话标签页,目标总数:{TabCount}");
        
        var incognitoOptions = new ChromeOptions();
        incognitoOptions.AddArgument("--incognito");
        // 附加到已启动的远程调试端口,实现同一浏览器窗口内打开
        incognitoOptions.AddArgument("--remote-debugging-port=9222");
        
        var newDriver = new ChromeDriver(incognitoOptions);
        newDriver.Navigate().GoToUrl(Constant.TabUrls.Google_URL);
        
        // 可将所有driver实例存入集合统一管理
        // _driverCollection.Add(newDriver);
    }
    catch (Exception ex)
    {
        _logger.Error(ex.Message, ex);
    }
}

说明

  • 隐身模式下的标签页会完全隔离会话数据,不会与普通标签页共享Cookie、缓存
  • 通过远程调试端口可将新的隐身标签附加到同一浏览器窗口,避免打开多个独立窗口

三、原键盘模拟方案的修复(不推荐)

若必须保留键盘模拟的实现,可通过以下方式提升可靠性:

  1. 确保Chrome窗口处于激活状态
  2. 用显式等待替代固定休眠,等待新标签页生成

代码示例

// 引入Windows API用于激活窗口
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetForegroundWindow(IntPtr hWnd);

for (var i = 0; i < TabCount - 1; i++)
{
    try
    {
        _logger.Info($"Tab changed: i={i}, tab count:{TabCount}");
        _driver.SwitchTo().Window(mainHandler);
        
        // 激活Chrome窗口,确保焦点正确
        var chromeHwnd = new IntPtr(long.Parse(_driver.CurrentWindowHandle));
        SetForegroundWindow(chromeHwnd);
        
        // 执行快捷键
        _inputSimulator.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.SHIFT, VirtualKeyCode.VK_X);
        
        // 显式等待新标签页句柄出现
        new WebDriverWait(_driver, TimeSpan.FromSeconds(10)).Until(
            d => d.WindowHandles.Count > i + 1
        );
        
        // 切换到新标签页
        _driver.SwitchTo().Window(_driver.WindowHandles.Last());
        
        if (!_driver.Url.Equals(Constant.TabUrls.Google_URL, StringComparison.OrdinalIgnoreCase))
        {
            _driver.Navigate().GoToUrl(Constant.TabUrls.Google_URL);
            new WebDriverWait(_driver, TimeSpan.FromSeconds(10)).Until(
                d => d.Url.Equals(Constant.TabUrls.Google_URL, StringComparison.OrdinalIgnoreCase)
            );
        }
    }
    catch (Exception ex)
    {
        _logger.Error(ex.Message, ex);
    }
    _logger.Info("Go back to main handler");
}

局限性

  • 依赖系统窗口焦点,若其他窗口抢占焦点会导致快捷键执行失败
  • 仍受系统环境、Chrome版本影响,可靠性远低于JavaScript方案

内容的提问来源于stack exchange,提问作者Neo The Hacker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:44:53