Selenium WebDriver .getWindowHandles()返回先前关闭的窗口,如何区分这些窗口和活动窗口?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium WebDriver .getWindowHandles()返回先前关闭的窗口,如何区分这些窗口和活动窗口?相关的知识,希望对你有一定的参考价值。
我正在尝试创建一个循环打开窗口的函数,并根据窗口标题切换到特定的窗口。这适用于前几个窗口,但我自动化的网站利用几个弹出窗口自动关闭操作,如“下一步”按钮,这些句柄似乎在窗口关闭后继续存在。
因此,当我尝试切换到窗口检查其标题时,脚本超时,因为WebDriver无法切换到不存在的窗口。它不会抛出NoSuchWindowException,这很奇怪。
下面是我遍历窗口和按标题切换的方法
public String switchByTitle(String title)
{
boolean isPage = false;
String neededHandle = null;
while(isPage == false)
{
for (String winHandle : driver.getWindowHandles())
{
try
{
//vvv timeout occurs here vvv
driver.switchTo().window(winHandle);
if (driver.switchTo().window(winHandle).getTitle().equals(title))
{
isPage = true;
neededHandle = winHandle;
break;
}
}
catch (NoSuchWindowException e)
{
continue;
}
}
}
return neededHandle;
}
更新不理想但我找到了一个解决方法
public String switchByTitle(String title)
{
boolean isPage = false;
String neededHandle = null;
WebDriverWait wait = new WebDriverWait(driver, 5);
while(isPage == false)
{
for (String winHandle : driver.getWindowHandles())
{
try
{
//shortened timeout to 5 seconds
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
driver.switchTo().window(winHandle);
if (driver.switchTo().window(winHandle).getTitle().equals(title))
{
isPage = true;
neededHandle = winHandle;
break;
}
}
catch (NoSuchWindowException e)
{
continue;
}
//added timeout exception
catch (org.openqa.selenium.TimeoutException e)
{
continue;
}
}
}
//reset timeout
driver.manage().timeouts().pageLoadTimeout(1800, TimeUnit.SECONDS);
return neededHandle;
}
答案
用它作为解决方法:
public String switchByTitle(String title)
{
boolean isPage = false;
String neededHandle = null;
WebDriverWait wait = new WebDriverWait(driver, 5);
while(isPage == false)
{
for (String winHandle : driver.getWindowHandles())
{
try
{
//shortened timeout to 5 seconds
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
driver.switchTo().window(winHandle);
if (driver.switchTo().window(winHandle).getTitle().equals(title))
{
isPage = true;
neededHandle = winHandle;
break;
}
}
catch (NoSuchWindowException e)
{
continue;
}
//added timeout exception
catch (org.openqa.selenium.TimeoutException e)
{
continue;
}
}
}
//reset timeout
driver.manage().timeouts().pageLoadTimeout(1800, TimeUnit.SECONDS);
return neededHandle;
}
以上是关于Selenium WebDriver .getWindowHandles()返回先前关闭的窗口,如何区分这些窗口和活动窗口?的主要内容,如果未能解决你的问题,请参考以下文章
appium的webdriver和selenium有啥区别?
selenium之python源码解读-webdriver继承关系