【自动化测试】Selenium自动化测试框架 | 相关介绍 | Selenium + Java环境搭建 | 常用API的使用

文章目录

  • 自动化测试
    • 一、selenium
        • 1.相关介绍
          • 1.Selenium IDE
          • 2.Webdriver
            • webdriver的工作原理:
          • 3.selenium Grid
        • 2.Selenium + Java环境搭建
        • 3.常用API的使用
            • 1.定位元素
            • 2.操作测试对象
            • 3.添加等待
            • 4.打印信息
            • 5.浏览器的操作
            • 6.键盘事件
            • 7.鼠标事件
            • 8.定位一组元素
            • 9.多层框架定位
            • 10.下拉框处理
            • 11.处理alert弹窗
            • 12.上传文件操作
            • 13.截图

自动化测试

  • 单元测试、接口测试、UI自动化测试…

在这里插入图片描述

一、selenium

  • 是自动化测试框架
1.相关介绍
  • Selenium是web应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言。
  • 由Selenium IDE, Webdriver,Selenium Grid组成
1.Selenium IDE

​ Selenium IDE一个用于Selenium测试的完成集成开发环境,可以直接录制在浏览器的用户操作,并且 能回放,编辑和调试测试脚本。调试过程中可以逐步进行或调整执行的速度,并且可以在底部浏览日志出错信息。 录制的测试脚本可以以多种语言导出,比如java,C#,Python,Ruby等,方便掌握不同语言的测试人员操作。

2.Webdriver

​ Selenium RC 在浏览器中运行 JavaScript 应用,会存在环境沙箱问题,而WebDriver可以跳出 JavaScript的沙箱,针对不同的浏览器创建更健壮的,分布式的,跨平台的自动化测试脚本。基于特定语言(Java,C#,Python,Ruby,Perl,JavaScript等)绑定来驱动浏览器对Web元素进行操作和验证。

webdriver的工作原理:

​ 启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为 webdriver的remote server。 客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格 式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。 Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操 作。

3.selenium Grid

​ selenium Grid是一个服务器,提供对浏览器实例访问的服务器列表,管理各个节点的注册和状态信息。可以实现在同一时刻不同服务器上执行不同的测试脚本。

2.Selenium + Java环境搭建

在这里插入图片描述

下载浏览器驱动

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

    </dependencies>

引入依赖

    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");
    }

测试能否正确运行

3.常用API的使用
1.定位元素

findElement()

类选择器定位、xpath定位

    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");


        //找到百度搜索输入框
       // WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        //类选择器定位

        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        //XPath定位

        element.sendKeys("软件测试");
    }

CSS选择语法

id选择器

        WebElement element = webDriver.findElement(By.cssSelector("#kw"));
        //id选择器

类选择器

        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        //类选择器定位

xpath定位

1.绝对路径:以/html开头(/html/head/title)不常用

2.相对路径://开头

相对路径+索引: //form[1]/span[1]/input

 //form[1]/span[1]/input
 //form[1]/span[2]/input

相对路径+属性值

 //input[@class="s_ipt"]
 //input[@value="百度一下"]
 //input[@id="su"]

相对路径+通配符

 //*[@*="su"]

相对路径+ 文本匹配

//a[text()="文库"]

进行校验

        WebElement element = webDriver.findElement(By.cssSelector("#kw"));
        //id选择器

        element.sendKeys("软件测试");
        //输入软件测试

        webDriver.findElement(By.cssSelector("#su")).click();
        //找到百度一下按钮,进行点击

        sleep(3000);
        //校验
        //1.找到搜索结果

        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.get(i).getText().contains("测试")){
                flag = 1;
                System.out.println("测试通过");
                break;
            }
        }
        if (flag == 0){
            System.out.println("测试不通过");
        }

  • CSS选择器定位元素效率更高
2.操作测试对象

click点击对象

send_keys在对象上模拟按键输入

clear清除对象输入的文本内容

submit 提交

text 用于获取元素的文本信息

getAttribute 获取元素对应属性的值

    private static void test02() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        //添加参数,允许访问所有的页面
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        sleep(3000);
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("翁佳明java");
        //找到输入框进行搜索
        webDriver.findElement(By.cssSelector("#su")).click();
        //点击按钮
        sleep(3000);

        webDriver.findElement(By.cssSelector("#kw")).clear();
        //清空输入框中的数据

    }
  • 如果点击的元素放在form标签中,submit和click的效果是一样的。如果点击元素放在非form标签中,此时使用submit会报错。
