软件测试(自动化测试)

news2024/11/18 2:53:15

1. Selenium

1.1 Selenium是什么?

用来做web自动化测试的框架。

1.2 Selenium特点

支持各种浏览器,支持各种平台,支持各种语言,有丰富的API,

1.3 工作原理

在这里插入图片描述

1.4 Selenium环境搭建

  1. 下载配套浏览器及驱动
    这里使用Chrome浏览器演示:Chrome113 & ChromeDriver。(建议安装到同一目录下,方便管理)

  2. 创建一个Maven项目

在这里插入图片描述
3. 添加Selenium依赖

<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.7.2</version>
        </dependency>

在这里插入图片描述
4. 在Java包下新建一个类
在这里插入图片描述
5. 添加如下代码:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class Main {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        // 允许所有的请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
    }
}

  1. 启动运行代码。接下来会自动打开Chrome浏览器并进入百度首页。
    在这里插入图片描述
  2. 到此为止即可视为Selenium环境已经搭建好了。下面的暂时先不管在这里插入图片描述

1.5 Selenium API 详解

1.5.1 元素的定位

  1. CSS定位(效率比XPath高)
    定位元素findElement。
    CSS选择语法:
    id选择器:#id
    类选择器:.class
    标签选择器: 标签名
    后代选择器:父级选择器,子级选择器

2.

  1. XPath定位
    在这里插入图片描述

在这里插入图片描述

1.5.2 操作测试对象

click:点击测试对象
send_keys:在对象上模拟按键输入
代码示例:

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.chrome.ChromeOptions;

import java.util.List;

import static java.lang.Thread.sleep;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        // 找到百度输入框
        // CSS
        // webDriver.findElement(By.cssSelector('.bg s_ipt_wr new-pmd quickdelete-wrap'));
        // XPath
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        // 输入软件测试
        element.sendKeys("软件测试");

        // 找到“百度一下”按钮
        // 点击
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        // 校验
        // 找到搜索结果
        List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));
        for (int i = 0; i < elements.size(); i++) {
            System.out.println(elements.get(i).getText());
            // 如果返回的结果都有软件测试,则证明测试通过,否则不通过
            if (!elements.equals("软件测试")) {
                System.out.println("测试不通过");
            }else {
                System.out.println("测试不通过");
            }
        }
    }
}

在这里插入图片描述
clear:清除对象输入的文本内容

public static void test3() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        // 找到输入框,输入内容
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("内容");
        // 点击搜索
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //清空输入框
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }

submit:提交,如果点击的元素放在form标签中,此时使用submit实现的效果和click是一样的,如果点击的元素放在非form标签中,此时使用submit报错。
示例:submit()
在这里插入图片描述

 public static void test4() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[1]")).submit();

    }

在这里插入图片描述

示例:click()

 public static void test4() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[1]")).click();

    }

在这里插入图片描述

text:用于获取元素的文本信息
getAttribute():获取属性值

public static void test5() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");

        String butten_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        
        // WebElement element = webDriver.findElement(By.cssSelector("#su"));
        // String butten_value = element.getAttribute("value");

        System.out.println(butten_value);
    }

在这里插入图片描述

1.5.3 等待

如果等待3天时间,强制等待一直等待,等待三天时间。
隐式等待最长等待三天时间,如果在三天时间内获取到页面上的元素,此时执行下面代码,如果等待三天时间还是没有找到这个元素,此时报错

  1. sleep强制等待

  2. 智能等待

    • 隐式等待
    • 显式等待

1.5.4 浏览器的操作

  1. 浏览器前进
  2. 浏览器后退
  3. 浏览器刷新

在这里插入图片描述

public static void test7() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("319");
        webDriver.findElement(By.cssSelector("#su")).click();
        // 浏览器后退
        webDriver.navigate().back();
        sleep(3000);
        // 浏览器刷新
        webDriver.navigate().refresh();
        sleep(3000);
        // 浏览器前进
        webDriver.navigate().forward();
        sleep(3000);
    }
  1. 浏览器滚动条操作
