Selenium Webdriver 基础应用---蓝桥杯

一、介绍:

Selenium WebDriver 的浏览器操作包含两个部分,一个是浏览器的操作,包括了打开、关闭以及退出浏览器操作,还包含了一些获取浏览器信息的方法。另外一个是浏览器导航操作,也就是我们平时在页面中进行的刷新、前进以及后退等浏览器操作。

二、知识点

  • 浏览器的打开、关闭、退出
  • 获取浏览器当前页面的 URL 地址、Title 等
  • 浏览器页面切换
  • 浏览器导航操作,如刷新、前进、后退。
  • WebDriver 的 class name、id、name、CSS selector、link text、partial link text、Tag name、xpath 八种定位方式(之前的发布过
  • iFrame 表单定位方式
  • 元素操作 click、sendKeys、clear 以及 submit 等
  • 元素属性的获取,如 getText、getTagName、getAttribute 等
  • 元素属性的判断,如 isEnabled、isDisplayed、isSelected 等
  • 多选和单选框的定位与操作

三、浏览器操作

        1、窗口操作

Selenium 中提供了 window 接口用来控制浏览器窗口大小的设置及获取窗口的相关属性,如最大、最小、指定大小以及位置等。

window() 接口中的方法包含了以下几个:

  • window().maximize():最大化
  • window().fullscreen():全凭
  • window().getSize():获取大小
  • window().setSize(Dimension targetSize):设置大小
  • window().getPosition():获取位置
  • window().setPosition(Point targetPosition):设置位置

新建 WindowCommandTest 测试类,该类中测试上述几个方法,具体代码如下:

package cn.lanqiao.browser;

import org.apache.poi.ss.formula.functions.T;
import org.junit.Test;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class WindowCommandTest {

    @Test
    public void testWindow() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        String url = "https://www.lanqiao.cn/";
        driver.get(url);
        // 获取窗口的大小
        System.out.println("默认窗口大小为:");
        System.out.println(driver.manage().window().getSize());

        // 获取窗口的位置
        driver.manage().window().getPosition();

        Thread.sleep(3000);
        // 窗口最大化
        driver.manage().window().maximize();

        // 再次获取窗口的大小
        System.out.println("设置最大化后窗口的大小为:");
        System.out.println(driver.manage().window().getSize());

        Thread.sleep(3000);
        // 全屏
        driver.manage().window().fullscreen();

        Thread.sleep(3000);
        // 设置窗口为指定大小
        driver.manage().window().setSize(new Dimension(400, 200));

        Thread.sleep(3000);
        // 设置窗口位置
        driver.manage().window().setPosition(new Point(80, 100));

        // 获取窗口的位置
        System.out.println("此时窗口的位置为:");
        System.out.println(driver.manage().window().getPosition());
    }
}

执行上述代码,执行过程如下:

3-1-4

此时控制台输出内容如下:

默认窗口大小为:
(1050, 718)
设置最大化后窗口的大小为:
(1454, 752)
此时窗口的位置为:
(80, 100)

需要注意的是浏览器窗口的操作方法都是在 driver.manage() 下,无法直接使用 driver 调用 window() 相关方法的。

2、浏览器操作 

打开浏览器

WebDriver 的 get(String url) 方法可以打开浏览器并进入到指定的 URL 地址中,该方法接收一个 String 并且返回为空。

在 BrowserCommandTest 类中新建一个方法 testOpenBrowser,并在方法中调用 WebDriver 的 get 方法来打开浏览器,具体代码如下:

public class BrowserCommandTest {

    @Test
    public void testOpenBrowser() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        // 初始化 Chrome Driver
        WebDriver driver = new ChromeDriver();
        // 定义一个 url 变量
        String url = "https://www.lanqiao.cn/";
        // 调用 driver 的 get 方法打开 蓝桥云课官网
        driver.get(url);
    }
}

testOpenBrowser 方法中首先初始化了执行上述代码,浏览器自动化过程如下:

3-1-1

根据执行结果可以看出,浏览器在 WebDriver 的控制下自动打开了蓝桥云课首页。

获取当前页面的标题

WebDriver 的 getTitle() 方法可以获取当前页面的标题,该方法没有参数并且放回一个 String 类型的值。

在 BrowserCommandTest 类下新建一个测试方法 testGetPageTitle,具体代码如下:

public class BrowserCommandTest {

    @Test
    public void testGetPageTitle() throws Exception{

        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        // 初始化 Chrome Driver
        WebDriver driver = new ChromeDriver();
        // 定义一个 url 变量
        String url = "https://www.lanqiao.cn/";
        // 通过 title 变量接收 driver 的 getTitle 方法返回的值,即浏览器的 Title
        driver.get(url);
        String title = driver.getTitle();
        // 在控制台输出 title
        System.out.println(title);
    }
}

上述测试方法中,driver 调用 getTitle 方法可以返回当前浏览器的页面标题,执行 testGetPageTitle 方法,控制台输出内容如下:

连接高校和企业 - 蓝桥云课

根据控制台输出的内容可以确定,当前 Driver 位于蓝桥云课官网首页。

获取当前页面的 URL 地址

WebDriver 除了可以获取当前页面的 Title,还可以获取当前页面的 URL 地址,使用 WebDriver 的 getCurrentUrl() 方法即可获取,该方法返回一个 String 类型的值。

在 BrowserCommandTest 类中增加 testGetPageUrl 方法,该方法通过调用 WebDriver 的 getCurrentUrl() 方法来获取当前页面的 URL 地址,具体代码如下:

public class BrowserCommandTest {

    @Test
    public void testGetPageUrl() throws Exception {
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        // 初始化 Chrome Driver
        WebDriver driver = new ChromeDriver();
        // 定义一个 url 变量
        String url = "https://www.lanqiao.cn/";
        // 通过 currentUrl 变量来接收 driver 的 getCurrentUrl 方法返回的值
        driver.get(url);
        String currentUrl = driver.getCurrentUrl();
        // 输出 currentUrl 变量的内容
        System.out.println(currentUrl);
    }
}

执行上述测试方法,浏览器会自动打开蓝桥云课官网,并且会在控制台中输出当前页面的 URL 地址:

https://www.lanqiao.cn/

根据内容可以确定当前 WebDriver 位于蓝桥云课首页。

获取当前页面的 URL 地址以及标题可以用于在测试用例中进行断言,判断测试用例执行是否正确。

关闭浏览器

WebDriver 类中的 close() 方法可以关闭浏览器页面,但是不会关闭浏览器进程。

在 BrowserCommandTest 类中新增 testCloseBrowser() 方法,在该方法中调用 WebDriver 的 close() 方法,具体代码如下:

public class BrowserCommandTest {

    @Test
    public void testCloseBrowser() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        // 初始化 Chrome Driver
        WebDriver driver = new ChromeDriver();
        // 定义一个 url 变量
        String url = "https://www.lanqiao.cn/";

        try {
            // 打开浏览器进入蓝桥云课官网
            driver.get(url);
            // 等待或者休眠 3000ms
            Thread.sleep(3000);
            // 关闭当前浏览器窗口
            driver.close();
        } catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

上述代码中通过 Thread.sleep() 方法将线程休眠 3000ms 后在进行关闭操作,执行上述代码,浏览器执行过程如下:

3-1-2

可以看出浏览器打开后进入蓝桥云课首页 3000ms 后被自动关闭,但是此时浏览器进程并不会关闭。

退出浏览器

WebDriver 的 quit() 方法同样可以关闭浏览器,但是与 close() 方法不同的是,quit() 方法会彻底的关闭浏览器,即关闭浏览器的进程。

在 BrowserCommandTest 类中新建方法 testQuitBrowser,在该方法中调用 WebDriver 的 quit() 方法,具体代码如下:

public class BrowserCommandTest {

    @Test
    public void testQuitBrowser() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        // 初始化 Chrome Driver
        WebDriver driver = new ChromeDriver();
        // 定义一个 url 变量
        String url = "https://www.lanqiao.cn/";

        try {
            // 打开蓝桥云课官网
            driver.get(url);
            // 休眠 3000ms
            Thread.sleep(3000);
            // 退出当前浏览器进程
            driver.quit();
        } catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

执行上述测试方法 testQuitBrowser,根据执行过程可以判断 quit() 方法的执行效果与 close() 方法一样,都会关闭浏览器的页面,但是 quit() 方法同时也会关闭浏览器进程。

浏览器页面切换操作

在进行测试时常常会打开新的页面,Selenium 的 WebDriver 是默认在当前页面上进行操作的,所以如果我们想要在新打开的 Tab 页上进行操作,必须要切换到新的 Tab 页上。

每一个 Tab 页都有一个唯一标识即句柄,我们可以通过 getWindowHandles() 来获取浏览器的所有的句柄,该方法返回一个集合,切换句柄的时候我们需要使用到 driver.switchTo.window(tab) 方法来进行切换。

当我们在百度首页搜索蓝桥云课后,点击云课官网,此时会创建一个新的 Tab 页,我们以此为例,在 BrowserCommandTest 测试类中创建测试方法 testSwitchHandle,具体代码如下:

public class BrowserCommandTest {

    @Test
    public void testSwitchHandle() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();

