Alert弹框是一个很烦人的控件,因为当前页面如果弹出了该弹框,你必须要处理它,不然你就不能操作页面的其它元素,下面我列出了alert弹框在多种场景下的处理办法。

明确知道系统哪个地方会弹alert

  • 常规处理,该方法只是对弹出的alert弹框进行了捕获和处理
@Test(enabled = false)
public void ff1() {
System.setProperty(key, value);
driver = new ChromeDriver();
driver.get("file:///Users/user/Documents/qiaojiafei/seleniumtest.html");
driver.findElement(By.xpath("//*[@id='alert']/input")).click();
Alert alt = driver.switchTo().alert();
alt.accept();
}
  • 捕获时增加智能等待,该方法对弹出的alert弹框进行智能等待,避免了NoAlertPresentException异常的抛出
    @Test(enabled = false)
public void ff2() {
System.setProperty(key, value);
driver = new ChromeDriver();
driver.get("file:///Users/user/Documents/qiaojiafei/seleniumtest.html");
driver.findElement(By.xpath("//*[@id='alert']/input")).click(); WebDriverWait wait = new WebDriverWait(driver, 10);
try {
Alert alert = wait.until(new ExpectedCondition<Alert>() {
@Override
public Alert apply(WebDriver driver) {
try {
return driver.switchTo().alert();
} catch (NoAlertPresentException e) {
return null;
}
}
});
alert.accept();
} catch (NullPointerException e) {
/* Ignore */
System.out.println("ff2 nullpoint");
}
}
  • 捕获和处理alert时都增加判断,使用selenium自带的ExpectedConditions
    @Test(enabled = false)
public void ff3() {
System.setProperty(key, value);
driver = new ChromeDriver();
driver.get("file:///Users/user/Documents/qiaojiafei/seleniumtest.html");
driver.findElement(By.xpath("//*[@id='alert']/input")).click(); boolean flag = false;
Alert alert = null;
try { new WebDriverWait(driver, 10).until(ExpectedConditions
.alertIsPresent());
alert = driver.switchTo().alert();
flag = true;
// alert.accept();
} catch (NoAlertPresentException NofindAlert) {
// TODO: handle exception NofindAlert.printStackTrace();
// throw NofindAlert;
} if (flag) {
alert.accept();
}
}

以上的几种方法都是自己知道哪个地方要弹alert,所以在代码的某处对alert进行捕获,但是有时候我们并不知道哪个地方会弹alert弹框,这样就会导致我们没有进行捕获代码抛出了

UnexpectedAlertBehaviour异常,下面我们来看下怎么解决这个问题。

不清楚系统哪个地方会弹alert

  • 对整个正常代码进行异常捕获,写进try里,然后catchUnexpectedAlertBehaviour
    @Test(enabled = false)
public void ff4() {
System.setProperty(key, value);
driver = new ChromeDriver();
driver.get("file:///Users/user/Documents/qiaojiafei/seleniumtest.html");
driver.findElement(By.xpath("//*[@id='alert']/input")).click();
try {
System.out.println("ff4正常处理代码1");
driver.findElement(By.xpath("//*[@id='alert']/input")).click();
} catch (UnhandledAlertException e) {
// TODO: handle exception
driver.switchTo().alert().accept();
System.out.println("ff4进入UnhandledAlertException异常");
}
System.out.println("ff4正常处理代码2");
}

这样写,代码量大的话,需要都加,代码会很冗余,不建议使用

  • 实现事件监听接口WebDriverEventListener,alert一般是在click事件之后触发的,所以在afterClickOn方法中对alert进行捕获
@Override
public void afterClickOn(WebElement arg0, WebDriver arg1) {
// TODO Auto-generated method stub
boolean flag = false;
Alert alert = null;
try { new WebDriverWait(arg1, 10).until(ExpectedConditions
.alertIsPresent());
alert = arg1.switchTo().alert();
flag = true;
// alert.accept();
} catch (NoAlertPresentException NofindAlert) {
// TODO: handle exception NofindAlert.printStackTrace();
// throw NofindAlert;
} if (flag) {
alert.accept();
} }
  • 在初始化webdriver时对alert弹框进行全局设置
    @Test(enabled = false)
public void ff5() {
System.setProperty(key, value);
DesiredCapabilities dc = new DesiredCapabilities();
dc.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR,
UnexpectedAlertBehaviour.ACCEPT);
driver = new ChromeDriver(dc);
driver.get("file:///Users/user/Documents/qiaojiafei/seleniumtest.html");
driver.findElement(By.xpath("//*[@id='alert']/input")).click(); driver.findElement(By.xpath("//*[@id='alert']/input")).click();
}
  • 实现ITestListener接口,对代码可能会抛出的UnexpectedAlertBehaviour异常进行捕获

1.新建AlertListner类实现ITestListener,并重写onTestFailure方法

    @Override