public static void test7() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("319");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        // 将webDriver强制转换JavascriptExecutor类型,执行JS代码
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
        // 窗口最大化
        webDriver.manage().window().maximize();
        sleep(3000);
        // 全屏展示
        webDriver.manage().window().fullscreen();
        sleep(3000);
        // 设置窗口大小
        webDriver.manage().window().setSize(new Dimension(800, 1000));
    }

在这里插入图片描述

1.5.5 键盘操作

public static void test8() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("123");
        sleep(2000);
        // CRL + A
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "a");
        sleep(2000);
        // CRL + X
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "x");
        sleep(2000);
        // CRL + V
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "v");

    }

1.5.6 打印信息

示例:

public static void test6() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");

        String url = webDriver.getCurrentUrl();
        String title = webDriver.getTitle();
        if (title.equals("百度一下,你就知道") && url.equals("https://www.baidu.com/")){
            System.out.println("测试通过");
        }else {
            System.out.println("测试失败");
            System.out.println(title);
            System.out.println(url);
        }
    }

在这里插入图片描述

1.5.7 鼠标操作

public static void test9() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        // 找到图片按钮
        WebElement webElement = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));
        // 鼠标右击
        Actions actions = new Actions(webDriver);
        sleep(1000);
        actions.contextClick(webElement).perform();
        sleep(1000);

    }

在这里插入图片描述

1.5.8 定位一组元素

 public static void test10() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("xxxxxxxxxxxxxxxxxxxxxxxxxx");
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
        List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
        for (int i = 0;i < webElements.size(); i++) {
            // 如果每个元素type值等于checkbox进行点击
            // getAttribute("type") 获取元素的type属性值
            if (webElements.get(i).getAttribute("type").equals("checkbox")) {
                webElements.clear();
            }else {

            }
        }
    }

1.5.9 定位frame标签内的元素

在这里插入图片描述
在这里插入图片描述

1.5.10 定位下拉框中的选项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.5.11 上传文件

1.5.12 关闭浏览器

  1. quit关闭了整个浏览器,清空缓存
  2. close只关闭了页面,不清空缓存

2. 单元测试

注解:

  1. @Test
  2. @Disabled
  3. @AfterAll
  4. @BeforeEach
  5. @BeforeAll
  6. @AfterEach
    在这里插入图片描述
  • 参数化:

    1. 引入parameterized依赖

      • 单参数:@ValueSource()
          @ParameterizedTest
          @ValueSource(ints = {1,2,3})
          void Test(int num) {
               System.out.println(num);
         }
      

      在这里插入图片描述

        @ParameterizedTest
        @ValueSource(strings = {"1","2", "3"})
        void Test2(String str) {
             System.out.println(str);
        }
      

      在这里插入图片描述

      • 多参数
      • CSV获取参数
        在这里插入图片描述
      
        @ParameterizedTest
        @CsvFileSource(resources = {"test1.csv"})
        void Test3(String name) {
             System.out.println(name);
         }    
      

      在这里插入图片描述

      • 方法获取参数
         public static Stream<Arguments> Generator() {
         return Stream.of(Arguments.arguments(1,"张三"),
                Arguments.arguments(2,"李四"),
                Arguments.arguments(3,"王五")
        );
      }
      
      @ParameterizedTest
      @MethodSource("Generator")
      void Test4(int num,String str) {
         System.out.println(num+","+str);
      }
      

      在这里插入图片描述

  • 测试套件

    • 通过class运行测试用例
    • 通过包运行测试用例

1.1 配置测试用例执行顺序

示例:设置顺序

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Order {
    @ParameterizedTest
    @ValueSource(ints = {1,2,3})
    @org.junit.jupiter.api.Order(2)
    void Test1(int num) {
        System.out.println("Test1");
        System.out.print(num);
    }


    @ParameterizedTest
    @ValueSource(strings = {"1","2", "3"})
    @org.junit.jupiter.api.Order(1)
    void Test2(String str) {
        System.out.println("Test2");
        System.out.print(str);
    }

}

