当前位置: 首页 > 面试题库 >

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

冯宏恺
2023-03-14
问题内容

我在使用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);语句,因为如果窗口花费更多时间打开,则代码可能会失败,并且如果窗口快速打开,则会不必要地降低测试速度。

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


问题答案:

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

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

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);
    }
}


 类似资料:
  • 问题内容: 我的示例代码如下: 我的要求是,在捕获到异常之后,我要处理数组的其余元素。我怎样才能做到这一点? 问题答案: 您的代码应如下所示:

  • 我正在使用Pygame模块制作一个简单的游戏。我需要Tkinter窗口与Pygame窗口一起打开。 每当我试图打开两个窗口时,第二个窗口只有在我杀死第一个窗口后才会打开。 现在,我能想到的唯一解决方案是使用多线程。但是,我无法实现它。 我该怎么做呢?我真的很感激这里的帮助。谢谢你!

  • 问题内容: 我试图单击此页面上的元素: 在这一点上,我想单击“现金流量”,“资产负债表”或“季度”。我知道这些按钮已加载,因为我可以使用BeautifulSoup从页面源中提取它们。但是,当我尝试使用Selenium时: 全部返回“无法定位元素”,除了“季度”返回一个元素,但它位于图上方的一个元素而不是我感兴趣的表格上方的一个元素。 我认为这是由于位于错误的iframe中,而我找到了所有ifram

  • 我有一个程序正在显示结果的条形图。我想等到用户关闭条形图,继续下一行代码,询问他们是否要为该图输入新信息。 正在发生的是,柱状图的场景将打开,但什么也不会显示,并且JOptionPane立即弹出问题。如果我点击“否”,则显示图表,但程序结束。如果我点击“是”,程序将返回到前面的对话框窗口,但在其他对话框结束之前不会显示图表。 我想等待提示用户,直到他们关闭条形图。在这一点上,我是如此的沮丧,以至于

  • 问题内容: 也许这是一个显而易见的问题,但我想确定。 我怎么知道MySQLnd是否是活动驱动程序? 我正在运行PHP 5.3和MySQL 5.1.37。在phpinfo()中,列出了mysqlnd,但是仅凭此我不确定我是使用MySQLnd还是旧驱动程序… 提取phpinfo()输出 我正在使用PDO,并且PDO驱动程序显示mysql … 问题答案: 这应该可以解决问题: 要检测其是否为活动的PDO

  • 我制作了一个程序,要求用户输入5位数字,然后程序将查找这些数字的总和。我想知道我怎样才能使程序在计算一次之后一遍又一遍地要求一个数字。我希望用户再试一次,直到他自己想退出。