自动化测试之Selenium

    • 自动化测试
    • Selenium介绍
    • 环境搭建
    • 如何操作浏览器
      • 定位元素
        • css类选择器定位元素
        • xpath定位元素
        • css选择语法
        • xpath选择语法
      • 常用操作
      • 添加等待
      • 打印信息
      • 浏览器更多操作
      • 键盘事件
      • 鼠标事件
      • 特殊场景
        • 只选复选框
        • iframe标签
        • 下拉框处理
        • 弹窗显示
        • 上传文件
      • 关闭浏览器
      • 切换窗口
      • 截图

自动化测试

自动化测试是无法完全代替手工测试;各有优点;自动化测试通常是解决操作重复性比较高
自动化测试:相当于将人工测试手段进行转换,让代码去执行
自动化分类:单元测试、接口测试、UI自动化测试

Selenium介绍

Selenium是什么:selenium是用来做web自动化测试框架
特点:支持各种浏览器,支持各种平台,支持各种语言 (Python,Java,C#,JS,Ruby…),有丰富的API
原理是什么:
在这里插入图片描述
点击run的时候;相当于创建一个http请求,,通过我们的自动化脚本给浏览器发送一个指令

环境搭建

1:下载谷歌浏览器
2:下载驱动 和浏览器版本尽量对应一下
在这里插入图片描述
3:环境变量配置;把驱动放到java bin目录;因为我们已经配置过java这里的环境变量

4:创建maven项目;导入依赖

<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>

5:代码测试
在这里插入图片描述
如果使用注释里的代码;注意里面填的是自己的Chrome.exe放的位置
在这里插入图片描述
在这里插入图片描述
表示:允许访问使用的请求

注意事项:这个谷歌浏览器自动更新挺烦人的;驱动又更不上;所以我们需要把自动更新关闭掉。如果出现已经更新了那就下载旧的版本;但是卸载后重新安装又可能出现以下问题
在这里插入图片描述
关闭自动更新
旧版本浏览器

如何操作浏览器

创建驱动基本是这个固定的写法;然后通过webDriver对象去操作浏览器的东西
在这里插入图片描述
在这里插入图片描述

定位元素

有id定位、name定位、pathname、css等超多定位;而我们学习;css、xpath;这两种几乎能囊括所有

css类选择器定位元素

现在我要用css类选择器选中百度文本框;然后输入一个软件测试
在这里插入图片描述
如果你找不到这个选择器;你就先打开开发者工具;然后在这个框里;右键检查
在这里插入图片描述
在这里插入图片描述
Web Element表示HTML元素。 Selenium WebDriver 将简单的Form元素封装为Web Element的对象。

xpath定位元素

xpath定位元素:
在这里插入图片描述

代码:

WebElement element1=webDriver.findElement(By.xpath("//*[@id=\"kw\"])"));

css选择语法

id选择器:#id
类选择器:.class
标签选择器:标签名
后代选择器:父级选择器 子级选择器
Css定位元素比xpath效率更高

xpath选择语法

绝对路径:/html/head/title(不常用)
在这里插入图片描述
相对路径:
相对路径+索引;索引是以1开头的;例如:form不写下标就默认第一个form。
在这里插入图片描述
定位到百度一下的按钮
在这里插入图片描述
相对路径+属性值:
在这里插入图片描述

相对路径+通配符:基于上面 (相对路径+属性值) 的简写
所有的属性值是s_ipt都找出来
在这里插入图片描述

相对路径+文本
在这里插入图片描述
总结:
在这里插入图片描述
最开始的复制xpath可不适合有全部的;因为他只选的是一个

代码示例:在百度搜索框输入 软件测试;然后点击搜索;最后把有a标签超链接的软件测试文字都选中。我们验证一些是否真的获取到这个软件测试 文字的超链接。findElements用于选中有多个;得用list接收

 private static void test01() throws InterruptedException {
        int flag = 0;
        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.xpath("//*[@id=\"kw\"]"));
        // 输入软件测试
        element.sendKeys("软件测试");
        // 找到百度一下按钮
        // 点击
        webDriver.findElement(By.cssSelector("#su")).click();
         Thread.sleep(300);
        // 校验
        // 找到搜索结果
        List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));
        for(int i = 0; i < elements.size(); i++) {
            // 如果返回的结果有软件测试,证明测试通过,否则测试不通过
            if(elements.get(i).getText().equals("测试")) {
                flag = 1;
                System.out.println("测试通过");
                break;
            }
        }
        if(flag == 0) {
            System.out.println("测试不通过");
        }
    }

常用操作

click 点击对象
send_keys 在对象上模拟按键输入
clear 清除对象输入的文本内容
submit 提交
text 用于获取元素的文本信息
click、send_keys、text我们上面已经测试过;就直接进入clear、submit学习

