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

打开单个窗口时driver.WindowHandles返回2个句柄的异常问题

问题

在Selenium自动化测试中,我需要统计打开1个窗口和打开第2个窗口后的window handles数量。打开单个窗口时,第一个循环输出2个window handles(预期应为1);打开第二个窗口后,第二个循环输出2个window handles(符合预期)。

测试代码

public class BaseTest
{
    public IWebDriver driver;
                                   
    [OneTimeSetUp]
    public void Setup()
    {
        driver = new ChromeDriver();
        driver.Manage().Window.Maximize();
    } 

    [OneTimeTearDown] 
    public void TearDown() 
    { 
        driver.Quit();
        extent.Flush();
    }
}


[TestClass]
public class Tests :BaseTest
{
    BaseTest base1=new BaseTest();
     
    [Test]
    public void Test6()
    {
        HTMLtestPage hTMLtestPage= new HTMLtestPage(driver);
        //hTMLtestPage.searchSome();
        hTMLtestPage.htmlres();
    }
}

public class HTMLtestPage
{
    public void htmlres()
    {   
        driver.Url = "https://www.google.com/";
        Console.WriteLine("initial no of windhandls");
        List<String> list = new List<String>(driver.WindowHandles);
        foreach (var x in list)
        {
            Console.WriteLine(x);
        }
        Thread.Sleep(1000);
        driver.SwitchTo().NewWindow(WindowType.Window);
        driver.Url = "https://www.w3schools.com/Xml/xpath_syntax.asp";
        Console.WriteLine(driver.CurrentWindowHandle);
        Thread.Sleep(1000);
        List<String> listn = new List<String>(driver.WindowHandles);
        Console.WriteLine("printing in for loop");
        foreach (var y in listn)
        {
            Console.WriteLine(y);
        }
    }
}

输出情况

初始窗口阶段打印了2个window handle值,新增窗口后依然打印2个值,与预期的初始1个、新增后2个不符。

问题原因

Tests类中手动实例化了BaseTest base1=new BaseTest();,而Tests本身已经继承BaseTest,会触发父类的OneTimeSetUp创建一个driver实例;手动实例化的BaseTest对象也会执行OneTimeSetUp再创建一个driver实例。这导致测试启动时就打开了两个浏览器窗口,所以初始window handles数量为2。

另外,HTMLtestPage类中未定义driver字段,原代码能运行可能依赖全局变量或隐式注入,存在代码隐患。

解决方案

  1. 删除Tests类中多余的BaseTest实例化代码:
    // 移除这行代码
    BaseTest base1=new BaseTest();
    
  2. 修改HTMLtestPage类,添加driver成员并通过构造函数传入,避免隐式依赖:
    public class HTMLtestPage
    {
        private readonly IWebDriver driver;
    
        public HTMLtestPage(IWebDriver driver)
        {
            this.driver = driver;
        }
    
        public void htmlres()
        {   
            driver.Url = "https://www.google.com/";
            Console.WriteLine("initial no of windhandls");
            List<String> list = new List<String>(driver.WindowHandles);
            foreach (var x in list)
            {
                Console.WriteLine(x);
            }
            Thread.Sleep(1000);
            driver.SwitchTo().NewWindow(WindowType.Window);
            driver.Url = "https://www.w3schools.com/Xml/xpath_syntax.asp";
            Console.WriteLine(driver.CurrentWindowHandle);
            Thread.Sleep(1000);
            List<String> listn = new List<String>(driver.WindowHandles);
            Console.WriteLine("printing in for loop");
            foreach (var y in listn)
            {
                Console.WriteLine(y);
            }
        }
    }
    

修改后,BaseTest只会初始化一个driver实例,初始阶段只有一个浏览器窗口,window handles数量为1;新增窗口后数量变为2,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:27:24