自动化测试之Selenium

news2025/1/24 22:54:48

    • 自动化测试
    • 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;表示截过来图片保存的类型;我们放到文件里;

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

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

相关文章

ubuntu20.04 直接安装vpp23.06 测试双 VPP Tunnel Ike2

环境信息&#xff1a;VMware Workstation 17 Pro ubuntu20.04 (清华源) ubuntu 源点进去选&#xff1a;ubuntu-22.04.3-desktop-amd64.iso 如果之前装过VPP&#xff0c;用以下命令确定是否卸载干净&#xff1a; dpkg -l | grep vpp dpkg -l | grep DPDK 卸载&#xff1a; …

ChatGPT + Flutter快速开发多端聊天机器人App

下载地址&#xff1a;ChatGPT Flutter快速开发多端聊天机器人App 下载地址&#xff1a;ChatGPT Flutter快速开发多端聊天机器人App

SpringCloud学习笔记(五)_Consul注册中心

本章使用的Consul版本是 1.7.2 项目架构图如下&#xff1a; 搭建服务提供者 1、新建一个maven项目&#xff08;test-springcloud-provider-payment8006&#xff09; 结构如下&#xff1a; 2、引入依赖&#xff0c;编辑pom文件 1 <!-- spring-cloud 整合 consul --> 2…

MyBatis分页与特殊字符处理

文章目录 一、分页1.1 分页插件PageHelper1.2 使用1.2.1 导入pom依赖1.2.2 Mybatis.cfg.xml配置拦截器1.2.3. 配置 Mapper.xml1.2.4 测试 二、特殊字符处理2.1 使用CDATA区段2.2 使用实体引用 一、分页 1.1 分页插件PageHelper PageHelper 是 Mybatis 的一个插件。官网 Page…

SOLIDWORKS提高装配效率的方法:阵列特征驱动阵列

相信SOLIDWORKS用户很喜欢SOLIDWORKS阵列命令&#xff0c;因为阵列可以提高设计效率&#xff0c;减少错误&#xff0c;修改也很方便&#xff0c;但是大家一般在零件里用阵列来阵列特征&#xff0c;在装配体里用阵列来阵列零件&#xff0c;那有没有办法用零件中的阵列特征来驱动…

开源与专有软件:比较与对比

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

173935-46-1/Fmoc-L-Ser(Ac3-L-Fucα)-OH的保存建议

Fmoc-L-Ser((Ac)3-α-Fuc)-OH是一种支链N-连接寡糖的碱性单糖片段&#xff0c;该片段在糖蛋白中发现。该片段由α-L-fucose和N-acetylated α-L-fucose通过乙酰基连接而成&#xff0c;并被包含在一个Fmoc-L-serine分子中。西安凯新生物科技有限公司的这种支链寡糖结构在生物体内…

linux安装JDK及hadoop运行环境搭建

1.linux中安装jdk &#xff08;1&#xff09;下载JDK至opt/install目录下&#xff0c;opt下创建目录soft&#xff0c;并解压至当前目录 tar xvf ./jdk-8u321-linux-x64.tar.gz -C /opt/soft/ &#xff08;2&#xff09;改名 &#xff08;3&#xff09;配置环境变量&#xf…

【Java架构-包管理工具】-Maven进阶(二)

本文摘要 Maven作为Java后端使用频率非常高的一款依赖管理工具&#xff0c;在此咱们由浅入深&#xff0c;分三篇文章&#xff08;Maven基础、Maven进阶、私服搭建&#xff09;来深入学习Maven&#xff0c;此篇为开篇主要介绍Maven进阶知识&#xff0c;包含坐标、依赖、仓库、生…

pgadmin4中的备份与恢复

一&#xff0c;postgresql 数据的备份与恢复 &#xff08;一&#xff09;数据库备份与恢复 1&#xff0c;备份 windows环境 1> dump 逻辑备份 1&#xff0c;用管理员身份打开power shell 2&#xff0c;切换到本机 postgresql 安装目录下的 bin 目录&#xff1a; PS C…

