如何处理警报和弹出窗口 Selenium?

⚡ 智能摘要

警报和弹出窗口 Selenium 旨在 Java脚本对话框和子窗口会阻碍自动化流程。本文将介绍如何识别简单提示、提示框和确认框,如何使用 WebDriver 切换到这些提示框,以及如何使用 getWindowHandles() 管理多个窗口。

  • 🔔 核心定义: A Selenium 警报是一种 Java页面上方会显示一个脚本对话框,必须先处理该对话框才能执行其他操作。
  • 🗂️ 三种警报类型: 简单(信息)、提示(文本输入)和确认(是/否)都需要不同的 WebDriver 调用。
  • 🛠️ 警报 API: 使用 driver.switchTo().alert() 和 accept()、dismiss()、getText() 和 sendKeys() 与对话框进行交互。
  • 🪟 窗口处理: getWindowHandle() 返回当前窗口 ID;getWindowHandles() 返回用于切换的完整窗口集。
  • 🚀 Selenium 4注意: Selenium 管理器会自动解析驱动程序,无需硬编码 chromedriver.exe 路径。
  • 🤖 人工智能协助: AI 代理生成定位感知警报和窗口脚本,减少测试套件中的人工辅助工作。

如何处理警报和弹出窗口 Selenium

什么是警报? Selenium?

An 警报在 Selenium 很小 Java屏幕上会弹出一个脚本对话框,用于向用户提供信息或通知。它可以确认特定操作、请求执行操作的权限,或显示警告消息。

在本教程中,您将学习如何处理弹出窗口 Selenium 以及 Web 应用程序中发现的不同类型的警报 测试我们还将了解如何在……中处理警报。 Selenium WebDriver以及如何根据警报类型接受或拒绝它。

警报类型 Selenium

Java脚本会显示三个警告对话框, Selenium 必须区别对待。

1) Simple Alert

简易提示框会在屏幕上显示信息或警告。用户只能通过点击来确认。 OK.

浏览器中的简单警告对话框示例

2) Prompt Alert

提示框会要求用户输入信息。 Selenium WebDriver 可以使用它向其中输入内容 sendKeys("input...").

带有输入字段的提示对话框

3) Confirmation Alert

确认提示会要求用户批准或取消操作。它同时显示了…… OK取消 按钮。

带有“确定”和“取消”按钮的确认提示对话框

如何处理警报 Selenium 网络驱动程序

Alert 界面 Selenium 网络驱动程序 公开了涵盖所有警报交互的四种方法。

  1. 无效解雇() — 点击 取消 按钮。
driver.switchTo().alert().dismiss();
  1. 无效接受() — 点击 OK 按钮。
driver.switchTo().alert().accept();
  1. 字符串获取文本() — 捕获警报消息。
driver.switchTo().alert().getText();
  1. 无效 sendKeys (字符串 stringToSend ) — 在提示框中输入文本。
driver.switchTo().alert().sendKeys("Text");

Eclipse 输入 后,自动完成功能会显示可用的提示方式。ping alert. 在编辑器行上。随时使用以下方式从主窗口切换到警报窗口: Selenium“ 。切换到() 方法。

Eclipse 自动完成功能显示警报处理方法

示例:删除客户演示

让我们实现以下场景的自动化。我们将使用 Guru99 个演示站点示例 Selenium 警报处理。

步骤1) 启动浏览器并打开 https://demo.guru99.com/test/delete_customer.php.

步骤2) 请输入任意客户ID。

删除包含客户 ID 字段的客户演示页面

步骤3) 点击 提交表单 按钮。

点击“提交”按钮触发确认提示

步骤4) 接受或忽略出现的确认提示。

删除操作触发的确认提醒

Selenium Java Code: 处理 Confirmation Alert

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.Alert;

public class AlertDemo {

    public static void main(String[] args) throws NoAlertPresentException, InterruptedException {
        // Selenium 4 ships Selenium Manager, so an explicit driver path is no longer required.
        WebDriver driver = new ChromeDriver();

        // Open the Delete Customer demo page
        driver.get("https://demo.guru99.com/test/delete_customer.php");

        driver.findElement(By.name("cusid")).sendKeys("53920");
        driver.findElement(By.name("submit")).submit();

        // Switch to the confirmation alert
        Alert alert = driver.switchTo().alert();

        // Capture the alert message
        String alertMessage = alert.getText();
        System.out.println(alertMessage);
        Thread.sleep(5000);

        // Accept the alert
        alert.accept();

        driver.quit();
    }
}