在这里插入图片描述
示例:随即执行

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.Random.class)
public class Order {

    @Test
    void Test1() {
        System.out.println("Test1");
    }

    @Test
    void Test2() {
        System.out.println("Test2");
    }
}

在这里插入图片描述

1.2 断言

  1. 断言相等
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class AssertTest {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void Test (int num){
        System.out.println(num);
        // 判断 num == 1 ?
        Assertions.assertEquals(num,1);
    }
}

在这里插入图片描述

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class AssertTest {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void Test (int num){
        System.out.println(num);
        // 判断 num == 1 ?
        Assertions.assertEquals(num,2);
    }
}

在这里插入图片描述
2. 断言不相等

1.3 Suite

  1. 指定Class
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectClasses({AssertTest.class,Main.class,Order.class})
// 依次执行 AssertTest.class、Main.class、Order.class 三个类中的测试方法
public class RunSuite {

}

在这里插入图片描述
2. 指定package
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1540632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vcs编译选项--不常用

1&#xff09;如何查看波形的毛刺&#xff08;glitch&#xff09; 参考&#xff1a;公众号&#xff1a;IC学社 需要添加仿真选项&#xff1a;fsdbglitch0 “值得说明的是&#xff0c;glitch 对 design 是非常不好的&#xff0c;需要规避&#xff0c;设计代码中应该具有检查 g…

Express:快速搭建Node.js应用的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

DataV 在HTML中使用

一&#xff1a;什么是DataV 介绍 | DataV (jiaminghi.com) 组件库基于Vue &#xff08;React版 (opens new window)&#xff09; &#xff0c;主要用于构建大屏&#xff08;全屏&#xff09;数据展示页面即数据可视化&#xff0c;具有多种类型组件可供使用&#xff1a;…

[leetcode] 138. 随机链表的复制

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 n…

Spring Bean加载优先级

当我们使用 ConditionalOnMissingBean / ConditionalOnBean注解去给某个 bean 注入赋予条件时&#xff0c;那在条件判断时我们需要确保条件判断过程所需的环境已准备好。 举个例子 下面的代码中有两个配置类&#xff0c;涉及两个 Bean 的注入 配置类 ConfigA 需要注入一个 A…

taro之Swiper的使用

图样&#xff1a; 往往我们需要轮播图去显示我们想要的图片之类的 这是工作的代码 <View classNametop-title><SwiperclassNamebanner-swiperinterval{3000}circularautoplay>{homeBannerList.map((item) > {return (<SwiperItem key{item.id}><View…

Linux之文件系统与软硬链接

前言 我们之前阐述的内容都是在文件打开的前提下, 但是事实上不是所有文件都是被打开的, 且大部分文件都不是被打开的(也就是文件当前并不需要被访问), 都在磁盘中进行保存. 那这些没有被(进程)打开的文件, 也是需要被管理的! 对于这部分文件核心工作之一是能够快速定位文件…

【C++】仿函数优先级队列反向迭代器

目录 一、优先级队列 1、priority_queue 的介绍 2、priority_queue 的使用 3、 priority_queue 的模拟实现 1&#xff09;priority_queue()/priority_queue(first, last) 2&#xff09;push&#xff08;x&#xff09; 3&#xff09;pop&#xff08;&#xff09; 4&#…

web自动化--元素定位之xpath和css

元素定位 xpath绝对路径相对路径案例xpath策略&#xff08;路径&#xff09;案例xpath策略&#xff08;层级、扩展&#xff09;属性层级与属性层级与属性拓展层级与属性综合 csscss选择器&#xff08;id、类、标签、属性&#xff09;id选择器类选择器标签选择器属性选择器案例-…

2024年 前端JavaScript Web APIs 第五天 笔记

5.1-BOM和延迟函数setTimeout 5.2-事件循环eventloop 1-》 3 -》2 1-》 3 -》2 5.3-location对象 案例&#xff1a;5秒钟之后自动跳转页面 <body><a href"http://www.itcast.cn">支付成功<span>5</span>秒钟之后跳转到首页</a><sc…

