美文网首页
特殊元素定位与操作(一)

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

作者: testerPM | 来源:发表于2020-01-15 14:36 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:特殊元素定位与操作(一)

          本文链接:https://www.haomeiwen.com/subject/ftpoactx.html