• 软件测试-Web自动化测试


    Web自动化测试

    1.什么是自动化测试

    自动测试指软件测试的自动化,根据预设的要求,采用一些工具来帮我们完成一些频繁操作的事情,然后评估运行结果。随着软件的更新迭代版本越来越多,仅仅通过人工测试回归所有的版本肯定是不现实的,因此自动化可以提高我们的测试效率。

    2.自动化测试的分类

    2.1单元测试

    主要针对于一个单元进行测试,测试效率高,Java中常采用Junit框架。

    2.2UI自动化测试

    指的是模拟用户手动操作来操作我们的程序,使用UI自动化测试更加贴近用户的操作,提高测试效率和准确性。一般采用一些自动化测试框架来实现,如Selenium等。

    1. Web端自动化测试
    2. 移动端自动化测试

    2.3接口自动化测试

    接口测试是对API的测试,相对于UI自动化更加容易实现,执行更加稳定。常用的工具有Postman等等。

    3.认识Senlenium自动化测试工具

    3.1Senlenium工具的优点

    1. 开源免费。
    2. 支持多浏览器,如chrome、edge、firefox等等。
    3. 支持多系统,Linux、Windows、MacOS。
    4. 支持多语言,Java、Python、JavaScript、C#、Kotlin
    5. 提供了很多可供测试使用的API。

    3.2环境部署

    1. 安装Chrome浏览器。
    2. 下载ChromeDriver驱动(需要下载和浏览器相应版本的驱动)。
    3. 配置Selenium工具包(Java最低版本要求8)。

    ChromeDriver:是一个独立的可执行文件,用于自动化操作Chrome浏览器。它是WebDriver的一部分,WebDriver是一个用于自动化web应用程序的工具。ChromeDriver通过与Chrome浏览器的DevTools协议进行通信来控制浏览器的行为。当我们编写自动化脚本时,需要先启动ChromeDriver,然后它才能与我们的浏览器进行交互。ChromeDriver可以模拟用户在浏览器中执行的各种操作,例如点击、输入、滚动页面等。

    3.3使用Selenium进行自动化测试

     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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3.3.2 对元素的基本操作

    1.查找元素

    通过By类标识元素并告诉findElemen查找元素的方式,findElement就能使用不同的选择方式来准确的查找元素。

    xpath:以层级的关系来定位页面元素。

    在这里插入图片描述

    在这里插入图片描述

    2.sendKeys

    给输入框/编辑框输入内容(非输入框也能使用,但是没有必要使用,使用也不会报错)。

    @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    3.click

    点击选中的元素.

    @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    4.submit

    应用于表单元素,可以不用操作提交按钮即可发送请求。(使用的较少一般使用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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    5.clear

    清除输入框/编辑框的内容。对于一些元素,比如复选框(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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    6.getText

    获取属性的文本

    在这里插入图片描述

    @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    7.getArrtibute

    获取属性值。

    @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    8.获取当前网页的title/url
    @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.3.3窗口操作

    设置打开浏览器的显示大小(最大化、最小化、全屏窗口、手动设置窗口大小)和页面切换等。

    1.设置窗口大小
    @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    2.窗口切换

    当我们执行自动化的过程中,如果窗口进行了切换,就会产生一个新的页面句柄,我们切换后的页面的元素元素选不到,因为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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    3.3.4屏幕截图

    可以将当前自动化执行的结果进行保存,方便查看是否有问题。

    @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注意:程序的执行速度比页面的渲染速度要快很多,会导致页面还没被渲染好,程序就会查找页面元素,导致查找不到,发生报错。通过截图的形式我们可以看到当前页面的渲染状态。

    3.3.5等待机制

    1.强制等待

    使用sleep方法,让程序强制睡眠等待。

    2.隐式等待

    隐式等待会在指定的等待时间内不停轮询查找元素,直到找到相关元素或者时间结束。要查找的元素出现了,那么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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    3.显示等待

    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注意:显式等待和隐式等待不能同时使用,可能会出现意想不到的结果。

    3.3.6浏览器导航

    @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3.3.7对弹窗的操作

    弹窗的类型有alert(警告)、confirm(确认)、prompt(提示)。

    处理弹窗的步骤:

    1. 将驱动对象作用于弹窗
    2. 选择相应的操作(确认、取消、输入)
    @Test
    public void testAlert() throws InterruptedException, IOException {
        Alert alert = chromeDriver.switchTo().alert();
        //往提示框中输入内容(输入框中看不见输入的内容)
        alert.sendKeys("hello");
        //点击确认按钮
        alert.accept();
        //点击取消按钮
        alert.dismiss();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.3.8选择框

    选择框的选中方式:

    1. 根据文件进行选择
    2. 根据属性值进行选择
    3. 根据序号进行选择
     @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("");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.3.9执行JS脚本

     @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.3.10文件的上传

    文件的上传本质上是选中本地的文件路径,因此我们只有修改上传文件元素的文件路径就行。

    @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    文件的上传

    文件的上传本质上是选中本地的文件路径,因此我们只有修改上传文件元素的文件路径就行。

    @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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    redis 源码分析 跳表实现
    【实战】Spring Cloud Stream 3.1+整合Kafka
    JQuery操作
    linux同步之原子操作(一)
    鲸探发布点评:9月20日发售FPX戒指、中山大学号科考船数字藏品
    基于智能合约的银行借贷方案设计与实现
    分析kdump(vmcore)
    kubernetes集群之调度系统
    刚学习网格布局写一个计算器模型
    数据结构(c语言版) 链表(单链表、双链表、循环单链表、循环双链表)
  • 原文地址:https://blog.csdn.net/qq_52763385/article/details/133365118