【问题标题】:Switching control to a Modal window (not an alert) using Selenium Webdriver使用 Selenium Webdriver 将控制切换到模态窗口(不是警报)
【发布时间】:2014-01-30 10:19:53
【问题描述】:

我有一个 Web 应用程序,当我单击保存按钮时,它会启动保存窗口(模式)。这个窗口需要 10 秒才能完全加载(我可以通过等待来解决这个问题)。 在完成保存之前,我需要在此窗口中执行一些操作。

我面临的问题是 - 模式窗口启动的那一刻,我无法使用 driver.SwitchTo() 或 driver.Manage().GetAllWindowHandles() 等。我用以下代码行确认了这一点。

driver.findElement(By.xpath("//*[@id='toolbar']/a[1]")).click();
// After the above line is executed, the Popup gets launched

Set<String> sWindowHandles = driver.getWindowHandles();
System.out.println("Popup"); 
System.out.println(driver.getWindowHandles().size()); // This always prints "1"

在我明确关闭弹出窗口之前,上面的 3 行根本不会执行(或者至少不会执行很长时间)。

当我无法找到窗口的处理程序时,如何处理存在于保存窗口(模态)中的某些控件?

for(String winHandle : driver.getWindowHandles()){
    driver.switchTo().window(winHandle);
}

不起作用,因为在模式窗口打开后(GetWindowHandles 只有在它启动后才有意义),后续行根本不会执行。 我陷入了僵局。请帮帮我。

【问题讨论】:

  • 你可能看错了——网页上的模态对话框通常不是单独的窗口;它们主要实现为页面上的 div 覆盖。分享您页面的 HTML,也请分享模态对话框的 HTML。
  • 如果对话框是使用showModalDialog 启动的,你应该看看Issue 284。从下往上开始阅读可能的解决方案。

标签: selenium modal-dialog selenium-webdriver


【解决方案1】:

如果 Windows 句柄在应用程序上不起作用。
可以使用Java机器人类功能。

      Robot robot = new Robot();   
//Doing a mouse over for the X and Y coordinates of button/link which opens modal window
robot.mouseMove(210,350);  
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);  
robot.delay(100);  
//Clicking tab til the cursor is on specific position (textbox/button)
robot.keyPress(KeyEvent.VK_TAB);  
robot.delay(100);  
//Doing a mouse over for the X and Y coordinates of button/link
robot.mouseMove(300,150);  
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);  
robot.delay(100);

有关更多信息,请参阅以下链接。 http://alvinalexander.com/java/java-robot-class-example-mouse-keystroke

【讨论】:

  • 我不能 100% 确定如何识别坐标。我相信您是在要求我直接将鼠标悬停在模态窗口中的按钮上并单击,甚至没有收集 WindowHandle。
  • 您可以在firebug窗口右上角的布局选项卡中获取大致的X,Y坐标。确保在打开浏览器后最大化浏览器。
  • 检查您想知道XY坐标的元素,从布局选项卡中获取并测试它,如果光标不在您想要的确切位置,您可以假设并修改坐标光标所在的位置。我通常在其中一个窗口句柄不起作用的项目中这样做。
  • 很遗憾,机器人的建议没有奏效。 MouseMove 操作,类似于 GetWindowHandlers(),只要 Modal Window 处于活动状态,就无法工作。
【解决方案2】:

我有时会发现窗口句柄可能需要一段时间才能更新为正确的值,即使弹出窗口可见。为了解决这个问题,我使用了一个循环,该循环在窗口句柄达到预期大小时中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多