//        webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).click();
        webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();
        //会出现报错

getAttribute 获取元素对应属性的值

        String buttonValue = webDriver.findElement(By.cssSelector("#su")).getText();
        System.out.println(buttonValue);
        //获取不到属性值,所以用getAttribute获取属性的值
        System.out.println(webDriver.findElement(By.cssSelector("#su")).getAttribute("value"));//百度一下
3.添加等待
  • sleep强制等待

  • 智能等待(隐式等待、显示等待)

    隐式等待:通常用于等待页面元素出现,而不是等待页面加载完成。在等待时间内不断查询是否定位到元素

            webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.HOURS);
    

    显示等待

            WebDriverWait wait = new WebDriverWait(webDriver,3000);
            wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div111 > p:nth-child(8) > span")));
           //没找到,报错
            wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
    
    
    

    隐式等待和显示等待之间的区别:

    • 隐式等待:等待加载页面上所有的元素,所有元素加载完成后,再执行后续代码。如果超过时间仍没有加载出来,就会报错。等待的是所以的元素。

    • 显示等待:设置的是等待的最长时间,只要满足了设置的条件,就可以执行后续的代码,等待的是设定的条件

4.打印信息

打印title 打印url

    private static void test05() {
        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 (url.equals("https://www.baidu.com/") && title.equals("百度一下,你就知道")){
            System.out.println("测试通过");
        }else {
            System.out.println("测试不提供");
        }
    }
5.浏览器的操作

1.浏览器前进

2.浏览器后退

    private static void test07() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //打开百度,搜索520
        webDriver.navigate().back();
        sleep(3000);
        //浏览器后退
        webDriver.navigate().refresh();
        sleep(3000);
        webDriver.navigate().forward();
        //浏览器前进
    }

3.浏览器滚动条操作

在console中输入

document.documentElement.scrollTop=1000;
        sleep(3000);
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
        //滚动:把webDriver强转成JS脚本执行JS代码

4.设置页面大小

        webDriver.manage().window().maximize();//最大化
        sleep(3000);
        webDriver.manage().window().fullscreen();//全屏
        sleep(3000);
        webDriver.manage().window().setSize(new Dimension(600,1000));

5.关闭浏览器

  • quit:关闭整个浏览器、会清空缓存
  • close:关闭当前页面(get的)、不会清空缓存
    private static void test10() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
//        webDriver.quit();退出整个浏览器
        webDriver.close();//关闭当前页面
    }

6.窗口切换

  • 元素默认是在get的页面当中查找元素的,如果跳转了页面,就需要进行切换
    private static void test10() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
//        webDriver.quit();退出整个浏览器
//        webDriver.close();
//        webDriver.getWindowHandles();//获取所有的窗口句柄
//
//        webDriver.getWindowHandle();//获取get打开的窗口句柄
        Set<String> handles = webDriver.getWindowHandles();
        String target_handle = "";
        for (String handle:handles){
             target_handle = handle;
        }//拿到最后一个handle
        webDriver.switchTo().window(target_handle);//进行窗口切换
        sleep(3000);
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();

6.键盘事件
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        //ctrl+A
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");
        sleep(3000);
        //ctrl+X
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");
        sleep(3000);

        //ctrl+V
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
        sleep(3000);
        
7.鼠标事件
        //找到图片按钮
        //进行鼠标右击
        WebElement element = 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(3000);
        actions.moveToElement(element).contextClick().perform();
        //没有perform就没有效果
8.定位一组元素

定位一组元素

   全选复选框
       webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);     
		List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
        for (int i = 0; i < webElements.size(); i++) {
            if (webElements.get(i).getAttribute("type").equals("checkbox")){
                webElements.get(i).click();
            }
        }
9.多层框架定位

​ 通过frame的id或者name或者frame自带的其它属性来定位框架,这里switchTo().frame把当前定位的主体切换了frame里

<iframe>中,定位不到<a>,会报错。需要进行主体的转换
        webDriver.switchTo().frame("f1");
        webDriver.findElement(By.cssSelector("body>div>div>a")).click();
    
10.下拉框处理
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(webElement);
        select.selectByIndex(1);//根据从0开始的索引选择
        select.selectByValue("12.51");//根据标签的value值选择	