clear:比如清空我们刚才输入文本框的内容

webDriver.findElement(By.cssSelector("#kw")).clear();

submit:效果和click一样;提交和点击的结果一样。
有弊端;
如果点击的元素放在form标签中,此时使用submit实现的效果和click是一样的
如果点击的元素放在非form标签中,此时使用submit报错。所以推荐使用click

获取标签内的文本:getAttrbute
在这里插入图片描述
使用刚才的elements.getText()是获取不到的;因为这个不是标签中间的文字;而是标签里的属性文字
正确操作:

String button_value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");

添加等待

强制等待:sleep;固定要等多久
隐式等待:如果在等待的之内获取到页面上的元素,此时执行下面的代码;如果等待时间内还是没有找到这个元素,此时报错。(如果这个元素存在则继续往下执行;否则就在等元素找完都没发现这个元素;就不等了抛NoSuchElementExcetion异常)
在这里插入图片描述

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

显示等待:可以指定等待某一个元素
显示等待案例:

  // 创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com/");
       
        WebDriverWait wait = new WebDriverWait(webDriver, 1);
         // 判断元素是否可以被点击
//        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div111 ")));
        //等待浏览器的title是否包含"百度一下,你就知道";如果包含则继续执行、否则等待到超时
        wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));

打印信息

获取标题和URL
在这里插入图片描述

浏览器更多操作

浏览器前进:
浏览器后退:
浏览器刷新:
浏览器滚动条操作:
浏览器最大化
浏览器全屏:
浏览器指定大小高度:
浏览器前进后退;刷新都属于导航;所以这里是navigate。。而最大化属于窗口的;windows

 WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://wwww.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        webDriver.findElement(By.cssSelector("#su")).click();
        // 浏览器后退
        sleep(3000);
        webDriver.navigate().back();
        //浏览器刷新
        webDriver.navigate().refresh();
        // 浏览器前进
        webDriver.navigate().forward();
        
        //滚动条;需要借助js代码
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");//滚到最低端;越大相当于向下滚动的越多
		//浏览器最大化;
        webDriver.manage().window().maximize();
        sleep(3000);
        //浏览器全屏
        webDriver.manage().window().fullscreen();
        sleep(3000);
        //固定高度像素点大小;这里需要传一个dimension对象;
        webDriver.manage().window().setSize(new Dimension(600, 1000));

键盘事件

需要引入:keys 包 from selenium.webdriver.common.keys import Keys
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回车
send_keys(Keys.SPACE) #空格键
send_keys(Keys.ESCAPE) #回退键 (Esc)

      WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://wwww.baidu.com/");
        // 搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        // control+A
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "A");
        sleep(3000);
        // control+X
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "X");
        sleep(3000);
        // control+V
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "V");
        sleep(3000);

鼠标事件

要使用鼠标事件需要导入工具包:from selenium.webdriver.common.action_chains import ActionChains
执行所有存储的行为ActionChains类:
context_click()右击
double_click() 双击
drag_and_drop()拖动
move_to _element() 移动

在输入520后;选择到图片位置;进行右击

   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);
        // 找到图片按钮
        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(3000);
        actions.moveToElement(webElement).contextClick().perform();

这里css选择器你可以这样子复制:By.cssSelector(“#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic”));
在这里插入图片描述
.perform():上述的动作只是添加到构建器队列等待执行;需要调用此方法才是真正执行

特殊场景

只选复选框

需求;我把复选框选中;而单选框不需要
在这里插入图片描述
循环遍历这个选中input元素;判断是不是checkbox

    WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20230512testcode/src/main/Page/test01.html?_ijt=4brheilpuaaaoa465u843m3sth&_ij_reload=RELOAD_ON_SAVE"); //这个是自己用于测试这个场景使用的html网页
        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是当前元素属性
            if(webElements.get(i).getAttribute("type").equals("checkbox")){
                webElements.get(i).click();
            } else {
                // 否则什么也不操作
                ;
            }
        }

webElements.get(i).getAttribute(“type”)这个方法返回的是type这个属性的值
在这里插入图片描述

iframe标签

在这里插入图片描述
写id就能获取到:

  WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20230512testcode/src/main/Page/test02.html?_ijt=arpr09o5r3gegeidj4o2r6hc9b&_ij_reload=RELOAD_ON_SAVE");
        webDriver.switchTo().frame("f1");
        webDriver.findElement(By.cssSelector("body > div > div > a")).click();

下拉框处理

一般元素我们只需要一次定位;下拉框元素需要进行两次定位
在这里插入图片描述
根据值进行二次选择
在这里插入图片描述

 WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20230512testcode/src/main/Page/test03.html?_ijt=qje1h6c6groepeefv0ae9bnla2&_ij_reload=RELOAD_ON_SAVE");
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(webElement);
//        select.selectByIndex(3);
        select.selectByValue("12.51");