输出: 浏览器打开“删除客户”页面,提交客户 ID,接受确认提示,并从演示应用程序中删除该记录。

如何处理弹出窗口 Windows in Selenium 网络驱动程序

当自动化需要在多个浏览器窗口中运行时,测试必须在它们之间切换焦点,并在每次操作后返回到父窗口。 Selenium WebDriver 提供了两种方法来实现这一点。

driver.getWindowHandles()

返回一个 Set<String> 获取每个打开的窗口句柄。遍历该集合,以从主窗口切换到应用程序中的任何子窗口。

驱动程序.获取窗口句柄()

返回一个 String 使用当前窗口的唯一句柄。在打开任何子窗口之前捕获此句柄,以便稍后返回父窗口。

请按照以下步骤演示窗口处理 Guru99 弹出式演示。

示例:窗口切换

步骤1) 启动浏览器并打开 https://demo.guru99.com/popup.php.

Guru99 弹出式演示着陆页

步骤2) 点击 了解更多 链接。将打开一个新的子窗口。

子窗口是从“点击此处”链接打开的。

步骤3) 子窗口提示用户输入电子邮件地址并提交。

子窗口电子邮件输入表单

步骤4) 输入邮箱地址并提交。

在子窗口中提交电子邮件

步骤5) 此页面显示演示返回的访问凭据。

子窗口中显示的访问凭据

显示凭据后:

  1. 关闭子窗口。

关闭浏览器中的子窗口

  1. 将焦点切换回父窗口。

切换回父窗口

Selenium Java Code处理多个 Windows

import java.util.Iterator;
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class WindowHandle_Demo {

    public static void main(String[] args) throws InterruptedException {
        // Selenium 4 auto-resolves the browser driver via Selenium Manager
        WebDriver driver = new FirefoxDriver();

        driver.get("https://demo.guru99.com/popup.php");
        driver.manage().window().maximize();

        driver.findElement(By.xpath("//*[contains(@href,'popup.php')]")).click();

        String mainWindow = driver.getWindowHandle();

        // Capture every open window handle
        Set<String> allWindows = driver.getWindowHandles();
        Iterator<String> iterator = allWindows.iterator();

        while (iterator.hasNext()) {
            String childWindow = iterator.next();

            if (!mainWindow.equalsIgnoreCase(childWindow)) {
                // Switch to the child window
                driver.switchTo().window(childWindow);
                driver.findElement(By.name("emailid")).sendKeys("gaurav.3n@gmail.com");
                driver.findElement(By.name("btnLogin")).click();

                // Close the child window
                driver.close();
            }
        }
        // Return focus to the main window
        driver.switchTo().window(mainWindow);
        driver.quit();
    }
}

输出: 网站上线了, 点击这里 链接会打开一个子标签页, Selenium 输入电子邮件并提交,关闭子窗口,然后返回父窗口。

多窗口处理已完成 Selenium

结语

  • 定义了这三个 Selenium 提醒类型——简单提醒、提示提醒和确认提醒——每种类型都附有屏幕截图。
  • 演示如何使用 WebDriver 处理警报 Alert 使用可正常运行的删除客户场景的界面。
  • 通过捕获句柄来处理多个浏览器窗口 getWindowHandle()getWindowHandles() 并在它们之间切换。

常见问题

警报是原生的 Java脚本对话框会暂停页面直至被处理。弹出窗口是一个新的浏览器窗口或标签页。警告框使用 switchTo().alert();弹出窗口使用 switchTo().window(),并传入 getWindowHandles() 返回的窗口句柄。

当执行 `switchTo().alert()` 但当前未显示任何提示框时,会抛出 `NoAlertPresentException` 异常。请使用 `WebDriverWait` 包裹此调用,直到 `ExpectedConditions.alertIsPresent()` 为真,以便给页面一些时间触发对话框。

基本身份验证弹出窗口并非标准配置 Java脚本警报。传递凭据 URL (https://user:pass@site.com)或使用 Selenium 4. CDP Network.setExtraHTTPHeaders。对于 SSO 弹出窗口,请使用 BrowserStack 或已注册的 hasAuthentication 处理程序。

人工智能助手,例如 AI 代码助手会生成定位器感知的警报处理程序,预测所需的等待时间,并重构脆弱的 XPath。它们还会为警报文本和子窗口编写断言。 URLs,加速 Selenium 创建测试用例。

是的。自愈式测试平台利用人工智能来检测 DOM 变化、替换损坏的定位器,并在警报或弹出窗口发生变化时调整等待时间。这降低了维护成本。 Selenium 运行在频繁更新的前端上的套件。

总结一下这篇文章: