环境搭建

Selenium 官网:有详细的 API 使用文档、组件及浏览器驱动下载、Maven 依赖查询等信息。

Chrome Driver 安装:

通过将包含 WebDriver 二进制文件的文件夹添加到系统 path 环境变量中,Selenium 将能够找到其他二进制文件,而无需您的测试代码来定位驱动程序的确切位置。这样更方便调用 driver,不用再在 IDE 中去配置 driver 路径。

示例:Maven 依赖

        <!-- selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.4.0</version>
        </dependency>

示例:Selenium 测试代码

import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Demo1 {

    @Test
    void testDriverDemo() {
        // System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");  // 手动指定浏览器驱动的路径
        // 初始化浏览器driver对象
        WebDriver driver = new ChromeDriver();
        // 访问指定网页
        driver.get("https://www.baidu.com");
        // 获取并打印页面标题
        System.out.println(driver.getTitle());
        // 关闭浏览器窗口
        driver.quit();
    }
}
  • 示例:其余浏览器驱动
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.opera.OperaDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;

WebDriver driver = new FirefoxDriver();  // Firefox浏览器
 
WebDriver driver = new EdgeDriver();  // Edge浏览器
 
WebDriver driver = new InternetExplorerDriver();  // Internet Explorer浏览器
 
WebDriver driver = new OperaDriver();  // Opera浏览器
 
WebDriver driver = new PhantomJSDriver();  // PhantomJS(无头浏览器)

元素定位 API
driver.findElement(By.id("页面元素的id值"));

driver.findElement(By.name("页面元素的name值"));

driver.findElement(By.xpath("XPath定位表达式"));

driver.findElement(By.cssSelector("CSS定位表达式"));

driver.findElement(By.linkText("链接的全部文本"));

driver.findElement(By.partialLinkText("链接的部分文本"));

// 定位一组元素
List<WebElement> links = driver.findElements(By.partialLinkText("链接的部分文本"));
// 根据索引获取一组元素中的指定元素
WebElement link = links.get(1);

driver.findElement(By.className("页面元素的Class属性值"));

driver.findElement(By.tagName("HTML标签名"));

元素基本操作 API

定位只是第一步,定位之后需要对这个元素进行操作,如单击(按钮)或输入(输入框) 等。

下面就来认识这些最常用的方法:

  • clear():用于清除文本输入框中的内容。
  • sendKeys():模拟键盘向输入框里输入内容。但是它的作用不仅于此,我们还可以用它发送键盘按键,甚至用它来指定上传的文件。
  • click():用于单击一个元素,前提是它是可以被单击的对象。它与 sendKeys() 方法是 Web 页面操作中最常用到的两个方法。其实 click() 方法不仅仅用于单击一个按钮,它还可以单击任何可以单击的文字/图片链接、复选框、单选框、下拉框等。
  • submit():用于提交表单。例如在搜索框输入关键字之后的“回车”操作,就可以通过 submit() 方法模拟。
  • getSize():返回元素的尺寸。
  • getText():获取元素的文本。
  • getAttribute(name):获得 name 属性的 value 值。
  • isDisplayed():设置该元素是否用户可见。
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com/");

WebElement search_text = driver.findElement(By.id("kw"));
WebElement search_button = driver.findElement(By.id("su"));

search_text.sendKeys("Java");
search_text.clear();
search_text.sendKeys("Selenium");
search_button.click();  // 或 search_text.submit();

//获得百度输入框的尺寸
WebElement size = driver.findElement(By.id("kw"));
System.out.println(size.getSize());  // (500, 22)

//返回百度页面底部备案信息
WebElement text = driver.findElement(By.id("cp"));
System.out.println(text.getText());  // ©2017 Baidu 使用百度前必读 意见反馈 京 ICP 证 030173 号 京公网安备 11000002000001 号

//返回元素的属性值, 可以是 id、 name、 type 或元素拥有的其它任意属性
WebElement ty = driver.findElement(By.id("kw"));
System.out.println(ty.getAttribute("type"));  // text

//返回元素的结果是否可见, 返回结果为 true 或 false
WebElement display = driver.findElement(By.id("kw"));
System.out.println(display.isDisplayed());  // true

