`

5.8 弹出对话框的处理

 
阅读更多
JavaScript共有3种弹出对话框框Alert、Confirmation以及Prompt。

Alert:提示对话框,只有一个“确定”按钮(对应的JavaScript代码为“alert('这是Alert');”)
Confirmation:确认对话框,需要选择(对应的JavaScript代码为“confirm('这是Confirmation');”)。
Prompt:输入对话框,需要输入内容(对应的JavaScript代码为“prompt('这就是prompt','');”)

由于Selenium 1使用的是JavaScript注入的方式来进行测试,所以无法直接处理JavaScript弹出对话框,而是对弹出对话框进行“预处理”。因此,那些在手工测试会出现弹出对话框的地方,在使用Selenium 1测试时不会有任何JavaScript弹出对话框弹出,这是因为在弹出前已经“处理”了。

  然而Selenium 2是针对各个浏览器而开发的,取代了嵌入到被测Web应用中的JavaScript。与浏览器的紧密集成,支持创建更高级的测试,避免了 JavaScript安全模型导致的限制。因此弹出对话框会成功弹出的。

  在Selenium 1中,针对不同的弹出对话框需要调用不同的方法,而在Selenium 2中,弹出对话框统一视为Alert对象,只需调用Alert对象的方法即可。

  由于目前网站上很难找到同时找到带有上述3个弹出对话框的网页,所以这里可以自己编写一个网页。首先新建一个文本文件,然后输入如程序清单5-57所示的代码:
<html>
<head>
<title></title>
</head>
<body>
<input type="button" onclick="alert('这是Alert');" value="Alert"/>
<br/>
<input type="button" onclick="confirm('这是Confirmation');" value="Confirmation"/>
<br/>
<input type="button" onclick="prompt('这就是Prompt','');" value="prompt"/>
</body>
</html>

  保存文件并将其更名为testPage.html,使用浏览器将其打开,单击不同的按钮,将会弹出对应的弹出对话框,接下来将在这个页面进行测试。

1  Accept()
  单击弹出对话框的确认按钮,可以同时对Alert、Confirmation以及Prompt使用。

  依次单击这些按钮,弹出各种对话框并进行单击,为了看得清楚,每个单击操作后面都增加了3秒的延迟。
public static void main(String[] args) throws InterruptedException {
//如果启动出现问题,可以使用System.setProperty指出firefox.exe的路径
//System.setProperty("webdriver.firefox.bin","D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
WebDriver driver = new FirefoxDriver();
Navigation navigation = driver.navigate();
navigation.to("C:\\Users\\Administrator\\Desktop\\testPage.html");
WebElement btn = driver.findElement(By.xpath("//input[1]"));
btn.click();
Thread.sleep(3000);
driver.switchTo().alert().accept();
WebElement btn2 = driver.findElement(By.xpath("//input[2]"));
btn2.click();
Thread.sleep(3000);
driver.switchTo().alert().accept();
WebElement btn3 = driver.findElement(By.xpath("//input[3]"));
btn3.click();
Thread.sleep(3000);
driver.switchTo().alert().accept();
}

  执行代码后,可以发现页面上依次弹出了Alert、Confirmation以及Prompt对话框,并依次单击了确定按钮。

2  Dismiss()
  单击弹出对话框的取消按钮,可以同时对Alert、Confirmation以及Prompt使用。不过对于Alert来说,Accept()和Dismiss()没有什么区别,所以完全不必对其使用Dismiss()。

  依次单击这些按钮,弹出各种对话框并进行单击,为了看得清楚,每个单击操作后面都增加了3秒的延迟。
public static void main(String[] args) throws InterruptedException {
//如果启动出现问题,可以使用System.setProperty指出firefox.exe的路径
//System.setProperty("webdriver.firefox.bin","D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
WebDriver driver = new FirefoxDriver();
Navigation navigation = driver.navigate();
navigation.to("C:\\Users\\Administrator\\Desktop\\testPage.html");
WebElement btn2 = driver.findElement(By.xpath("//input[2]"));
btn2.click();
Thread.sleep(3000);
driver.switchTo().alert().dismiss();
WebElement btn3 = driver.findElement(By.xpath("//input[3]"));
btn3.click();
Thread.sleep(3000);
driver.switchTo().alert().dismiss();
}


3  SendKeys(keysToSend)
在弹出对话框框中输入文本,该方法只对Prompt弹出对话框有效。

单击“Prompt”按钮,弹出Prompt弹出对话框,然后输入一串文本。
WebDriver driver = new FirefoxDriver();
Navigation navigation = driver.navigate();
navigation.to("C:\\Users\\Administrator\\Desktop\\testPage.html");
WebElement btn3 = driver.findElement(By.xpath("//input[3]"));
btn3.click();
driver.switchTo().alert().sendKeys("这就是输入的内容");


4  Text/getText()
  Text/getText()用于获取弹出对话框的文本内容。

  依次单击这些按钮,弹出各种弹出对话框并进行单击,同时输出它们的文本内容。
WebDriver driver = new FirefoxDriver();
Navigation navigation = driver.navigate();
navigation.to("C:\\Users\\Administrator\\Desktop\\testPage.html");
WebElement btn = driver.findElement(By.xpath("//input[1]"));
btn.click();
System.out.println(driver.switchTo().alert().getText());
driver.switchTo().alert().accept();
WebElement btn2 = driver.findElement(By.xpath("//input[2]"));
btn2.click();
System.out.println(driver.switchTo().alert().getText());
driver.switchTo().alert().accept();
WebElement btn3 = driver.findElement(By.xpath("//input[3]"));
btn3.click();
System.out.println(driver.switchTo().alert().getText());
driver.switchTo().alert().accept();


1、alert弹框
这种弹出框处理应该毫无难度,网上也有很多介绍的,这边提供一个方法,见代码
程序清单
//处理潜在的1个alert(javascript弹出框)
public boolean dealPotentialAlert(WebDriver driver,boolean option) {
//是否存在
boolean flag = false;
//异常捕获
try {
    Alert alert = driver.switchTo().alert();
    //判断是否存在alert弹框
    if (null == alert){
        throw new NoAlertPresentException();
    }
    //异常捕获
    try {
        //确认or取消
        if (option) {
            //确认
            alert.accept();
            System.out.println("Accept the alert: " + alert.getText());
        } else {
            //取消
            alert.dismiss();
            System.out.println("Dismiss the alert: " + alert.getText());
        }
        flag = true;
    } catch (WebDriverException e) {
        if (e.getMessage().startsWith("Could not find")){
            System.out.println("There is no alert appear!");
        }else{
            throw e;
        }
    }
} catch (NoAlertPresentException e) {
    System.out.println("There is no alert appear!");
}
return flag;
}


2、非alert弹框
不管是JS自定义的弹出框还是windows弹出框,下面给出的方法都能准确定位
//处理多个非alert弹窗
public static boolean testNewWindows(WebDriver driver){
//当前窗口句柄
String currentHandle = driver.getWindowHandle();
//得到所有窗口的句柄
Set<String> handles = driver.getWindowHandles();
//不包括当前窗口
handles.remove(currentHandle);
//存在窗口
if (handles.size() > 0) {
    try{
    //定位窗口
        dr.switchTo().window(handles.iterator().next());
        return true;
    }catch(Exception e){
        System.out.println(e.getMessage());
        return false;
    }
}
System.out.println("Did not find window");
return false;
}
 
//处理单个非alert弹窗
public static boolean testNewWindow(WebDriver driver){
    try{
        //定位窗口
        driver.switchTo().window(driver.getWindowHandles().iterator().next());
        return true;
    }catch(Exception e){
        System.out.println(e.getMessage());
        return false;
    }
}
分享到:
评论

相关推荐

    CentOS_5.8_系统安装文档

    6. 添加分区:添加分区需要点击“新建”,在弹出的添加分区对话框中,选择挂载点、输入大小、确定。 7. swap 交换分区:swap 交换分区的大小一般是内存的 1-2 倍,例如可以设为 2048MB(2G)。 8. /home 和/usr 分区...

    IFIX5.8恢复工程的详细步骤

    第十一步:在弹出的对话框中,选择对应SCU文件路径,路径通常位于备份工程路径下的LOCAL文件夹中的.SCU文件。 第十二步:选择“SCADA配置”进行通讯相关的驱动配置。 第十三步:选择对应的“I/O驱动器名称”,并...

    Qt5.8 打开指定路径txt文件 读写TXT文件

    这个函数会弹出一个文件选择对话框,允许用户选择TXT文件。返回的是用户选择的文件路径。 在Qt5.8中,这些功能已经很成熟,通过结合QFile、QTextStream和QFileDialog,我们可以轻松实现对TXT文件的读写操作,同时...

    计算器+VS2013+QT5.8+线性代数

    这可以通过QT的QLineEdit和QGridLayout等控件来实现,用户可以直接在界面上输入数值,也可以通过弹出对话框进行批量输入。 外部数据的读入则涉及到文件操作。VS2013和QT5.8都提供了文件I/O的API,例如C++标准库中的...

    河南省高速公路电子不停车收费系统培训教材.pptx

    上班操作包括下载系统运行参数、执行上班操作流程、弹出对话框提示“请刷身份卡…”,输入密码后,进入选择班次,根据统计日期班次选择后,上班操作成功。下班操作包括关闭程序或工班结束时,执行下班操作,系统弹出...

    SUIPack.v5.8.Full.Source.Delphi.BCB.rar

    3. **对话框与弹出窗口**:内建各种对话框和弹出窗口模板,如消息提示框、选择文件或目录对话框等,简化了开发者实现这些功能的工作。 4. **皮肤支持**:SUIPack支持多种皮肤,使得应用程序能够拥有统一而美观的...

    TheWorld 2.0.5.8苦菜花增强优化绿色版

    使用方法:在支持的网站里的视频上按住键盘上 Alt键 ,然后点击 鼠标左键,弹出一个 提示找到地址但无法下载的 提示窗口,然后可以选择自己喜欢的方式下载此视频. 支持Flv 8:其它功能,等待你的发现。 ...

    JavaScript网页特效范例宝典源码

    实例009 关闭IE主窗口时,不弹出询问对话框 13 1.2 弹出网页对话框 14 实例010 弹出网页模式对话框 14 实例011 弹出全屏显示的网页模式对话框 16 实例012 网页拾色器 18 实例013 日期选择器 21 1.3 窗口的动画效果 ...

    TMS IntraWeb Component Pack Pro 5.8 (D2009-DX10.1).zip

    3. **表单和对话框组件**:允许在Web应用中实现弹出窗口和复杂表单,增强了用户体验。 4. **图表和图形组件**:提供了绘制动态图表和图形的功能,使得数据可视化成为可能,这对于数据分析和决策支持至关重要。 5. ...

    excel数据透视表快速统计教师年龄段优质资料.doc

    Step 4:改变数据透视图位置右键单击图表空白处,在弹出下拉列表中选择“位置”,在弹出“图表位置”对话框中选择将图表“作为其中的对象插入”选项,单击其右侧的下箭头,在弹出的列表框中选择“Sheet1”工作表,...

    Visual C++MFC编程实例

    6.10 例21 创建弹出式菜单 117 第7章 工具栏和状态栏 120 7.1 例22 使用工具栏编辑器 120 7.2 例23 启用和禁用工具栏按钮 122 7.3 例24 为工具栏按钮添加字 123 7.4 例25 非标准工具栏大小 128 7.5 例26 保持工具栏...

    鑫河批量自动验证邮箱密码是否正确神器 v5.8.20.6.zip

    第一步:你打开软件"批量验证邮箱密码是否正确神器.exe",系统弹出一个用户登录对话功能框, 注: 1).如果已经在本系统中申请过用户和密码的用户,请直接登录本系统; 2).在这里如果你忘记了你的用户密码的用户,...

    《程序天下:JavaScript实例自学手册》光盘源码

    1.15 离开页面时弹出对话框 1.16 判断页面是否添加了W3C声明 1.17 屏蔽网页中的脚本 1.18 以频道模式打开页面 1.19 自动识别网页类型 1.20 在网页中动态添加Script脚本 1.21 用JavaScript随机修改页面的标题 1.22 ...

    JavaScript实用范例词典04-14

    4.6 只显示一次的弹出式窗口... 102 4.7 记住登录账号和密码... 103 4.8 检测浏览器是否关闭了Cookie 功能... 105 第5章 视窗篇.... 106 5.1 警告对话框... 106 5.2 在警告对话框上显示多行消息 正文... 106 ...

    程序天下:JavaScript实例自学手册

    1.15 离开页面时弹出对话框 1.16 判断页面是否添加了W3C声明 1.17 屏蔽网页中的脚本 1.18 以频道模式打开页面 1.19 自动识别网页类型 1.20 在网页中动态添加Script脚本 1.21 用JavaScript随机修改页面的标题 1.22 ...

    word中如何为金额数字批量添加千分位符号

    - 在弹出的键盘对话框中,从“类别”下拉菜单中选择“宏”,在“命令”列表中找到并选择你刚刚创建的宏。 - 按下你希望使用的快捷键组合(例如`Ctrl+Shift+K`),然后点击“指定”按钮。 - 最后点击“关闭”保存...

    关于SoapUI的中文使用手册

    **步骤2:** 在弹出的“新建SOAP项目”对话框中输入项目名称,例如可以命名为“CurrencyConverter”。完成输入后点击“确定”。此时会在导航器中创建一个新的项目。 **小贴士:** 在创建项目时,确保项目名称与即将...

    Visual C++ 6.0.rar

    6.3.2 创建浮动的弹出式菜单 6.4 文本处理 6.4.1 文本输出函数 6.4.2 设置文本属性 6.4.3 获取字符属性 6.4.4 使用字体 6.4.5 文本处理示例 6.5 打印和打印预览 本章小结 习题 第7章 图形设备 7.1 在屏幕...

Global site tag (gtag.js) - Google Analytics