        // 进入百度首页
        driver.get("https://www.baidu.com/");
        // 搜索框中输入 蓝桥云课
        driver.findElement(By.id("kw")).sendKeys("蓝桥云课");
        // 搜索蓝桥云课
        driver.findElement(By.id("su")).click();
        Thread.sleep(1000);
        // 点击第一个蓝桥云课官网
        driver.findElement(By.partialLinkText("蓝桥云课")).click();
        // 输出当前页面的标题
        System.out.println(driver.getTitle());

        // 获取当前窗口的句柄
        String baiduWindow = driver.getWindowHandle();
        // 定义变量保存蓝桥云课官网页面的句柄
        String lanqiaoWindow = null;
        Set<String> windowHandles = driver.getWindowHandles();

        // 循环所有的句柄
        for (String windowHandle : windowHandles) {
            // 如果当前句柄不是第一个百度窗口
            if (!windowHandle.equalsIgnoreCase(baiduWindow)){
                // 就将这个窗口句柄赋值给 lanqiaoWindow
                lanqiaoWindow = windowHandle;
                // 切换到 lanqiaoWindow
                driver.switchTo().window(lanqiaoWindow);
            }
        }
        
        Thread.sleep(5000);

        // 输出蓝桥云课页面的标题
        System.out.println(driver.getTitle());
        driver.quit();
    }
}

执行上述代码,控制台输出结果如下:

蓝桥云课_百度搜索
连接高校和企业 - 蓝桥云课

根据 driver 输出的页面标题,可以确定已经成功将 driver 切换到新的页面上了。

3、导航栏操作 

WebDriver 除了可以进行浏览器的启动关闭等操作,还可以进行导航操作,比如刷新、前进、后退等功能,这些方法都可以通过 WebDriver 的 navigate() 方法进行调用。

在 cn.lanqiao.browser 包下新建一个测试类 NavigationCommandTest,在该类中我们将通过 Junit 来测试 WebDriver 的各种导航操作方法。

WebDriver 的 navigate().to() 方法与 get() 方法效果类似,都可以启动浏览器并进入到指定的页面中。

在 NavigationCommandTest 类中创建 testNavigateTo() 测试方法,该方法调用 WebDriver 的 navigate().to() 来进入到指定的页面中,具体代码如下:

public class NavigationCommandTest {

    @Test
    public void testNavigateTo() throws Exception {
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        // 初始化 Chrome Driver
        WebDriver driver = new ChromeDriver();

        // 定义 URL 变量
        String url = "https://www.lanqiao.cn/";

        // 进入到指定的页面中
        driver.navigate().to(url);
    }
}

执行上述代码,浏览器会自动打开浏览器并进入到蓝桥云课首页,过程如下:

3-1-1

navigate().back() 方法可以使浏览器页面后退到上一个页面,navigate().forward() 方法可以使浏览器页面前进到下一个页面,作用与浏览器左上角的两个按钮的功能类似。

在 NavigationCommandTest 类中创建 testNavigateBackOrForward 方法,在该方法中调用 navigate().back() 和 navigate().forward() 两个方法来前进或者后退到具体页面,具体代码如下:

public class NavigationCommandTest {

    @Test
    public void testNavigateBackOrForward() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        // 初始化 Chrome Driver
        WebDriver driver = new ChromeDriver();
        
        // 定义两个 url 地址变量
        String url1 = "https://www.baidu.com/";
        String url2 = "https://www.lanqiao.cn/";

        // 进入到百度首页
        driver.get(url1);
        // 暂停2000ms
        Thread.sleep(2000);
        // 在进入到蓝桥云课官网
        driver.navigate().to(url2);
        // 暂停 2000ms
        Thread.sleep(2000);
        // 后退到百度首页
        driver.navigate().back();
        // 暂停 2000ms
        Thread.sleep(2000);
        // 在进入到蓝桥云课官网
        driver.navigate().forward();
    }
}

执行上述 testNavigateBackOrForward 测试方法,可以看出页面会首先进入百度页面,然后通过 navigate().to() 方法进入到蓝桥云课首页,接着通过 navigate().back() 方法后退回到百度首页,然后再通过 navigate().forward() 方法前进到蓝桥云课首页,具体过程如下:

3-1-3

refresh() 方法

WebDriver 的 navigate().refresh() 方法可以对浏览器当前页面进行刷新操作,作用与浏览器左上角的刷新按钮的功能一致。

在 NavigationCommandTest 类中创建 testNavigateRefresh() 方法,在该方法中调用 navigate().refresh() 刷新页面,并在 main 方法中调用 navigateRefresh(),具体代码如下:

public class NavigationCommandTest {

    @Test
    public void testNavigateRefresh() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        // 初始化 Chrome Driver
        WebDriver driver = new ChromeDriver();

        // 定义一个 url 变量
        String url = "https://www.baidu.com/";