public void onTestFailure(ITestResult result) {
// TODO Auto-generated method stub
System.out.println("into failure test");
Throwable throwable = result.getThrowable();
if(throwable instanceof UnhandledAlertException) {
System.out.println("get UnhandledAlertException la"+throwable.toString());
AlertListnerTest tb = (AlertListnerTest) result.getInstance();
WebDriver driver = tb.getDriver();
Alert alert = null;
boolean flag = false;
try { new WebDriverWait(driver,10).until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
flag = true;
//alert.accept();
} catch (NoAlertPresentException NofindAlert) {
// TODO: handle exception
System.out.println("进入onfail 异常catch");
NofindAlert.printStackTrace();
//throw NofindAlert;
} if(flag) {
alert.accept();
} }

2.再建一个测试类,在类前面一行加入监听@Listeners({ com.elong.air.tools.AlertListner.class }) ,测试类只需要写正常代码,不需要对可能会弹alert的弹框进行处理。

    @Test
public void ff6() {
System.out.println("jinru ff6test");
System.setProperty(key, value);
driver = new ChromeDriver();
driver.get("file:///Users/user/Documents/qiaojiafei/seleniumtest.html");
driver.findElement(By.xpath("//*[@id='alert']/input")).click(); driver.findElement(By.xpath("//*[@id='alert']/input"));
}

最后这个方法还存在瑕疵,需要后续优化,欢迎读者提出改进意见。

selenium对Alert弹框的多种处理的更多相关文章

  1. python工具 - alert弹框输出姓名年龄、求和

    使用python自带的tkinter库进行GUI编程,完成两个功能: (1)要求用户输入姓名和年龄然后打印出来 (2)要求用户输入一个数字,然后计算1到该数字之间的和 代码部分: # 导入tkinte ...

  2. 自定义alert弹框,title不显示域名

    问题: 系统默认的alert弹框的title会默认显示网页域名 解决办法: (修改弹框样式) (function() { window.alert = function(name) { $(" ...

  3. JavaScript实现自定义alert弹框

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAh0AAAFkCAYAAACEpYlzAAAfj0lEQVR4nO3dC5BddZ0n8F93pxOQCO

  4. 操作JavaScript的Alert弹框

    @Testpublic void testHandleAlert(){ WebElement button =driver.findElement(By.xpath("input" ...

  5. 仿写confirm和alert弹框

    在工作中,我们常常会遇到原生的样式感觉比较丑,又和我们做的项目风格不搭.于是就有了仿写原生一些组件的念头,今天我就带大家仿写一下confirm和alert样式都可以自己修改. 有些的不好的地方请指出来 ...

  6. 自定义alert弹框,title不显示域名(重写alert)

    问题: 系统默认的alert弹框的title会默认显示网页域名 解决办法: (修改弹框样式) (function() { window.alert = function(name) { $(" ...

  7. selenium常用api之切换:table切换、alert弹框切换、iframe框架切换

    10.查看浏览器打开了多少个table和当前页面在哪个table 测试:打开了浏览器后,打开了一个新的标签页之后,显示此时有2个table,浏览器中当前页面展示的是第2个页面,但是代码打印显示的仍然是 ...

  8. Python+Selenium - Alert弹框

    上面三种弹窗可以在浏览器的控制台做出效果,如下图 上面三种弹窗可以用alert方法处理 示例: #出现弹窗的操作xxxx# 切换al = driver.switch_to.alert# print(a ...

  9. 手写alert弹框(一)

    采用原生的JavaScript, html代码 <meta name="viewport" content="width=device-width, initial ...

随机推荐

  1. Hibernate框架与Mybatis框架的对比

    学习了Hibernate和Mybatis,但是一直不太清楚他们两者的区别的联系,今天在网上翻了翻,就做了一下总结,希望对大家有帮助! 原文:http://blog.csdn.net/firejuly/ ...

  2. WPF平台Grid控件性能比较

    WPF官方发布第一个版本至今已经有10年了, 我们几乎在同时也开始了XAML开发.即使经过多年打造,我们依旧尝试提高:我们真的成功打造了高效灵活的控件吗?我没有在其他地方找到任何关于优秀的WPF表格性 ...

  3. 转载:《TypeScript 中文入门教程》 17、注解

    版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 介绍 随着TypeScript和ES6里引入了类,现在在一些场景下我们会需要额外的特性 ...

  4. 从零开始学 Java - 搭建 Spring MVC 框架

    没有什么比一个时代的没落更令人伤感的了 整个社会和人都在追求创新.进步.成长,没有人愿意停步不前,一个个老事物慢慢从我们生活中消失掉真的令人那么伤感么?或者说被取代?我想有些是的,但有些东西其实并不是 ...

  5. 电脑上不安装Oracle时,C# 调用oracle数据库,Oracle客户工具

    Oracle的安装包通常都比较大,安装又比较费时,而且如果安装过程中不幸出错,各种蛋疼,即便是安装过N遍的老手,有时候安装起来也觉得挺烦.而工作中,通常服务器上面安装oracle就可以了,我们本地电脑 ...

  6. 2016第16本:TED演讲的秘密

    花0.01元抢购了<得到APP>中的<成甲说书:TED演讲的秘密>,不到30分钟的音频,感觉全是干货,基本不用看原书了.如果在以后的演讲中随便应用几条都可以让演讲水平提升一大截 ...

  7. Android Handler、Loop 的简单使用

    1.子线程和子线程之间的通信 package lib.com.myapplication; import android.os.Bundle; import android.os.Handler; i ...

  8. UIWebView加载本地html文件

    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(, , KScreenWidth, KScreenHeight-)]; ...

  9. tableView简单的动画效果

    tableView 中一些动画效果通常都是实现willDisplayCell的方法来展示出一些动画的效果 (1).带有3D效果的小型动态展示 -(void)tableView:(UITableView ...

  10. Java打印九九乘法表

    package com.czgo; /** * 九九乘法表 * * @author AlanLee * */ public class Print99 { public static void mai ...