当想要定位iframe中的元素时,由于driver的焦点还停留在原页面,我们在iframe新的页面上定位元素时,自然会产生错误,所以我们需要将driver的焦点切换到iframe页面中
切换方式:
driver.switchTo().frame(webElement) // frame的元素对象 driver.switchTo().frame(frameId) // frame的id属性值 driver.switchTo().frame(frameName) // frame的name属性值
跳转到父级iframe中,如果是定级iframe,不会有任何变化
driver.switchTo().parentFrame()
回到默认内容页面(否则会找不到元素)
driver.switchTo().defaultContent()
如果只有一个iframe的情况下,driver.switchTo().parentFrame()和driver.switchTo().defaultContent()的效果是一样的。
Demo:
@Test public void test010() throws InterruptedException { WebDriver driver = new ChromeDriver(); Window window = driver.manage().window(); // 最大化 window.maximize(); driver.navigate().to("https://ke.qq.com/"); driver.findElement(By.id("js_login")).click(); Thread.sleep(2000); // 切换到iframe,通过WebElement元素对象切换 WebElement iframeEle = driver.findElement(By.xpath("//iframe[contains(@src,'low_login_enable')]")); driver.switchTo().frame(iframeEle); // 点击账号密码登录 WebDriverWait wait = new WebDriverWait(driver, 15); wait.until(ExpectedConditions.presenceOfElementLocated(By.id("switcher_plogin"))).click(); // 输入账号密码,点击登录 driver.findElement(By.id("u")).sendKeys("zzz"); driver.findElement(By.id("p")).sendKeys("bbb"); driver.findElement(By.id("login_button")).click(); // 切换回原html网页 driver.switchTo().parentFrame(); // 关闭窗口 driver.findElement(By.xpath("//i[@class='kc-login icon-font i-close']")).click(); }
被测html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>警告框处理</title> <script type="text/javascript"> function jinggao() { alert("这个窗口是警告框!"); print('你点击了确认'); } function queren() { var se = confirm("这个窗口是确认框!"); if (se == true) { print('你点击了确认1'); } else { print('你点击了取消1'); } } function duihua() { var se = prompt("这个窗口是对话框!","boge_blogs"); document.write(se); if (se != null) { print('你点击了确认2'); } else { print('你点击了取消2'); } } function print(text) { var dom = document.createElement('div') dom.innerText = text document.getElementsByTagName('body')[0].appendChild(dom) } </script> </head> <body> <input id="bu1" type="button" onclick="jinggao()" value="点击显示警告框"/> <br> <br> <input id="bu2" type="button" onclick="queren()" value="点击显示确认框"/> <br> <br> <input id="bu3" type="button" onclick="duihua()" value="点击显示对话框"/> </body> </html>
得到alert弹框:
Alert alert = driver.switchTo().alert(); // 获取alert弹框对象
常用方法:
alert.getText() // 获取警告框中的提示信息 alert.accept() // 确认 alert.dismiss() // 取消 alert.sendKeys(value) // 输入值value
警告框Demo:
@Test public void testDemo() throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("E:\\Notes\\Selenium\\Alert.html"); Window window = driver.manage().window(); // 最大化 window.maximize(); // 触发告警框 driver.findElement(By.id("bu1")).click(); Thread.sleep(3000); // 切换到告警框 Alert alert = driver.switchTo().alert(); // 获取文本值 System.out.println("告警框提示:" + alert.getText()); // 点击确认 alert.accept(); }
确认框Demo:
@Test public void testDemo() throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("E:\\Notes\\Selenium\\Alert.html"); Window window = driver.manage().window(); // 最大化 window.maximize(); // 触发确认框 driver.findElement(By.id("bu2")).click(); Thread.sleep(3000); // 切换到确认框 Alert alert = driver.switchTo().alert(); // 获取文本值 System.out.println("确认框提示:" + alert.getText()); // 点击确认 alert.accept(); }
对话框Demo:
@Test public void testDemo() throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("E:\\Notes\\Selenium\\Alert.html"); Window window = driver.manage().window(); // 最大化 window.maximize(); // 触发对话框 driver.findElement(By.id("bu3")).click(); Thread.sleep(3000); // 切换到对话框 Alert alert = driver.switchTo().alert(); // 获取文本值 System.out.println("对话框提示:" + alert.getText()); // 输入内容到对话框 Thread.sleep(3000); alert.sendKeys("boge_blogs"); // 点击确认 alert.accept(); driver.quit(); }
当我们点击了a标签元素时,会触发打开链接页面的事件,有两种情况:
1.在当前窗口加载新页面的内容
2.新建一个窗口加载新页面内容,这种情况在a标签有target="_blank"时触发
当发生这两种情况时,同iframe类似,我们需要切换窗口
切换方式:
传入要操作窗口的handle句柄
driver.switchTo.window(nameOrHandle);
如何获取到窗口的句柄
driver.getWindowHandle(); // 获取当前操作窗口的句柄 driver.getWindowHandles(); // 获取打开的所有窗口句柄
窗口切换Demo:
@Test public void testDemo() throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("https://www.baidu.com"); Window window = driver.manage().window(); // 最大化 window.maximize(); // 打开新闻之前的所有窗口句柄 Set<String> windowHandles = driver.getWindowHandles(); System.out.println("打开新闻之前的所有窗口句柄: " + windowHandles); // 点击新闻 driver.findElement(By.xpath("//a[text()='新闻']")).click(); // 打开新闻之后的所有窗口句柄 Set<String> windowHandlesAfter = driver.getWindowHandles(); System.out.println("打开新闻之后的所有窗口句柄: " + windowHandlesAfter); // 循环遍历所有的窗口句柄 for (String handle:windowHandlesAfter) { // 判断是否是对应的句柄,用url也可以 if (driver.getTitle().equals("百度新闻——海量中文资讯平台")) { break; }else { // 切换窗口 driver.switchTo().window(handle); } } // 点击贴吧 driver.findElement(By.xpath("//a[text()='贴吧']")).click(); }
窗口切换的地方可以抽取成公共方法:
/** * function: 公共窗口切换 * @param title 标题名称 */ public void switchWindow(String title) { Set<String> allHandles = driver.getWindowHandles(); for (String handle:allHandles) { // 判断是否是对应的句柄,用url也可以 if (driver.getTitle().equals(title)) { break; }else { // 切换窗口 driver.switchTo().window(handle); } } }