        // 打开百度首页
        driver.get(url);
        // 休眠 3000ms
        Thread.sleep(3000);
        // 刷新页面
        driver.navigate().refresh();
    }
}

执行上述代码,可以到浏览器自动执行了刷新操作,过程如下:

3-1-4

4、元素操作 

click()

click() 方法可以对任何元素进行点击,一般我们会对按钮进行点击操作,driver.findElement() 会返回一个 WebElement 类,也就是一个 Web 元素,那么我们就可以通过调用 WebElement 的 click() 方法来对元素进行点击操作。

创建一个新的测试类 ElementCommandTest,输入如下代码:

package cn.lanqiao.elements;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ElementCommandTest {
    
    @Test
    public void testClick() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        String url = "https://www.lanqiao.cn/";

        driver.get(url);

        // 根据 partialLinkText 获取讨论区超链接元素
        WebElement discussLinkEle = driver.findElement(By.partialLinkText("讨论"));
        // 点击讨论区
        discussLinkEle.click();

        Thread.sleep(3000);
        // 最大化窗口,让登录按钮出现在窗口中
        driver.manage().window().maximize();

        // 根据 linkText 获取登录按钮
        WebElement loginBtnEle = driver.findElement(By.linkText("登录"));
        // 点击登录按钮
        loginBtnEle.click();

        Thread.sleep(1000);
        driver.quit();
    }
}

执行上述代码,执行过程如下:

3-3-1-1

超链接、按钮等元素都是可以进行点击的操作,并且会伴随着跳转页面或者提交等操作,其他元素可能再点击之后没有任何效果。

sendKeys() 和 clear()

sendKeys() 方法可以用于往输入框中输入指定的内容,clear() 方法可以用于清除输入的内容或者清除原本输入框中的默认内容,常用与各种表单中数据的填充。

创建测试方法 testSendKeysAndClear,具体代码如下:

package cn.lanqiao.elements;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ElementCommandTest {
    
    @Test
    public void testSendKeysAndClear() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        String url = "https://www.lanqiao.cn/";

        driver.get(url);
        
        // 定位 input 输入框
        WebElement input = driver.findElement(By.tagName("input"));
        // 输入 Selenium
        input.sendKeys("Selenium");

        Thread.sleep(3000);
        // 清空输入框
        input.clear();

        Thread.sleep(1000);
        driver.quit();
    }
}

执行上述代码,执行过程如下:

3-3-2

input 输入框或者其他文本输入框才可以进行 sendKeys() 操作和 clear() 操作,在进行输入操作时,可以先使用 clear() 清空原有内容,因为 sendKeys() 方法是追加操作。

submit()

submit() 方法用于表单的提交操作。

在 ElementCommandTest 测试类中新建测试方法 testSubmit(),我们以蓝桥云课首页的输入框为例,首先定位到该元素,然后输入字符串,最后进行提交操作,查看是否会执行搜索操作。

testSubmit() 方法的具体代码如下:

package cn.lanqiao.elements;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ElementCommandTest {

    @Test
    public void testSubmit() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        String url = "https://www.lanqiao.cn/";

        driver.get(url);

        // 定位蓝桥云课首页的input输入框
        WebElement input = driver.findElement(By.className("universal-header-search-input"));
        // 输入 Selenium 字符串
        input.sendKeys("Selenium");
        // 提交
        input.submit();
        
        Thread.sleep(1000);
        driver.quit();
    }
}

执行上述代码,控制台输出报错如下:

java.lang.UnsupportedOperationException: To submit an element, it must be nested inside a form element

这段报错的意思是要进行提交操作必须是在 form 表单中的元素才可以,否则会报异常,这是因为云课首页的 input 输入框并不是在一个 form 表单里,因此在使用 submit() 方法一定要注意该元素是否在 form 表单中。

百度首页的搜索输入框是在一个 form 表单中的,我们可以百度首页打开检查工具查看到,如下图所示:

3-3-5

这种情况是符合 submit() 方法的条件的,在 ElementCommandTest 测试类中新建测试方法 testSubmit2(),具体代码如下:

package cn.lanqiao.elements;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ElementCommandTest {

    @Test
    public void testSubmit2() throws Exception{
        // 设置 WebDriver 的路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\jingnan\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        String url = "https://www.baidu.com/";

        driver.get(url);

        // 定位百度首页的搜索输入框
        WebElement kw = driver.findElement(By.id("kw"));
        // 输入蓝桥云课
        kw.sendKeys("蓝桥云课");
        // 提交
        kw.submit();

        Thread.sleep(1000);
        driver.quit();
    }
}

执行上述测试代码,执行过程如下:

3-3-4

可以看到 submit() 方法成功的提交了数据,显示搜索的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值