目录
自动化测试能够代替一部分的手工测试,自动化测试能够提高测试效率
(随着功能的增加,版本越来越多,版本回归的压力也越来越大,所以仅仅通过人工测试来回归所有的版本肯定是不行的,所以我们需要借助自动化来进行回归)
1)支持多浏览器,如Chrome、Firefox、IE、edge....
2)支持多系统,如Linux、Windows、MacOS
3)支持多语言,java,‘python...
4)selenium包底层有很多可以适用的API
5)开源免费
selenium工具包
Chrome浏览器
Chromedriver谷歌驱动
java版本最低为8
计算机里的驱动程序,可以让计算机和设备工作起来
打开浏览器也需要驱动
人工测试情况下(人工手动的驱动打开浏览器)
自动化:代码不能够直接打开浏览器,需要借助驱动程序来协助打开浏览器
代码可以驱使驱动来打开浏览器
selenium 驱动 浏览器 三者之间的关系

代码要发送请求——驱动接受请求——驱动解析请求
这.........驱动不就是一个服务器吗

运行一下驱动看一下

可恶....竟然真的占用了我们的9515端口,我们cmd看一下9515端口

果然被占了
百度以下 ”迪丽热巴“
新建一个maven项目,添加以下依赖:

自动化代码:
- package com.chaoyang.webautotest;
-
- import org.openqa.selenium.By;
- import org.openqa.selenium.chrome.ChromeDriver;
-
- public class FirstAutoTest {
- // 第一个简单的自动化实例
- public void dilirebaTest() throws InterruptedException {
- // 创建一个驱动对象来打开浏览器
- ChromeDriver driver = new ChromeDriver();
- Thread.sleep(1500);
- // 输入网址
- driver.get("https://www.baidu.com");
- Thread.sleep(1500);
- // 输入关键词
- driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
- Thread.sleep(1500);
- // 点击百度一下
- driver.findElement(By.cssSelector("#su")).click();
- Thread.sleep(1500);
- // 释放驱动对象,关闭浏览器
- driver.quit();
- }
- }
调用这个函数


完美运行!!!!
定位页面的元素
driver.findElement()
1、定位元素的方法
css选择器
基础选择器 id、类
复合选择器 子类、父类.....
ctrl + shift+c 打开谷歌浏览器页面选择器
点击选择地元素 copy ——selector即可

xpath
语法:
1)层级 / 次级 // 跳级
2)属性
3)函数 By.xpath (同样的复制粘贴即可)

2、操作元素
1)点击 click
提交 submit
可以click不一定可以submit,可以submit一定可以click
不建议使用submit
2)模拟输入
send_keys
3)clear清楚输入框输入地文本内容
4)gettext 获取文本
我们地代码执行速度通常来说是很快的,前端渲染的速度相对较慢,可能导致的结果:我们的代码已经执行到下一步了,前端页面还没渲染出来,元素找不到。
等待分为三个:
1)强制等待
让程序暂停,等待指定的时间后再运行
优点:语法简单,调试的时候用
缺点:等待固定的时间造成测试时间大量消耗,大大浪费了自动化的测试效率
2)隐式等待
在规定的时间内,等待元素出现之后立即结束。否则抛出异常
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));
隐式等待作用在webdriver的整个生命周期(quit之前)
优点:节省了大量的等待时间,元素展示之后就执行下一步,效率高
缺点:需要等待所有的元素渲染完成后才会执行下一步,仍然会有额外的时间上浪费
3)强制等待
可以针对某一个元素来进行测试
- WebDriverWait foo = new WebDriverWait(driver,Duration.ofSeconds(3000));
- foo.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#...")));
WebDriverWait(WebDriver,Duration)
第一个参数:webserver对象
第二个参数:Duration类方法,用于设置强制等待时间
class ExpectedConditions
unitl 等待到什么时间为止
优点:针对某一个元素进行等待,极大降低了自动化整体时间
缺点:写法复杂
代码可以同时使用显式等待和隐式等待?
不建议,隐式等待5s,显式等待10s,总等待10s,会出现意想不到的结果。。。
1)打印标题 getTitle()
- String title = driver.getTitle();
- System.out.println("title:" + title);
2)打印当前Url
- String url = driver.getCurrentUrl();
- System.out.println("期望的url:https://news.baidu.com/" );
- System.out.println("实际的url:" + url);
点击超链接后,程序很有可能不知道我们最新的页面是哪个
selenium依然会停留在原标签页
selenium对每一个标签页都给了唯一标识,
- public void windowTest() {
- // 每一个页面都有一个句柄(唯一标识)
- // 获取当前页面的句柄
- String windowHandle = driver.getWindowHandle();
- System.out.println("current-handle:" + windowHandle);
- }

最下面的就是标签页的唯一标识
如何获取所有页面的句柄呢?
- for (String window: handles) {
- if (window != windowHandle) {
- driver.switchTo().window(window);
- }
- System.out.println("实际的url:" + driver.getCurrentUrl());
- }
窗口的大小设置
- Thread.sleep(2000);
- // 窗口最大化
- driver.manage().window().maximize();
- Thread.sleep(2000);
- // 窗口最小化
- driver.manage().window().minimize();
- Thread.sleep(2000);
- // 窗口设置大小
- driver.manage().window().setSize(new Dimension(100,200));
selenium 不能直接编译js,但可以使用方法来执行 js
driver.executeScript()
导航的前进和后退
- driver.navigate().back;
- driver.navigate().forward();
有的弹窗你是无法定位到它的”确定“按钮的(警告弹窗)
因此需要使用 Selenium 中提供的 Alert 对象
- Alert alert = driver.switchTo().alert();
- // 确定
- alert.accept();
- // 取消
- alert.dismiss();
selenium 提供了鼠标和键盘的模拟操作
模拟鼠标,移动到指定元素点击
- // 模拟鼠标移动到我们想要移动的元素上,并点击
- WebElement element = driver.findElement(By.cssSelector("#id"));
- Actions actions = new Actions(driver);
- actions.clickAndHold(element).perform();
- actions.click(element).perform();
// 键盘的操作
- // 模拟键盘
- WebElement element = driver.findElement(By.cssSelector("#id"));
- element.sendKeys("selenium");
selenium 提供了 select 接口
- // 模拟选择框
- WebElement element = driver.findElement(By.cssSelector("#id"));
- Select select = new Select(element);
- // 从索引 0 开始计数 因此 1 是第二个
- select.selectByIndex(1);
- // 通过value值选
- select.selectByValue("10.1");
- // 通过可见的文本来选
- select.selectByVisibleText("text");
页面点击文件上传会弹出来系统窗口,我们不能用selenium操作系统窗口
- // 模拟文件上传
- // 通过send_keys方法输入我们想要上传的路径
- WebElement ele = driver.findElement(By.cssSelector("#id"));
- ele.sendKeys("D:\\1.txt");
代码的执行速度比页面更快,通过截图验证
- //屏幕截图
- File screenshotAs = driver.getScreenshotAs(OutputType.FILE);
- // 将截图文件保存到我们指定的路径下
- File filename = new File("./src/test/autoPic/my.png");
- FileUtils.copyFile(screenshotAs,filename);