特殊元素定位与操作(一)
------------------------------------模态框---------------------------------------
模态对话框:是指在用户想要对对话框以外的应用程序进行操作时,必须首先对
该对话框进行响应。如单击【确定】或【取消】按钮将该对话框关闭
三种模态框:
1.alert-----只有确定按钮
2.confirm---有 确定和取消按钮
3.通过div显示在页面最上层的内容
alert,confirm 等模态框的操作
当要操作页面上的alert警告框时,必须首先获取到alert警告提示框
得到alert框
Alert alert =driver.switchTo.alert();
常用api:
alert.getText();//获取警告框中的提示信息
alert.accept();//点击确认按钮
alert.dismiss();//点击取消
div类型的模态框:
在web页面框架中,使用div通过js层的控制弹出的窗口
div弹窗口属于本页面的,只是显示的层次在最上层
----------------------------------------alert模态框----------------------------------------
示例演示:
openBrowser("chrome");
driver.get("D:\\XX\\XX\\XX\\XX\\XX\\XX\\模态框\\alert.html");
driver.findElement(By.xpath("//input[@id='abtn']")).click();
//定位到弹窗并返回一个Alert
Alert alert = driver.switchTo().alert();
//获取alert弹窗里的文本信息
System.out.println(alert.getText());
// 点击弹窗上的确定按钮
alert.accept();
// 关闭Alert弹窗
alert.dismiss();//alert弹窗不点击确定是不会自动关闭的,所以这里调用dismiss()可以关闭弹窗
----------------------------------------confirm模态框---------------------------------
示例演示:
openBrowser("chrome");
driver.get("G:\\xx\\xx\\xx\\xx\\xx\\xx\\xx\confirm.html");
driver.findElement(By.xpath("//input[@id='abtn']")).click();
//定位到弹窗并返回一个Alert
Alert alert = driver.switchTo().alert();
//获取alert弹窗里的文本信息
System.out.println(alert.getText());
// 点击弹窗上的确定按钮
//alert.accept();
Thread.sleep(2000);
// 点击弹窗上的取消按钮
alert.dismiss();
----------------------------------div模态框-------------------------------------
openBrowser("chrome");
driver.get("http://120.78.128.25:8765/");
// 定位到元素并点击
driver.findElement(By.xpath("//a[@class='calculator-btn']")).click();
//设置元素等待时间---即:上面执行完click需要等待5秒
WebDriverWait wait = new WebDriverWait(driver, 5);
// 设置元素等待条件----5秒内判断元素是否可点击
WebElement until=
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='计算收益']")));
// 点击 计算收益
until.click();
疑问:下面代码为何找不到 元素 计算收益
openBrowser("chrome");
driver.get("http://120.78.128.25:8765/");
// 定位到元素并点击
driver.findElement(By.xpath("//a[@class='calculator-btn']")).click();
//1. 设置元素等待时间---即:上面执行完click需要等待5秒
WebDriverWait wait = new WebDriverWait(driver, 5);
//2. 5秒内不断找元素,直到找到
WebElement element = driver.findElement(By.xpath("//button[text()='计算收益']"));
/3. 设置元素等待条件----5秒内判断element是否可点击
WebElement until = wait.until(ExpectedConditions.elementToBeClickable(element));
// 点击 计算收益
until.click();
----------------------------------------iframe切换---------------------------------------
当你要操作页面内嵌套的iframe的元素时,一定要注意先切换到此内联框架iframe中
切换方式:
iframe的索引,在页面中的位置
driver.switchTo().frame(index);
iframe的name或id
driver.switchTo().frame(id);
driver.switchTo().frame(name);
回到默认内容页面(否则会找不到页面)
driver.switchTo().defaultContent();
案例:
腾讯课堂登录窗口
示例1:根据iframe的id进行定位
//1.打开浏览器
openBrowser("chrome");
//2.访问 html
driver.get("D:\\workspace2018\\demo\\iframe\\a.html");
//3.定位到a.html input元素输入 关键字 我是a
driver.findElement(By.xpath("//input[@id='aa']")).sendKeys("我是a");
//4.切换 iframe--根据iframe标签的id=bframe进行切换到b.html
driver.switchTo().frame("bframe");//直接输入id的属性值即可,不用加by
//5.定位到a.html嵌套的b.html input元素输入关键字 我是b
driver.findElement(By.xpath("//input[@id='bb']")).sendKeys("我是b");
示例2:显示等待切换iframe
// 1.打开浏览器
openBrowser("chrome");
// 2.访问 html
driver.get("D:\\workspace2018\\demo\\iframe\\a.html");
// 3.定位到a.html input元素输入 关键字 我是a
driver.findElement(By.xpath("//input[@id='aa']")).sendKeys("我是a");
// 4.使用显示等待切换 iframe--根据iframe标签的id=bframe进行切换到b.html
WebDriverWait wait = new WebDriverWait(driver, 5);//创建对实例---只是创建实例,5秒并未开始生效
//5.使用实例对象,调用until()方法,等待iframe可用并自动切换
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("bframe")));
// 6.定位到a.html嵌套的b.html input元素输入关键字 我是b
driver.findElement(By.xpath("//input[@id='bb']")).sendKeys("我是b");
//7.切换到c.html的iframe中
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("cframe")));
driver.findElement(By.xpath("//input[@id='cc']")).sendKeys("我是c");
//8.切回a.html
driver.switchTo().defaultContent();//默认切换回嵌套[b iframe,c iframe]的外面html页面
//9.为了看切回的效果,这里
driver.findElement(By.xpath("//input[@id='aa']")).sendKeys("我切回来了");
Thread.sleep(2000);
driver.quit();
注意:
1 上面演示的切换顺序:a->b->c-----------不能a直接切换c
2 切回默认页面:从里面(c)切回到最外面的页面(a)----不能c返回b
要想c返回b,需要先返回默认页面a,再从a切换到b
image.png
-------------------------------window切换----------------------------------------
多窗口切换
当要操作另外一个窗口页面中的元素时,一定要注意先切换窗口
切换方式:
传入操作窗口的name或者句柄handle
driver.switchTo().window(nameOrHandle);
如何获取到窗口的句柄
driver.getWindowHandle();//获取当前操作窗口的句柄
driver.getWindowHandles();//获取当前打开的所有窗口句柄
回到最开始窗口,使用:
driver.switchTo().window(first_window_handle);
案例1:
// 1.打开浏览器
openBrowser("chrome");
// 2.访问a.html
driver.get("D:\\workspace2018\\demo\\window\\a.html");
//(1)打印窗口句柄
System.out.println(driver.getWindowHandle());
// 3.打开b.html
driver.findElement(By.xpath("//a[@id='bb']")).click();
//(2)打印窗口句柄
System.out.println(driver.getWindowHandle());
// 获取所有打开的窗口句柄
Set<String> windowHandles = driver.getWindowHandles();
// 遍历所有句柄
for (String handle : windowHandles) {
// 切换窗口句柄
driver.switchTo().window(handle);
// 判断切换后的窗口句柄是不是我们要的窗口---根据窗口的title判断
if (driver.getTitle().equals("b.html")) {
break;// 一旦找到句柄,就跳转循环体
}
}
driver.findElement(By.xpath("//input[@id='bb']")).sendKeys("我已经切换到b.html");
Thread.sleep(2000);
driver.quit();
总结:
(1)和(2)打印出的句柄是一样的,每次重新执行代码,重新生成一个新的句柄
(1)和(2)相等是因为没有切换句柄
疑问:下面的代码切换了窗口句柄----为何打印出来的句柄还是一样的
// 1.打开浏览器
openBrowser("chrome");
// 2.访问 html
driver.get("D:\\workspace2018\\demo\\window\\a.html");
//3. 获取窗口a.html的句柄
String windowHandle = driver.getWindowHandle();
System.out.println(driver.getWindowHandle());
//4.切换窗口句柄
driver.switchTo().window(windowHandle);
//5.打开窗口b.html
driver.findElement(By.xpath("//a[@id='bb']")).click();
//6.获取窗口6.html的句柄
System.out.println(driver.getWindowHandle());
案例2:
package com.lemon.elementOperate;
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class SpecialOperate {
// 定义一个类变量driver,用来接收三个实现类返回的实例化对象
// WrbDriver是接口,ChromeDriver,FirefoxDriver,InternetExplorerDriver是接口的实现类
public static WebDriver driver;
public static void main(String[] args) throws InterruptedException {
// 1.打开浏览器
openBrowser("chrome");
// 2.访问a.html
driver.get("D:\\workspace2018\\demo\\window\\a.html");
// (1)打印窗口句柄
System.out.println(driver.getWindowHandle());
// 3.打开b.html
driver.findElement(By.xpath("//a[@id='bb']")).click();
// (2)打印窗口句柄
System.out.println(driver.getWindowHandle());
// 4.打开c.html
driver.findElement(By.xpath("//a[@id='cc']")).click();
// (5)打印窗口句柄
System.out.println(driver.getWindowHandle());
switchWindow("b.html");
driver.findElement(By.xpath("//input[@id='bb']")).sendKeys("我已经切换到b.html");
Thread.sleep(2000);
switchWindow("c.html");
driver.findElement(By.xpath("//input[@id='cc']")).sendKeys("我已经切换到c.html");
Thread.sleep(2000);
driver.quit();
}
public static void switchWindow(String title) {
// 获取所有打开的窗口句柄
Set<String> windowHandles = driver.getWindowHandles();
// 遍历所有句柄
for (String handle : windowHandles) {
// 切换窗口句柄
driver.switchTo().window(handle);
// 判断切换后的窗口句柄是不是我们要的窗口---根据窗口的title判断
if (driver.getTitle().equals(title)) {
break;// 一旦找到句柄,就跳转循环体
}
}
}
public static void openBrowser(String browser) {
if (browser.equals("chrome")) {
// 1.设置chromedriver驱动文件的路径
System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
// 2.打开浏览器
driver = new ChromeDriver();
// 4.退出浏览器即关闭浏览器
// quit是退出浏览器,close是只关闭当前打开的窗口,不等于关闭整个浏览器
// driver.quit();
}
}
}
总结:在a.html页面可以同时点击 b.html和c.html----因为窗口句柄没有切换,在a.html窗口页面点击打开b.html窗口,默认还在a.html窗口,所有可以再继续点击 打开c.html窗口