特殊元素定位与操作(一)

2020-01-15  本文已影响0人  testerPM

------------------------------------模态框---------------------------------------
模态对话框:是指在用户想要对对话框以外的应用程序进行操作时,必须首先对
该对话框进行响应。如单击【确定】或【取消】按钮将该对话框关闭

三种模态框:
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窗口

上一篇下一篇

猜你喜欢

热点阅读