11.处理alert弹窗
        webDriver.findElement(By.cssSelector("button")).click();
        sleep(3000);
        //alert弹窗的取消->点击按钮->在弹窗中输入“520”->alert弹窗的确认
        webDriver.switchTo().alert().dismiss();//取消
        sleep(3000);
        webDriver.findElement(By.cssSelector("button")).click();
        webDriver.switchTo().alert().sendKeys("520");
        sleep(3000);
        webDriver.switchTo().alert().accept();//确定

12.上传文件操作
        webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\test");
        //文件上传
13.截图

需要先添加依赖

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

    private static void test12() throws InterruptedException, IOException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        File screenshotAs = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
        //进行强转,进行截图
        FileUtils.copyFile(screenshotAs,new File("D://20240606jietu.png"));
        //把文件保存到磁盘中。
    }

点击移步博客主页,欢迎光临~

偷cyk的图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CO-DETR利用coco数据集训练和推理过程

CO-DETR利用coco数据集训练和推理过程&#xff0c;参考链接 Co-DETR训练自己的数据集 文章目录 前言训练过程推理过程总结 前言 环境&#xff1a;PyTorch 1.11.0 Python 3.8(ubuntu20.04) Cuda 11.3 先是在github上下载CO-DETR模型 !git clone https://github.com/Sense-X/Co…

新手教程系列 -- SQLAlchemy对同一张表联表两次

在开发过程中,我们经常会遇到对同一张表进行多次联表查询的需求。比如在查询航线时,我们希望将起飞和降落的机场名称代入结果中。为了实现这一目标,机场名称统一存放在 AirPort 表中。下面,我们将介绍如何通过 SQLAlchemy 实现这一需求。 问题描述 一般情况我们第一时间会…

针对VMWare无法使用鼠标功能键问题

在使用 VMWare 虚拟机的Ubuntu系统时发现无法使用许多鼠标带有额外的功能键&#xff0c;比如常用的前进后退&#xff0c;但是双系统中的Ubuntu没有问题&#xff0c;后来一搜发现是&#xff0c;虚拟系统中不支持这些功能键。因此我们对这个问题进行了解决。 解决方案 1.找到自…

Jenkins容器的部署

本文主要是记录如何在Centos7上安装docker,以及在docker里面配置tomcat、mysql、jenkins等环境。 一、安装docker 1.1 准备工作 centos7、VMware17Pro 1.2 通过yum在线安装dokcer yum -y install docker1.3 启动docker服务 systemctl start docker.service1.4 查看docke…

【AUTOSAR 基础软件】DEM模块详解(诊断故障管理)

文章包含了AUTOSAR基础软件&#xff08;BSW&#xff09;中DEM模块相关的内容详解。本文从ISO标准&#xff0c;AUTOSAR规范解析&#xff0c;ISOLAR-AB配置以及模块相关代码分析四个维度来帮读者清晰的认识和了解DEM这一基础软件模块。文中涉及的ISOLAR-AB配置以及模块相关代码都…

hive零基础入门

1、hive简介 hive&#xff1a;由facebook开源用于解决海量结构化数据的统计工具。 hive是基于Hadoop的数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供sql查询功能。 2、hive本质 hive的本质是HQL&#xff08;HiveSQL&#xff09;转化成MapR…

【人工智能】—XGBoost、CatBoost、LightGBM算法构建信用卡欺骗识别模型

引言 在金融领域&#xff0c;信用卡欺诈行为一直是银行和金融机构面临的一大挑战。随着电子商务的快速发展&#xff0c;信用卡欺诈事件的数量和复杂性都在不断增加。据统计&#xff0c;全球每年因信用卡欺诈造成的损失高达数十亿美元。因此&#xff0c;开发有效的欺诈检测系统…

检索增强生成 (RAG):揭开这一术语的神秘面纱并解释其带来的价值

一、介绍 如今&#xff0c;数据已成为新的黄金&#xff0c;而高效筛选这些丰富信息的能力则是成功企业脱颖而出的关键。Retrieval Augmented Generation&#xff08;RAG&#xff09;是创新的标杆&#xff0c;尤其是在知识管理领域。它不再只是为了存储信息&#xff0c;而是为了…

半小时速通Python爬虫!GitHub开源的Python爬虫入门教程

今天给小伙伴们带来了一篇详细介绍 Python 爬虫入门的教程&#xff0c;从实战出发&#xff0c;适合初学者。 小伙伴们只需在阅读过程紧跟文章思路&#xff0c;理清相应的实现代码&#xff0c;30 分钟即可学会编写简单的 Python 爬虫。 这篇 Python 爬虫教程主要讲解以下 5 部…

爆款短视频素材库有哪些?分享几个容易火的视频素材网站