弹窗显示

在这里插入图片描述

  WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20230512testcode/src/main/Page/test04.html?_ijt=u8fai3bvc2dvsjigccqcapieg1&_ij_reload=RELOAD_ON_SAVE");
        webDriver.findElement(By.cssSelector("button")).click();//点击弹窗按钮
        sleep(3000);
        // alert弹窗取消
        webDriver.switchTo().alert().dismiss();
        sleep(3000);
        // 点击按钮
        webDriver.findElement(By.cssSelector("button")).click();
        // 在alert弹窗中输入你好呀
        webDriver.switchTo().alert().sendKeys("你好呀");
        // alert弹窗确认
        sleep(3000);
        webDriver.switchTo().alert().accept();

上传文件

       WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20230512testcode/src/main/Page/test05.html?_ijt=7asvni2vctahrdl90k8v4lvq5&_ij_reload=RELOAD_ON_SAVE");
        webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\untitled");

关闭浏览器

方式1:
webDriver.quit();

方式2:
webDriver.close();

quit关闭了整个浏览器,close只是关闭了当前的页面(就是最原始的那个;get方法申请的那个)
quit清空缓存,close不会清空缓存

切换窗口

如果我们进行打开新的页面;这时候我们想选择这个页面的元素;需要先切换一下页面。不然会报错;找不到元素;因为我们找元素是针对get方法的那个页面去找的;但是已经跳转了;所以还去webDriver找的话就不行了
在这里插入图片描述
怎么切换:
Set handles = webDriver.getWindowHandles();//获取到所有窗口句柄
我们可以通过遍历后获取到这个窗口句柄
String target_handle = “”;
for(String handle:handles) {
target_handle = handle;
}
通过 webDriver.switchTo().window(target_handle);切换窗口
webDriver.getWindowHandle()是获取当前窗口;我们要切换到原始窗口;还得要去获取全部窗口;然后遍历到我们想要的那个窗口;再进行切换。

截图

需要添加依赖
在这里插入图片描述

   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 file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(file, new File("D://20230521jietu.png"));

OutputType.FILE;表示截过来图片保存的类型;我们放到文件里;

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

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

相关文章

kafka复习:(11)auto.offset.reset的默认值

在ConsumerConfig这个类中定义了这个属性的默认值&#xff0c;如下图 也就是默认值为latest,它的含义是&#xff1a;如果没有客户端提交过offset的话&#xff0c;当新的客户端消费时&#xff0c;把最新的offset设置为当前消费的offset. 默认是自动提交位移的&#xff0c;每5秒…

Java后端开发面试题——消息中间篇

RabbitMQ-如何保证消息不丢失 交换机持久化&#xff1a; Bean public DirectExchange simpleExchange(){// 三个参数&#xff1a;交换机名称、是否持久化、当没有queue与其绑定时是否自动删除 return new DirectExchange("simple.direct", true, false); }队列持久化…

HTML番外篇(五)-移动端适配

一、媒体查询 1.认识媒体查询 媒体查询是一种提供给开发者针对不同设备需求进行定制化开发的一个接口。 你可以根据设备的类型&#xff08;比如屏幕设备、打印机设备&#xff09;或者特定的特性(比如屏幕的宽度)来修改你的页面。 媒体查询的使用方式主要有三种&#xff1a;…

人工智能技术

人工智能技术是什么&#xff1f; 人工智能技术&#xff08;Artificial Intelligence Technology&#xff0c;AI技术&#xff09;是一种模仿人类智能和思维方式的计算机技术&#xff0c;旨在使计算机能够执行需要人类智能才能完成的任务。这些任务包括理解自然语言、解决问题、…

鼠标拖拽盒子移动

目录 需求思路代码页面展示【补充】纯js实现 需求 浮动的盒子添加鼠标拖拽功能 思路 给需要拖动的盒子添加鼠标按下事件鼠标按下后获取鼠标点击位置与盒子边缘的距离给 document 添加鼠标移动事件鼠标移动过程中&#xff0c;将盒子的位置进行重新定位侦听 document 鼠标弹起&a…

c#设计模式-创建型模式 之 原型模式

概述 原型模式是一种创建型设计模式&#xff0c;它允许你复制已有对象&#xff0c;而无需使代码依赖它们所属的类。新的对象可以通过原型模式对已有对象进行复制来获得&#xff0c;而不是每次都重新创建。 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具…

Flink流批一体计算(16):PyFlink DataStream API