对话Midjourney创始人:图片仅是起步,人工智能将全面改变学习、创意和组织。

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ​ 发布在https://it.weoknow.com 关注我 Midjourney 是一家神奇的公司&#xff0c;11 人改变世界&#xff0c;创造伟大的产品。…

并发编程-Synchronized介绍(结合源码和hostpot说明)

目录 一、Synchronized 概述 二、Synchronized在并发编程中解决的问题 2.1 解决原子性问题 2.1.1 问题代码 2.1.2 执行结果 2.1.3 优化代码 2.1.4 测试结果 2.1.5 优化代码分析 2.1.5.1 编译java源文件程序 2.1.5.2 查看编译文件 2.1.5.3 分析编译文件 2.2 解决可见…

windows安装ssh

一、下载ssh https://github.com/PowerShell/Win32-OpenSSH/releases/download/v8.1.0.0p1-Beta/OpenSSH-Win64.zip 二、安装ssh 解压到C:\Program Files\OpenSSH-Win64 配置环境变量 把 C:\Program Files\OpenSSH-Win64 加到path环境变量里面 C:\Program Files\OpenSSH-Win64&…

百度文心一言(ERNIE bot)API接入Android应用

百度文心一言&#xff08;ERNIE bot&#xff09;API接入Android应用实践 - 拾一贰叁 - 博客园 (cnblogs.com) Preface: 现在生成式AI越来越强大了&#xff0c;想在android上实现一个对话助手的功能&#xff0c;大概摸索了一下接入百度文心一言API的方法。 与AI助手交换信息的…

elementary OS7 Ubuntu 22.04中硬盘挂载报错

elementary OS7 Ubuntu 22.04中硬盘挂载报错 背景目标思路解决方法 背景 上周末安装elementaryos7的过程中将windows10的引导文件搞丢了&#xff0c;这两天准备修复一下&#xff0c;保险期间将固态硬盘上的文件备份到移动硬盘上&#xff0c;备份过程中出现报错的问题&#xff…

DUKPT流程简析

文章目录 一、DUKPT流程简析 一、DUKPT流程简析 接着上一篇文章DUKPT讲 依旧引用上图&#xff0c;我们单看POS和Acquirer Host这两个结点之间&#xff08;其它结点之间的处理&#xff0c;基本类似&#xff09;&#xff1a; Acquirer在布放POS到商场时&#xff0c;已经提前给…

【C语言进阶篇】文件操作(上)

【C语言进阶篇】文件操作&#xff08;上&#xff09; &#x1f955;个人主页&#xff1a;开敲 &#x1f525;所属专栏&#xff1a;C语言 &#x1f33c;文章目录&#x1f33c; 1. 为什么使用文件&#xff1f; 2. 什么是文件&#xff1f; 2.1 程序文件 2.2 数据文件 2.3 文件名…

dubbo 源码系列之-集群三板斧---负载均衡(二)

在上一课时我们了解了 LoadBalance 接口定义以及 AbstractLoadBalance 抽象类的内容&#xff0c;还详细介绍了 ConsistentHashLoadBalance 以及 RandomLoadBalance 这两个实现类的核心原理和大致实现。本课时我们将继续介绍 LoadBalance 的剩余三个实现。 LeastActiveLoadBala…

模拟实现 atoi 函数

一、函数介绍 原型 int atoi(const char *nptr); 二、使用atoi 三、使用发现 可以发现&#xff1a;会先过滤掉空格&#xff0c;还能识别正负号&#xff0c;当第一次遇到正负号了&#xff0c;后面没接着是数字就返回0&#xff0c; 如果45 5aa 结果是45&#xff0c;说明前面识…

Pytorch CUDA Reflect Padding 算子实现详解

CUDA 简介 CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的一种并行计算平台和应用编程接口&#xff08;API&#xff09;&#xff0c;允许软件开发者和软件工程师使用NVIDIA的图形处理单元&#xff08;GPU&#xff09;进行通用计算。自2007…