目标检测笔记(十一):如何在特定区域进行人脸检测实操

文章目录 背景代码 背景 由于我们在做项目的时候可能会涉及到某个指定区域进行目标检测或者人脸识别等任务&#xff0c;所以这篇博客是为了探究如何在传统目标检测的基础上来结合特定区域进行检测&#xff0c;以Opencv自带的包为例。 代码 import cv2face_cascade cv2.Casc…

云服务器 宝塔(每次更新)

su root 输入密码 使用 root 权限 /etc/init.d/bt default 获取宝塔登录 位置和账号密码。进入宝塔 删除数据库 删除php前端站点 删除PM2后端项目 前端更改完配置打包dist文件 后端更改完配置项目打包 数据库结构导出 导入数据库 配置 PM2 后端 安装依赖

在百度地图中添加自定义全屏控件

百度地图中添加全屏控件 前置知识&#xff1a; 进入整个页面的全屏模式 &#xff1a;document.documentElement.requestFullscreen() 进入特定元素的全屏模式 &#xff1a; document.getElementById("ID").requestFullscreen() 退出全屏&#xff1a;document.exitFu…

HTML番外篇(四)-HTML5新增元素-CSS常见函数-理解浏览器前缀-BFC

一、HTML5新增元素 1.HTML5语义化元素 在HMTL5之前&#xff0c;我们的网站分布层级通常包括哪些部分呢&#xff1f; header、nav、main、footer ◼ 但是这样做有一个弊端&#xff1a; 我们往往过多的使用div, 通过id或class来区分元素&#xff1b;对于浏览器来说这些元素不…

django自动创建model数据

目前使用的环境&#xff1a;django4.2.3&#xff0c;python3.10 django通过一些第三方库&#xff0c;可以轻易的自动生成一系列的后台数据。 首先先创建一个数据库&#xff1a; 然后&#xff0c;在setting.py中就可以指定我们新创建的数据库了。 DATABASES {default: {ENGI…

基于Pytorch的神经网络部分自定义设计

一、基础概念&#xff08;学习笔记&#xff09; &#xff08;1&#xff09;训练误差和泛化误差[1] 本质上&#xff0c;优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标&#xff0c;后者则关注在给定有限数据量的情况下寻找合适的模型。训练误差和泛化误差通常不…

【前端】深入解析CSS:选择器、显示模式、背景属性和特征剖析

目录 一、前言二、CSS的复合选择器1、后代选择器①、语法②、注意事项 2、子选择器①、语法②、注意事项 3、并集选择器①、语法②、注意事项 4、链接伪类选择器①、语法②、注意事项 三、CSS元素显示模式转换1、转换为块元素display:block2、转换为行内元素display:inline3、转…

AIGC ChatGPT 制作地图可视化分析

地图可视化分析是一种将数据通过地图的形式进行展示的方法&#xff0c;可以让人们更加直观、快速、准确的理解和分析数据。以下是地图可视化分析的一些主要好处&#xff1a; 加强数据理解&#xff1a;地图可视化可以将抽象的数字转化为直观的图形&#xff0c;帮助我们更好地理解…

LLMs对单个任务进行微调Fine-tuning on a single task

虽然LLM因其在单一模型内执行多种不同语言任务的能力而变得出名&#xff0c;但您的应用程序可能只需要执行单一任务。在这种情况下&#xff0c;您可以微调一个预训练的模型&#xff0c;以仅提高您感兴趣的任务的性能。例如&#xff0c;使用该任务的示例数据集进行摘要。有趣的是…

Linux —— keepalived

简介 Keepalived 是一个用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡和高可用性功能。 Keepalived 开源并且免费的软件。 Keepalived 的2大核心功能 1. loadbalance 负载均衡 LB&#xff1a;ipvs--》lvs软件…