控制浏览器操作

浏览器窗口大小

有时候我们希望浏览器能以某种尺寸打开,即访问的页面在这种尺寸下运行。例如可以将浏览器设置成移动端大小 (480*800),然后访问移动站点,对其样式进行评估。

WebDriver 提供了 manage().window().setSize() 方法来设置浏览器的大小。

  • maximize():设置浏览器最大化。
  • setSize():设置浏览器宽高。
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
 
public class Browser {
    public static void main(String[] args) throws InterruptedException {
        
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.cn");
        
        driver.manage().window().maximize();
        Thread.sleep(2000);
        
        driver.get("https://m.baidu.cn");
        driver.manage().window().setSize(new Dimension(480, 800));
        Thread.sleep(2000);
        
        driver.quit();
    }
}

浏览器后退、前进

在使用浏览器浏览网页时,浏览器提供了后退和前进按钮,可以方便地在浏览过的网页之间切换,WebDriver也提供了对应的 back() 和 forward() 方法来模拟后退和前进按钮。

  • back():模拟浏览器后退按钮。
  • forward():模拟浏览器前进按钮。
WebDriver driver = new ChromeDriver();

//百度图片首页
driver.get("https://image.baidu.com/");
System.out.printf("now accesss %s \n", driver.getCurrentUrl());
Thread.sleep(2000);

//点击“百度首页”链接
driver.findElement(By.linkText("百度首页")).click();
System.out.printf("now accesss %s \n", driver.getCurrentUrl());
Thread.sleep(2000);

//执行浏览器后退
driver.navigate().back();
System.out.printf("back to %s \n", driver.getCurrentUrl());
Thread.sleep(2000);

//执行浏览器前面
driver.navigate().forward();
System.out.printf("forward to %s \n", driver.getCurrentUrl());
Thread.sleep(2000);

刷新页面

//刷新页面
driver.navigate().refresh();

模拟鼠标操作(Actions)

Actions:执行 PC 端的鼠标点击、双击、右键、拖拽等事件。
TouchActions:模拟 PC 和移动端的点击、滑动、拖拽、多点触控等多种手势操作。

在 WebDriver 的 Actions 类(官方文档)中提供了以下常用的操作方法:

  • click:单击鼠标左键。
  • click_and hold:点击鼠标左键,不松开。
  • context_click:点击鼠标右键。
  • double_click:双击鼠标左健。
  • drag_and_drop:拖拽某个元素到目标位置后松开。
  • drag_and_drop_by_offset:拖拽某个元素到目标坐标后松开。
  • move_by_offset:鼠标从当前位置移动到某个坐标。
  • move to element:鼠标移动到某个元素。
  • move_to_element_with_offset:移动到距某个元素(左上角坐标)多少距离的位置。
  • release:在某个元素位置松开鼠标左键。
  • send_keys:发送某个键到当前元素。
  • key_down:按下某个键。
  • key_up:松开某个键。
  • perform:执行所有 Actions 中存储的行为(可以理解成是对整个操作的提交动作)。

Actions 动作链接:

执行原理:调用 Actions 的方法时,并不会立即执行,而是将所有的操作,按顺序存放在一个队列里。当调用 perform() 方法时,队列中的事件才会依次执行。

Actions 具体用法:

// 链式写法
Actions actions = new Actions(driver).moveToElement(ele).click().perform(ele);
// 分步写法
Actions actions = new Actions(driver);
actions.move_to_element(element);
actions.click(element);
actions.perform()

拖拽练习网址

按键练习网址

示例:

// 百度首页“设置”悬停下拉菜单
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com/");
WebElement search_setting = driver.findElement(By.id("s-usersetting-top"));
Actions action = new Actions(driver);
action.clickAndHold(search_setting).perform();

// 鼠标拖拽动作,将 source 元素拖放到 target 元素的位置
WebElement source = driver.findElement(By.name("element"));
WebElement target = driver.findElement(By.name("element"));
action.dragAndDrop(source,target).perform();

模拟键盘操作

