一尘不染

Selenium Web驱动程序如何知道何时打开新窗口,然后继续执行

selenium

我在使用Selenium Web驱动程序自动化Web应用程序时遇到问题。

网页上有一个按钮,单击该按钮会打开一个新窗口。当我使用以下代码时,它会抛出OpenQA.Selenium.NoSuchWindowException: No window found

WebDriver.FindElement(By.Id("id of the button that opens new window")).Click();
//Switch to new window
_WebDriver.SwitchTo().Window("new window name");
//Click on button present on the newly opened window
_WebDriver.FindElement(By.Id("id of button present on newly opened window")).Click();

为了解决上述问题,我Thread.Sleep(50000);在按钮单击和SwitchTo语句之间添加了内容。

WebDriver.FindElement(By.Id("id of the button that opens new window")).Click();
Thread.Sleep(50000); //wait
//Switch to new window
_WebDriver.SwitchTo().Window("new window name");
//Click on button present on the newly opened window
_WebDriver.FindElement(By.Id("id of button present on newly opened window")).Click();

它解决了问题,但是我不想使用该Thread.Sleep(50000);语句,因为如果窗口花费更多时间打开,则代码可能会失败,并且如果窗口快速打开,则会不必要地降低测试速度。

有什么方法可以知道何时打开窗口,然后测试可以恢复执行?


阅读 336

收藏
2020-06-26

共1个答案

一尘不染

在控件中进行任何操作之前,您需要将其切换到弹出窗口。通过使用它可以解决您的问题。

在打开弹出窗口之前,获取主窗口的句柄并保存。

String mwh=driver.getWindowHandle();

现在尝试通过执行一些操作来打开弹出窗口:

driver.findElement(By.xpath("")).click();

Set s=driver.getWindowHandles(); //this method will gives you the handles of all opened windows

Iterator ite=s.iterator();

while(ite.hasNext())
{
    String popupHandle=ite.next().toString();
    if(!popupHandle.contains(mwh))
    {
        driver.switchTo().window(popupHandle);
        /**/here you can perform operation in pop-up window**
        //After finished your operation in pop-up just select the main window again
        driver.switchTo().window(mwh);
    }
}
2020-06-26