自动测试指软件测试的自动化,根据预设的要求,采用一些工具来帮我们完成一些频繁操作的事情,然后评估运行结果。随着软件的更新迭代版本越来越多,仅仅通过人工测试回归所有的版本肯定是不现实的,因此自动化可以提高我们的测试效率。
主要针对于一个单元进行测试,测试效率高,Java中常采用Junit框架。
指的是模拟用户手动操作来操作我们的程序,使用UI自动化测试更加贴近用户的操作,提高测试效率和准确性。一般采用一些自动化测试框架来实现,如Selenium等。
接口测试是对API的测试,相对于UI自动化更加容易实现,执行更加稳定。常用的工具有Postman等等。
ChromeDriver:是一个独立的可执行文件,用于自动化操作Chrome浏览器。它是WebDriver的一部分,WebDriver是一个用于自动化web应用程序的工具。ChromeDriver通过与Chrome浏览器的DevTools协议进行通信来控制浏览器的行为。当我们编写自动化脚本时,需要先启动ChromeDriver,然后它才能与我们的浏览器进行交互。ChromeDriver可以模拟用户在浏览器中执行的各种操作,例如点击、输入、滚动页面等。
public void test1() throws InterruptedException {
//添加参数允许远程访问
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--remote-allow-origins=*");
//创建驱动对象
ChromeDriver chromeDriver = new ChromeDriver(chromeOptions);
//访问的网页
chromeDriver.get("http://www.baidu.com");
//寻找元素并在给元素输入内容
chromeDriver.findElement(By.xpath("//*[@id=\"kw\"]"))
.sendKeys("景甜");
chromeDriver.findElement(By.cssSelector("#su")).click();
//等等查看结果
Thread.sleep(10000);
//退出浏览器
chromeDriver.quit();
}
通过By类标识元素并告诉findElemen查找元素的方式,findElement就能使用不同的选择方式来准确的查找元素。
xpath:以层级的关系来定位页面元素。
给输入框/编辑框输入内容(非输入框也能使用,但是没有必要使用,使用也不会报错)。
@Test
public void testSendKeys() throws InterruptedException {
chromeDriver.get("http://www.baidu.com");
Thread.sleep(5000);
chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("杨颖");
Thread.sleep(5000);
chromeDriver.quit();
}
点击选中的元素.
@Test
public void testClick() throws InterruptedException {
chromeDriver.get("http://www.baidu.com");
Thread.sleep(5000);
chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("杨颖");
Thread.sleep(5000);
chromeDriver.findElement(By.cssSelector("#su")).click();
Thread.sleep(5000);
chromeDriver.quit();
}
应用于表单元素,可以不用操作提交按钮即可发送请求。(使用的较少一般使用click)。
@Test
public void testSubmit() throws InterruptedException {
chromeDriver.get("http://www.baidu.com");
Thread.sleep(5000);
chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("杨颖");
Thread.sleep(5000);
chromeDriver.findElement(By.cssSelector("#form")).submit();
Thread.sleep(5000);
chromeDriver.quit();
}
清除输入框/编辑框的内容。对于一些元素,比如复选框(checkbox)和单选框(radio button),使用clear()方法可能不会有任何效果,因为这些元素的选中状态不能通过clear()来清除。不能滥用。
@Test
public void testClear() throws InterruptedException {
chromeDriver.get("http://www.baidu.com");
Thread.sleep(5000);
chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("杨颖");
Thread.sleep(5000);
chromeDriver.findElement(By.cssSelector("#kw")).clear();
Thread.sleep(5000);
chromeDriver.quit();
}
获取属性的文本
@Test
public void testGetText() throws InterruptedException {
chromeDriver.get("http://www.baidu.com");
String text = chromeDriver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();
System.out.println(text);
chromeDriver.quit();
}
获取属性值。
@Test
public void testGetAttribute() throws InterruptedException {
chromeDriver.get("http://www.baidu.com");
String value = chromeDriver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title"))
.getAttribute("class");
System.out.println(value);
chromeDriver.quit();
}
@Test
public void testGetTitle() throws InterruptedException {
chromeDriver.get("http://www.baidu.com");
String title = chromeDriver.getTitle();
String url = chromeDriver.getCurrentUrl();
System.out.println(title);
System.out.println(url);
chromeDriver.quit();
}
设置打开浏览器的显示大小(最大化、最小化、全屏窗口、手动设置窗口大小)和页面切换等。
@Test
public void testScreenSize() throws InterruptedException {
chromeDriver.get("http://www.baidu.com");
//设置全屏
chromeDriver.manage().window().fullscreen();
Thread.sleep(5000);
//设置最小化
chromeDriver.manage().window().minimize();
Thread.sleep(5000);
//设置最大化
chromeDriver.manage().window().maximize();
Thread.sleep(5000);
//手动指定大小
chromeDriver.manage().window().setSize(new Dimension(1000, 500));
Thread.sleep(5000);
chromeDriver.quit();
}
当我们执行自动化的过程中,如果窗口进行了切换,就会产生一个新的页面句柄,我们切换后的页面的元素元素选不到,因为chromeDriver的操作的页面句柄是之前的页面句柄。因此我们可以通过切换操作的页面句柄来选择我们想要的元素。
@Test
public void testScreenHandle() throws InterruptedException {
chromeDriver.get("http://www.baidu.com");
Thread.sleep(3000);
chromeDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(4)"))
.click();
//获取浏览器所有页面的句柄
Set<String> windowHandles = chromeDriver.getWindowHandles();
String currentHandler = chromeDriver.getWindowHandle();
for(String h andle: windowHandles){
System.out.println(handle);
//切换到新的句柄进行操作
if(!currentHandler.equals(handle)){
chromeDriver.switchTo().window(handle);
}
}
//进行后续的操作
//注意超过两个页面就要另当别论了
chromeDriver.quit();
}
可以将当前自动化执行的结果进行保存,方便查看是否有问题。
@Test
public void testGetScreenShotAs() throws InterruptedException, IOException {
chromeDriver.get("http://www.baidu.com");
Thread.sleep(5000);
chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("杨颖");
chromeDriver.findElement(By.cssSelector("#su")).click();
Thread.sleep(5000);
//对当前页面进行截图,以文件形式保存
File screenshotAs = chromeDriver.getScreenshotAs(OutputType.FILE);
File file = new File("杨颖.png");
//将截图文件复制到file中
FileUtils.copyFile(screenshotAs, file);
Thread.sleep(5000);
chromeDriver.quit();
}
注意:程序的执行速度比页面的渲染速度要快很多,会导致页面还没被渲染好,程序就会查找页面元素,导致查找不到,发生报错。通过截图的形式我们可以看到当前页面的渲染状态。
使用sleep方法,让程序强制睡眠等待。
隐式等待会在指定的等待时间内不停轮询查找元素,直到找到相关元素或者时间结束。要查找的元素出现了,那么WebDriver就会立即执行接下来的操作。如果超过了设置的时间,元素还没有出现,那么WebDriver就会抛出异常。
@Test
public void testImplicitWaiting() throws InterruptedException, IOException {
chromeDriver.get("http://www.baidu.com");
chromeDriver.manage().timeouts().implicitlyWait(Duration.ofMillis(2000));
chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("杨颖");
chromeDriver.findElement(By.cssSelector("#su")).click();
//判定页面结果是否渲染成功
chromeDriver.findElement(By.xpath("//*[@id=\"2\"]/div/div/div[1]/a/i[1]"));
//对当前页面进行截图,以文件形式保存
File screenshotAs = chromeDriver.getScreenshotAs(OutputType.FILE);
File file = new File("杨颖.png");
//将截图文件复制到file中
FileUtils.copyFile(screenshotAs, file);
chromeDriver.quit();
}
Selenium中的显示等待是指使用WebDriverWait(driver, timeout).until(method, message)来等待某个条件满足。统会按照一定的时间间隔(这个间隔可以自定义)去检查(轮询)页面上的元素是否满足特定的条件。如果元素在指定的时间内出现了,那么程序就会继续执行下去;如果元素在指定的时间内没有出现,那么显式等待就会抛出一个异常。
@Test
public void testExplicitWaiting() throws InterruptedException, IOException {
chromeDriver.get("http://www.baidu.com");
chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("杨颖");
chromeDriver.findElement(By.cssSelector("#su")).click();
//判定页面结果是否渲染成功
new WebDriverWait(chromeDriver, Duration.ofSeconds(2)).until(chromeDriver->
chromeDriver.findElement(By.xpath("//*[@id=\"2\"]/div/div/div[1]/a/i[1]")));
//对当前页面进行截图,以文件形式保存
File screenshotAs = chromeDriver.getScreenshotAs(OutputType.FILE);
File file = new File("杨颖.png");
//将截图文件复制到file中
FileUtils.copyFile(screenshotAs, file);
chromeDriver.quit();
}
注意:显式等待和隐式等待不能同时使用,可能会出现意想不到的结果。
@Test
public void testNavigate() throws InterruptedException, IOException {
chromeDriver.get("http://www.baidu.com");
chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("杨颖");
chromeDriver.findElement(By.cssSelector("#su")).click();
//回退
Thread.sleep(5000);
chromeDriver.navigate().back();
Thread.sleep(5000);
//前进
chromeDriver.navigate().forward();
Thread.sleep(5000);
//刷新
chromeDriver.navigate().refresh();
Thread.sleep(5000);
chromeDriver.quit();
}
弹窗的类型有alert(警告)、confirm(确认)、prompt(提示)。
处理弹窗的步骤:
@Test
public void testAlert() throws InterruptedException, IOException {
Alert alert = chromeDriver.switchTo().alert();
//往提示框中输入内容(输入框中看不见输入的内容)
alert.sendKeys("hello");
//点击确认按钮
alert.accept();
//点击取消按钮
alert.dismiss();
}
选择框的选中方式:
@Test
public void testSelect() throws InterruptedException{
//获取选择框元素
WebElement element = chromeDriver.findElement(By.cssSelector(""));
//创建Select对象
Select select = new Select(element);
select.selectByIndex(1);
select.selectByValue("");
select.selectByVisibleText("");
}
@Test
public void testJS() throws InterruptedException {
chromeDriver.get("http://www.baidu.com");
chromeDriver.executeScript(
"let input = document.querySelector('#kw'); " +
"input.value = '杨颖'; " +
"let btn = document.querySelector('#su');" +
"btn.click()");
Thread.sleep(5000);
chromeDriver.quit();
}
文件的上传本质上是选中本地的文件路径,因此我们只有修改上传文件元素的文件路径就行。
@Test
public void testUploadFile() throws InterruptedException {
chromeDriver.get("file:///D:/360MoveData/Users/FORSE/Desktop/1.html");
chromeDriver.findElement(By.cssSelector("body > input[type=file]"))
.sendKeys("D:\\360MoveData\\Users\\FORSE\\Desktop\\1.html");
Thread.sleep(5000);
chromeDriver.quit();
}
文件的上传
文件的上传本质上是选中本地的文件路径,因此我们只有修改上传文件元素的文件路径就行。
@Test
public void testUploadFile() throws InterruptedException {
chromeDriver.get("file:///D:/360MoveData/Users/FORSE/Desktop/1.html");
chromeDriver.findElement(By.cssSelector("body > input[type=file]"))
.sendKeys("D:\\360MoveData\\Users\\FORSE\\Desktop\\1.html");
Thread.sleep(5000);
chromeDriver.quit();
}