Keys 类提供了键盘上几乎所有按键的方法。前面了解到,sendKeys() 方法可以用来模拟键盘输入。除此之外,我们还可以用它来输入键盘上的按键,甚至是组合键,如 Ctrl+A、 Ctrl+C 等。

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

WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");
WebElement input = driver.findElement(By.id("kw"));

// 输入框输入内容
input.sendKeys("seleniumm");
Thread.sleep(2000);

// 删除多输入的一个 m
input.sendKeys(Keys.BACK_SPACE);
Thread.sleep(2000);

// 输入空格键+“教程”
input.sendKeys(Keys.SPACE);
input.sendKeys("教程");
Thread.sleep(2000);

// ctrl+a 全选输入框内容
input.sendKeys(Keys.CONTROL, "a");
Thread.sleep(2000);

// ctrl+x 剪切输入框内容
input.sendKeys(Keys.CONTROL, "x");
Thread.sleep(2000);

// ctrl+v 粘贴内容到输入框
input.sendKeys(Keys.CONTROL, "v");
Thread.sleep(2000);

// 通过回车键盘来代替点击操作
input.sendKeys(Keys.ENTER);
Thread.sleep(2000);

以下为常用的键盘操作:

  • sendKeys(Keys.BACK_SPACE):回格键(BackSpace)
  • sendKeys(Keys.SPACE):空格键(Space)
  • sendKeys(Keys.TAB):制表键(Tab)
  • sendKeys(Keys.ESCAPE):回退键(Esc)
  • sendKeys(Keys.ENTER):回车键(Enter)
  • sendKeys(Keys.CONTROL, 'a'):全选(Ctrl+A)
  • sendKeys(Keys.CONTROL, 'c'):复制(Ctrl+C)
  • sendKeys(Keys.CONTROL, 'x'):剪切(Ctrl+X)
  • sendKeys(Keys.CONTROL, 'v'):粘贴(Ctrl+V)
  • sendKeys(Keys.F1):键盘 F1
  • ……
  • sendKeys(Keys.F12):键盘 F12

获取网页信息

不管是在做功能测试还是自动化测试,通常最后一步需要拿实际结果与预期进行比较,这个比较就称之为断言。

我们通常可以通过获取 title 、URL 和 text 等信息进行断言。

  • getTitle():用于获得当前页面的 title。
  • getCurrentUrl():用户获得当前页面的 URL。
  • getText():获取当前页面的文本信息。
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");

System.out.println("Search before================");

// 获取当前的 title 和 url
System.out.printf("title of current page is %s\n", driver.getTitle());
System.out.printf("url of current page is %s\n", driver.getCurrentUrl());

// 百度搜索
WebElement search = driver.findElement(By.id("kw"));
search.sendKeys("Selenium");
search.sendKeys(Keys.ENTER);
Thread.sleep(2000);

System.out.println("Search after================");

// 获取当前的 title 和 url
System.out.printf("title of current page is %s\n", driver.getTitle());
System.out.printf("url of current page is %s\n", driver.getCurrentUrl());

// 获取第一条搜索结果的标题
WebElement result = driver.findElement(By.xpath("//div[@id='content_left']/div/h3/a"));
System.out.println(result.getText());

元素等待方式

WebDriver 提供了两种类型的等待方法:显式等待和隐式等待。

隐式等待

全局设置一个等待时间,轮询查找(默认 0.5 秒)元素是否出现,如果没出现就抛出
异常。

// 隐式等待 5 秒
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SESONDS);

显式等待

WebDriver 提供了显式等待方法,可专门针对某个元素进行等待判断。

  • 在代码中定义等待条件,当条件发生时才继续执行代码。
  • WebDriverWait 配合 until() 方法,根据判断条件进行等待。
  • 程序每隔一段时间(默认为 0.5 秒)进行条件判断,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间则抛出异常。

具体格式:WebDriverWait(driver, 10, 1)

  • driver:浏览器驱动
  • 10:最长超时时间(默认以秒为单位)
  • 1:检测的的间隔时间(默认为 0.5s)
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.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");

// 原始元素定位及操作
// driver.findElement(By.id("kw")).sendKeys("selenium");

// 初始化显式等待条件
WebDriverWait wait = new WebDriverWait(driver, 10, 1);

