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所示的代码:
保存文件并将其更名为testPage.html,使用浏览器将其打开,单击不同的按钮,将会弹出对应的弹出对话框,接下来将在这个页面进行测试。
[b]1 Accept()[/b]
单击弹出对话框的确认按钮,可以同时对Alert、Confirmation以及Prompt使用。
依次单击这些按钮,弹出各种对话框并进行单击,为了看得清楚,每个单击操作后面都增加了3秒的延迟。
执行代码后,可以发现页面上依次弹出了Alert、Confirmation以及Prompt对话框,并依次单击了确定按钮。
[b]2 Dismiss()[/b]
单击弹出对话框的取消按钮,可以同时对Alert、Confirmation以及Prompt使用。不过对于Alert来说,Accept()和Dismiss()没有什么区别,所以完全不必对其使用Dismiss()。
依次单击这些按钮,弹出各种对话框并进行单击,为了看得清楚,每个单击操作后面都增加了3秒的延迟。
[b]3 SendKeys(keysToSend)[/b]
在弹出对话框框中输入文本,该方法只对Prompt弹出对话框有效。
单击“Prompt”按钮,弹出Prompt弹出对话框,然后输入一串文本。
[b]4 Text/getText()[/b]
Text/getText()用于获取弹出对话框的文本内容。
依次单击这些按钮,弹出各种弹出对话框并进行单击,同时输出它们的文本内容。
[b]1、alert弹框[/b]
这种弹出框处理应该毫无难度,网上也有很多介绍的,这边提供一个方法,见代码
程序清单
[b]2、非alert弹框[/b]
不管是JS自定义的弹出框还是windows弹出框,下面给出的方法都能准确定位
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,使用浏览器将其打开,单击不同的按钮,将会弹出对应的弹出对话框,接下来将在这个页面进行测试。
[b]1 Accept()[/b]
单击弹出对话框的确认按钮,可以同时对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对话框,并依次单击了确定按钮。
[b]2 Dismiss()[/b]
单击弹出对话框的取消按钮,可以同时对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();
}
[b]3 SendKeys(keysToSend)[/b]
在弹出对话框框中输入文本,该方法只对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("这就是输入的内容");
[b]4 Text/getText()[/b]
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();
[b]1、alert弹框[/b]
这种弹出框处理应该毫无难度,网上也有很多介绍的,这边提供一个方法,见代码
程序清单
//处理潜在的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;
}
[b]2、非alert弹框[/b]
不管是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;
}
}