打开单个窗口时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字段,原代码能运行可能依赖全局变量或隐式注入,存在代码隐患。
解决方案
- 删除Tests类中多余的BaseTest实例化代码:
// 移除这行代码 BaseTest base1=new BaseTest(); - 修改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
相关产品推荐
相关产品推荐