// 显式等待 方式一:使用ExpectedConditions自带的API
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("kw"))).sendKeys("selenium");

// 显式等待 方式二:自定义功能
wait.until(new ExpectedCondition<WebElement>(){
    @Override
    public WebElement apply(WebDriver text) {
        return text.findElement(By.id("kw"));
    }
}).sendKeys("selenium");

浏览器窗口切换

在页面操作过程中,有时候点击某个链接会弹出新的浏览器窗口,这时就需要主机切换到新打开的窗口上进行操作。

WebDriver 提供了以下方法可以实现在不同的窗口之间切换:

  • getWindowHandle():获得当前浏览器窗口的句柄。
  • getWindowHandles():返回所有浏览器窗口的句柄。
  • switchTo().window(handle):用于切换到相应的浏览器窗口。

多窗口切换处理流程:

  1. 先获取到当前的窗口句柄:driver.getWindowHandle()
  2. 再获取到所有的窗口句柄:driver.getWindowHandles()
  3. 判断是否是想要操作的窗口,如果是,就可以对窗口进行操作;如果不是,跳转到另外一个窗口,对另一个窗口进行操作:driver.switchTo().window(handleName)

示例:以百度首页和百度注册页

WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");

// 获得当前窗口(百度首页)句柄
String search_handle = driver.getWindowHandle();

// 打开百度注册窗口
driver.findElement(By.linkText("登录")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("立即注册")).click();

// 获得所有窗口句柄
Set<String> handles = driver.getWindowHandles();

// 判断是否为注册窗口, 并操作注册窗口上的元素
for(String handle : handles) {
    if (handle.equals(search_handle)==false){
        // 切换到注册页面
        driver.switchTo().window(handle);
        System.out.println("now register window!");
        Thread.sleep(2000);
        driver.findElement(By.name("userName")).clear();
        driver.findElement(By.name("userName")).sendKeys("user name");
        driver.findElement(By.name("phone")).clear();
        driver.findElement(By.name("phone")).sendKeys("phone number");
        // ......
        Thread.sleep(2000);
        // 关闭当前窗口
        driver.close();
    }
}
Thread.sleep(2000);
driver.quit();

Frame 切换

在 Web 自动化中,如果一个元素定位不到,那么很大可能是由于元素是在 Frame 中。

什么是 Frame?

  • Frame 是 html 中的框架。在 html 中,所谓的框架就是可以在同一个浏览器中显示不止一个页面。
  • 基于 html 的框架,又分为垂直框架和水平框架(cols、rows)。

Frame 分类

  • Frame标签包含 frameset、frame、iframe 三种。
  • Frameset 和普通的标签一样,不会影响正常的定位,可以使用 index、id、name 等任意种方式定位。
  • 而 frame 与 iframe 对 selenium 定位而言是一样的。selenium 有一组方法对 frame 进行操作。

演示