当今自媒体时代&#xff0c;每位内容创作者都渴望制作出下一个爆款短视频。你是否在寻找那些能让你的视频迅速蹭热度的顶级素材库&#xff1f;本文将为你介绍几个视频素材库&#xff0c;它们或许能成为你成功的秘密武器。首先要提的&#xff0c;自然是著名的国内素材库——蛙学…

信创加密沙箱,是如何应对国产化系统加密下的场景的?

SDC信创加密沙箱作为一款基于国产操作系统&#xff08;如麒麟、统信等&#xff09;设计的安全防护工具&#xff0c;以安全沙箱为核心概念&#xff0c;对沙箱内的数据和应用进行全面保护&#xff0c;保障业务系统和核心资料的安全。 信创加密沙箱的背景与意义 在当前复杂的网络…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【15】异步_线程池

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【15】异步_线程池 初始化线程的 4 种方式开发中为什么使用线程池线程池七大参数线程池工作原理常见的 4 种线程池生产中如何使用线程池&#xff1f;CompletableFuture 异步编排—简介业务…

SpringBoot防抖方案(防止表单重复提交)

SpringBoot防抖方案&#xff08;防止表单重复提交&#xff09; 1.应用场景&#xff08;什么是防抖&#xff09; 所谓防抖&#xff0c;一是防用户手抖&#xff0c;二是防网络抖动。在Web系统中&#xff0c;表单提交是一个非常常见的功能&#xff0c;如果不加控制&#xff0c;容…

最新AIGC系统源码-ChatGPT商业版系统源码,自定义ChatGPT指令Promp提示词,AI绘画系统,AI换脸、多模态识图理解文档分析

目录 一、前言 系统文档 二、系统演示 核心AI能力 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI模型提问 文档分析 ​识图理解能力 3.2 GPts应用 3.2.1 GPTs应用 3.2.2 GPTs工作台 3.2.3 自定义创建Promp指令预设应用 3.3 AI专业绘画 3.3.1 文…

Linux——echo命令,管道符,vi/vim 文本编辑器

1.echo 命令 作用 向终端设备上输出字符串或变量的存储数据 格式 echo " 字符串 " echo $ 变 量名 [rootserver ~] # echo $SHELL # 输出变量的值必须加 $ /bin/bash [rootserver ~] # str1" 我爱中国 " # 自定义变量 echo 重定向输出到文件 ec…

【自然语言处理系列】手动安装和测试Spacy中en_core_web_sm模型的详细教程

摘要&#xff1a;本教程旨在为自然语言处理&#xff08;NLP&#xff09;初学者提供一个详细的指南&#xff0c;用于手动安装流行的NLP库Spacy及其英语模型en_core_web_sm。文章将逐步指导您如何安装Spacy库、查看其版本&#xff0c;确定并下载适合的en_core_web_sm模型版本&…

RedHat9 | podman容器

1、容器技术介绍 传统问题 应用程序和依赖需要一起安装在物理主机或虚拟机上的操作系统应用程序版本比当前操作系统安装的版本更低或更新两个应用程序可能需要某一软件的不同版本&#xff0c;彼此版本之间不兼容 解决方式 将应用程序打包并部署为容器容器是与系统的其他部分…

MySQL实训项目——学生成绩录入与分析系统

项目简述&#xff1a;在校园中&#xff0c;除了上课之外&#xff0c;我们会有许多大大小小的考试&#xff0c;本项目将实现对学生数据的增添&#xff0c;删除&#xff0c;查询与修改&#xff0c;能让教育者更好的了解学生情况&#xff0c;进而优化教学方法和管理策略。 1.建表…

揭秘系统架构:从零开始,探索技术世界的无限可能

文章目录 引言一、系统架构的基本概念二、系统架构的设计原则模块化可扩展性高可用性安全性 三、常见的系统架构模式1. **分层架构&#xff08;Layered Architecture&#xff09;**&#xff1a;2. **微服务架构&#xff08;Microservices Architecture&#xff09;**&#xff1…

【嵌入式DIY实例】-LCD ST7735显示LM35传感器数据

LCD ST7735显示LM35传感器数据 文章目录 LCD ST7735显示LM35传感器数据1、硬件准备与接线2、代码实现本文将介绍如何使用 LM35 模拟温度传感器构建一个简单的温度计,其中温度值打印在 ST7735 TFT 显示屏上(以摄氏度、开尔文度和华氏度为单位)。 ST7735 TFT是一款分辨率为128…