目录 概述 Pipeline Dataflow 代码示例WorldCount.py 执行脚本WorldCount.py 概述 Apache Flink 提供了 DataStream API&#xff0c;用于构建健壮的、有状态的流式应用程序。它提供了对状态和时间细粒度控制&#xff0c;从而允许实现高级事件驱动系统。 用户实现的Flink程…

Docker微服务实战

文章目录 业务需求IDEA编写代码编写Dockerfile构建镜像运行容器网页端访问测试 业务需求 利用Docker部署应用服务&#xff0c;实现在网页端通过输入地址 ip:端口/hello/docker&#xff0c;页面显示hello docker ! IDEA编写代码 创建springboot项目 网上很多教程,此步骤省略……

校园跑腿小程序开发方案详解

校园跑腿小程序App的功能有哪些&#xff1f; 1、用户注册与登录 用户可以通过手机号、社交账号等方式进行注册和登录&#xff0c;以便使用跑腿服务。 2、下单与发布任务 用户可以发布各类跑腿任务&#xff0c;包括食品外卖、快递代收、文件送达、帮我买、帮我取、帮我送等等…

运放的分类、运放的参数

一、运放的分类 运放按功能分为通用运放与专用运放&#xff08;高速运放、精密运放、低IB运放等&#xff09;。 1.1通用运放 除廉价外&#xff0c;没有任何最优指标的运放。 例&#xff1a;uA741&#xff0c;LM324&#xff0c;TL06X&#xff0c;TL07X、TL08X等 国外知名运放…

Docker搭建elasticsearch+kibana测试

最近需要做大数据画像&#xff0c;所以先简单搭建一个eskibana学习使用&#xff0c;记录一下搭建过程和遇到的问题以及解决办法 1.拉取es和kibana镜像 在拉取镜像之前先搜索一下 elasticsearch发现是存在elasticsearch镜像的&#xff0c;我一般习惯性拉取最新镜像&#xff0c…

C#__自定义类传输数据和前台线程和后台线程

// 前台线程和后台线程 // 默认情况下&#xff0c;用Thread类创建的线程是前台线程。线程池中的线程总是后台线程。 // 用Thread类创建线程的时候&#xff0c;可以设置IsBackground属性&#xff0c;表示一个后台线程。 // 前台线程在主函数运行结束后依旧执行&#xff0c;后台线…

b树/b+树、时间轮、跳表、LSM-Tree

b树、b树&#xff1a;关系型数据库核心存储结构 1、为什么磁盘数据存储结构用B树、而不用红黑树 磁盘每次读取不是读一个节点、是返回一页数据。 红黑树每次遍历一个节点排除一半数据。 B树通常映射相邻的磁盘页数据。4K mysql索引一个节点隐射16k故而映射4倍&#xff0c;故…

【C语言】扫雷游戏(可展开)——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将运用数组来实现 扫雷游戏。 目录&#xff1a; &#x1f31f;思路框架测试游戏 &#x1f31f;测试部分函数实现&am…

云计算在线实训系统建设方案

一、 人工智能与云计算系统概述 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一种模拟人类智能的科学和工程&#xff0c;通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域&#xff0c;包括机器学习、深度学习、自然…

Web 开发 Django 管理工具

上次为大家介绍了 Django 的模型&#xff0c;通过模型就可以操作数据库&#xff0c;从而就可以改变页面的展示内容&#xff0c;那问题来了&#xff0c;我们只能通过手动编辑模型文件来配置模型吗&#xff1f;当然不是&#xff0c;Django 为我们提供了强大的工具&#xff0c;可以…

优化Python代理爬虫的应用

当我们在资源受限的环境中使用Python代理爬虫时&#xff0c;我们需要采取一些优化措施&#xff0c;以确保程序的高效性和稳定性。在本文中&#xff0c;我将分享一些关于如何优化Python代理爬虫在资源受限环境下的应用的实用技巧。 首先我们来了解&#xff0c;哪些情况算是资源…

GNU make系列之介绍Makefile

一.欢迎来到我的酒馆 在本章节介绍Makefile。 目录 一.欢迎来到我的酒馆二.GNU make 预览三.一个简单的Makefile四.make程序如何处理Makefile文件 二.GNU make 预览 2.1 GNU make工具会自动决定哪些程序需要被重新编译&#xff0c;并且执行相应的命令来重新编译程序。在本系列博…

[MyBatis系列④]核心配置文件

目录 1、简介 2、DTD 3、typeHandlers 3.1、默认类型处理器 3.2、自定义类型处理器 4、plugins ⭐MyBatis系列①&#xff1a;增删改查 ⭐MyBatis系列②&#xff1a;两种Dao开发方式 ⭐MyBatis系列③&#xff1a;动态SQL 1、简介 MyBatis的核心配置文件&#xff08;通常命…