Frame 存在两种:一种是嵌套的,一种是未嵌套的

  • 嵌套 frame 切换:

    • driver.switchTo.frame():根据元素 id 或者 index 切换 frame。
    • driver.switchTo.defaultContent():切换到默认 frame。
    • driver.switchTo.parentFrame():切换到父级 frame。
  • 未嵌套 frame 切换:

    • driver.switchTo().frame("frame的id"):根据 frame 的 id 来定位元素。
    • driverswitchTo().frame(“frame-index"):frame 无 id 的时候依据索引来处理。

示例:

WebDriver driver = new ChromeDriver();
driver.get("http://www.126.com");

WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe"));
driver.switchTo().frame(xf);
driver.findElement(By.name("email")).clear();
driver.findElement(By.name("email")).sendKeys("username");
driver.findElement(By.name("password")).clear();
driver.findElement(By.name("password")).sendKeys("password");
driver.findElement(By.id("dologin")).click();
driver.switchTo().defaultContent();
// ……

多浏览器支持
  • chrome、firefox、safari 等浏览器的自动化支持。
  • safari 需要设置 safaridriver--enable 才可以使用。

示例:传不同参数来测试不同的浏览器,用来做浏览器兼容性测试

public class BrowerTest {

    public static WebDriver driver;

    @BeforeAll
    public static void initData() {
        // 根据传入的browser参数,判断启动什么浏览器
        String browserName= System.getenv("browser");
        if (browserName.equals("chrome")) {
            System.setProperty("webdriver.chrome.driver", "D:\\chromedriver");
            driver = new ChromeDriver();
        } else if (browserName.equals("firefox")) {
            System.setProperty("webdriver.gecko.driver", "D:\\geckodriver");
            driver = new FirefoxDriver();
        }
    }

    @Test
    public void fun() {
        driver.get("https://home.testing-studio.com");
    }

    @AfterAll
    public static void tearDown() {
        driver.quit();
    }

}

命令执行

// windows
set browser="chrome"
mvn -Dtest=BrowserTest test  

// mac、linux
browser="chrome" mvn -Dtest=BrowserTest test

下拉框选择

WebDriver 提供了 Select 类来处理下接框。

示例:百度搜索设置的下拉框

<select id="nr" name="NR">
  <option value="10" selected>每页显示 10 条</option>
  <option value="20">每页显示 20 条</option>
  <option value="50">每页显示 50 条</option>
<select>

测试代码:

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.Select;
 
public class SelectDemo {
 
    public static void main(String[] args) throws InterruptedException {
 
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
 
        driver.findElement(By.linkText("设置")).click();
        driver.findElement(By.linkText("搜索设置")).click();
        Thread.sleep(2000);
 
        // 定位 <select> 标签下拉框
        WebElement el = driver.findElement(By.xpath("//select"));
        // Select 类用于定位 select 标签
        Select sel = new Select(el);
        // selectByValue() 方法符用于选取 <option> 标签的 value 值
        sel.selectByValue("20");
        Thread.sleep(2000);
 
        driver.quit();
    }
}

弹窗处理

在 WebDriver 中处理 JavaScript 所生成的 alert、confirm 以及 prompt 十分简单,具体做法是使用 switch_to_alert() 方法定位到 alert/confirm/prompt,然后使用 text/accept/dismiss/sendKeys 等方法进行操作。

  • getText():返回 alert/confirm/prompt 中的文字信息。
  • accept():接受现有警告框。
  • dismiss():解散现有警告框。
  • sendKeys(keysToSend):发送文本至警告框。
  • keysToSend():将文本发送至警告框。

示例:百度搜索设置弹出的窗口是不能通过前端工具对其进行定位的,这个时候就可以通过 switchTo().alert() 方法接受这个弹窗。

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
 
 
public class AlertDemo {
 
    public static void main(String[] args) throws InterruptedException {
 
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
 
        driver.findElement(By.linkText("设置")).click();
        driver.findElement(By.linkText("搜索设置")).click();
        Thread.sleep(2000);
 
        // 保存设置
        driver.findElement(By.className("prefpanelgo")).click();
 
        // 接受弹窗
        driver.switchTo().alert().accept();
        Thread.sleep(2000);
 
        driver.quit();
    }
}

文件上传

对于通过 input 标签实现的上传功能,可以将其看作是一个输入框,即通过 sendKeys() 指定本地文件路径的方式实现文件上传。

示例:创建 upfile.html 文件

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>upload_file</title>
    <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
    <div class="row-fluid">
    <div class="span6 well">
    <h3>upload_file</h3>
        <input type="file" name="file" />
    </div>
    </div>
</body>
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></scrip>
</html>

测试代码:

import java.io.File;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
 
public class UpFileDemo {
 
    public static void main(String[] args) throws InterruptedException {
 
        WebDriver driver = new ChromeDriver();
        File file = new File("./HTMLFile/upfile.html");
        String filePath = file.getAbsolutePath();
        driver.get(filePath);
 
        // 定位上传按钮, 添加本地文件
        driver.findElement(By.name("file")).sendKeys("D:\\upload_file.txt");
        Thread.sleep(5000);
 
        driver.quit();
    }
}

调用 JS

WebDriver 提供了 executeScript() 方法来执行 JavaScript 代码,这使得 Selenium 拥有更为强大的能力。既然能执行 JS,那么 JS 能做的事,Selenium 大部分也能做。

  • 直接使用 JS 操作页面,能解决很多 click() 不生效的问题。
  • 页面滚动到底部、顶部。
  • 处理富文本、时间控件等的输入。

Selenium 中如何调用 JS:

  • execute_script("JS 代码"):执行 JS
  • return:可以返回 JS 的返回结果

示例:JS 代码

window.alert('Selenium 弹框测试');
a = document.getElementById('kw').value;
document.title;

示例:Selenium 调用以上 JS 代码

JavascriptExecutor jsDriver = (JavascriptExecutor) driver;
jsDriver.execute_script("window.alert('Selenium 弹框测试')");
// 参数传递
jsDriver.execute_script("a=document.getElementById('kw').value;window.alert(a)");
String script = (String) jsDriver.executeScript("return document.getElementById('kw').value");

示例:时间控件

大部分时间控件都是 readonly 属性,需要手动去选择对应的时间,这在手工测试中很容易做到,而在自动化测试中则可以调用 JS 来操作。

处理时间控件:

  1. 要取消日期的 readonly 属性。
  2. 给 value 赋值。
  3. 写 JS 代码来实现如上的 1、2 点,再 WebDriver 对 JS 进行处理。

示例:用于调整浏览器滚动条位置的 JS 代码

<!--
  window.scrollTo() 方法用于设置浏览器窗口滚动条的水平和垂直位置。
    第一个参数表示水平的左间距;
    第二个参数表示垂直的上边距。
-->
window.scrollTo(0, 450);

测试代码:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.JavascriptExecutor;
 
public class JSDemo {
 
    public static void main(String[] args) throws InterruptedException {
 
        WebDriver driver = new ChromeDriver();
 
        // 设置浏览器窗口大小:目的是让窗口出现水平和垂直滚动条
        driver.manage().window().setSize(new Dimension(700, 600));
        driver.get("https://www.baidu.com");
 
        // 进行百度搜索
        driver.findElement(By.id("kw")).sendKeys("webdriver api");
        driver.findElement(By.id("su")).click();
        Thread.sleep(2000);
 
        // 将页面滚动条拖到底部
        ((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");
        Thread.sleep(3000);
 
        driver.quit();
    }
}

获取窗口截图

自动化测试用例是由程序去执行,因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因。

WebDriver 提供了截图方法 getScreenshotAs() 来截取当前窗口。

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.TakesScreenshot;
 
public class GetImg {
 
    public static void main(String[] args) {
 
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
 
        File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        try {
            FileUtils.copyFile(srcFile, new File("d:\\screenshot.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        driver.quit();
    }
}

脚本运行完成后打开 D 盘,就可以找到 screenshot.png 图片文件了。


浏览器 Cookie 操作

有时候我们需要验证浏览器中 Cookie 是否正确, 因为基于真实 Cookie 的测试是无法通过白盒测试和集成测试进行的。WebDriver 提供了操作 Cookie 的相关方法可以读取、 添加和删除 Cookie 信息。

WebDriver 操作 Cookie 的方法:

  • getCookies():获得所有 cookie 信息。
  • getCookieNamed(String name):返回字典的 key 为“name”的 Cookie 信息。
  • addCookie(cookie dict):添加 Cookie。“cookie_dict”指字典对象,必须有 name 和 value 值。
  • deleteCookieNamed(String name):删除 Cookie 信息。“name”是要删除的 cookie 的名称;“optionsString”是该 Cookie 的选项,目前支持的选项包括“路径”、“域”。
  • deleteAllCookies():删除所有 cookie 信息。

示例:通过 getCookies() 来获取当前浏览器的 cookie 信息

import java.util.Set;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.Cookie;
 
public class CookieDemo {
 
    public static void main(String[] args) {
 
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
 
        Cookie c1 = new Cookie("name", "key-aaaaaaa");
        Cookie c2 = new Cookie("value", "value-bbbbbb");
        driver.manage().addCookie(c1);
        driver.manage().addCookie(c2);
 
        // 获得 cookie
        Set<Cookie> coo = driver.manage().getCookies();
        System.out.println(coo);
 
        // 删除所有 cookie
        // driver.manage().deleteAllCookies();
 
        driver.quit();
    }
}