Selenium:处理随机弹出的窗口

Selenium:处理随机弹出的窗口,selenium,random,selenium-webdriver,popup,window,Selenium,Random,Selenium Webdriver,Popup,Window,我们有一个收集客户反馈的功能。为此,当用户注销时,会随机弹出一个窗口——并非每次都针对每个客户。 我想在我的自动化代码中处理这个问题 目前,在注销时,我希望看到一个窗口并切换到它,而当弹出窗口没有显示时,代码失败 最好的处理方法是什么 这就是我目前所拥有的 public static void waitForNumberOfWindowsToEqual(final int numberOfWindows) { ExpectedCondition<Boolean>

我们有一个收集客户反馈的功能。为此,当用户注销时,会随机弹出一个窗口——并非每次都针对每个客户。 我想在我的自动化代码中处理这个问题

目前,在注销时,我希望看到一个窗口并切换到它,而当弹出窗口没有显示时,代码失败

最好的处理方法是什么

这就是我目前所拥有的

    public static void waitForNumberOfWindowsToEqual(final int numberOfWindows) {


    ExpectedCondition<Boolean> expectation = new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver driver) {
            return (driver.getWindowHandles().size() == numberOfWindows);
        }
    };

    WebDriverWait wait = new WebDriverWait(driver, BrowserFactory.explicitWait);


    wait.until(expectation);
}
public static void waitForNumberOfWindowsToEqual(final int numberOfWindows){
ExpectedCondition expectation=新的ExpectedCondition(){
公共布尔应用(WebDriver驱动程序){
返回(driver.getWindowHandles().size()==numberOfWindows);
}
};
WebDriverWait wait=新的WebDriverWait(driver,BrowserFactory.explicitWait);
等待,直到(期望);
}

如果可能,理想的做法是查看源代码,确定弹出窗口是否会出现,但是如果无法实现,您可以采取以下方法:

// Get the number of windows open before clicking the log out button.    
int numberOfWindowsBeforeLogOut = driver.getWindowHandles().size();

// Click the log out button.
logOutButton.click();

// Check how many windows are open after clicking the log out button.
int numberOfWindowsAfterLogOut = driver.getWindowHandles().size();

// Now compare the number of windows before and after clicking the log out 
// button in a condition statement.
if (numberOfWindowsBeforeLogOut < numberOfWindowsAfterLogOut) {
   // If there is a new window available, switch to it.
   driver.switchTo().window(titleOrWindowHandle);
}
//在单击注销按钮之前获取打开的窗口数。
int numberofwindowsforelogout=driver.getWindowHandles().size();
//单击“注销”按钮。
注销按钮。单击();
//单击“注销”按钮后,检查打开的窗口数。
int numberOfWindowsAfterLogOut=driver.getWindowHandles().size();
//现在比较单击注销前后的窗口数
//条件语句中的按钮。
如果(注销前的numberOfWindowsBeforeLogOut<注销后的numberOfWindowsAfterLogOut){
//如果有新窗口可用,请切换到该窗口。
driver.switchTo().window(标题或WindowHandle);
}

我会用try/catch来处理没有弹出窗口的问题。以下是一个例子:

try {
    WebDriverWait winwait = new WebDriverWait(driver, 3);
    String mainWindow = driver.getWindowHandle();

    // wait for 2 windows and get the handles
    Set<String> handles = winwait.until((WebDriver drv) -> {
        Set<String> items = drv.getWindowHandles();
        return items.size() == 2 ? items : null;
    });

    // set the context on the last opened window
    handles.remove(mainWindow);
    driver.switchTo().window(handles.iterator().next());

    // close the window
    driver.close();

    // set the context back to the main window
    driver.switchTo().window(mainWindow);

} catch (TimeoutException ex) {
    System.out.println("No window present within 3 seconds");
}
试试看{
WebDriverWait winwait=新的WebDriverWait(驱动程序,3);
字符串mainWindow=driver.getWindowHandle();
//等待两个窗口并获取句柄
设置句柄=winwait.until((WebDriver drv)->{
Set items=drv.getWindowHandles();
返回项目。大小()==2?项目:空;
});
//在上次打开的窗口上设置上下文
把手。移除(主窗口);
driver.switchTo().window(handles.iterator().next());
//关上窗户
driver.close();
//将上下文设置回主窗口
driver.switchTo()窗口(主窗口);
}捕获(TimeoutException例外){
System.out.println(“3秒内不存在窗口”);
}

如果您没有获得所需的窗口,代码将抛出
TimeoutException
。因此,将
wait.until(期望值)
放在一个try块中并捕获异常。在代码中

try {
    wait.until(expectation);
} catch (TimeoutException ex) {
    System.out.println("Nowindow This Time");
}

代码中是否缺少单击(在我的情况下是注销)操作?在本例中,注销操作应该放在try之前。