自动化测试 selenium常用操作

news2024/11/15 8:33:10

最简单的代码实例

import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class AutoTestDemo1 {
    //浏览器自动搜索,暂停是为了能看到,要不访问太快
    public void testKunKun() throws InterruptedException {
        //打开浏览器
        ChromeDriver chromeDriver = new ChromeDriver();
        Thread.sleep(5000);
        //进入百度网站
        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.常用方法

查找元素

① findElement()

  • 参数:By类

  • 返回值:WebElement

② findElements()

  • 参数:By类

  • 返回值:List<WebElements>

元素的定位By类

自动化里要求元素的定位必须是唯一的,但是有时候我们复制的selector和xpath并不是唯一的,这时候需要我们手动更改成为一的。

①选择器cssSelector定位

②使用xpath

  • 层级:/子级 //跳级

  • 属性:@

  • 函数:contains()

2.常用功能

点击click

提交(通过回车键提交)submit()官方不推荐使用,更推荐使用click

清楚 clear() 输入错误的时候 可以清楚再重新输入 但是自动化测试使用 不多

获取文本getText

  • 返回值 String

  • 这个方法可以获取文本,不是属性

获取属性值getAttribute

Value值,id,type,class等等很多属性都可以获得

System.out.println(chromeDriver.findElement(By.cssSelector("#kw")).getAttribute("id"));
System.out.println(chromeDriver.findElement(By.cssSelector("#kw")).getAttribute("name"));
System.out.println(chromeDriver.findElement(By.cssSelector("#kw")).getAttribute("value"));

获取页面 标题 URL

System.out.println(driver.getTitle());
System.out.println(driver.getCurrentUrl());

3.窗口

窗口大小设置

自动化测试过程中用的不多,但要知道是通过manage().windows()来设置的
//窗口最大化
driver.manage().window().maximize();
//窗口最小化
driver.manage().window().minimize();
//全屏:和最大化不一样,要有区分
driver.manage().window().fullscreen();
//自定义大小:这里要使用 Dimension 来设置
driver.manage().window().setSize(new Dimension(1000,800));

窗口的切换

页面每打开一个标签页,会自动的给标签页进行标识,这个标识叫做句柄。
在日常自动化测试的过程中,我们几乎不会使用到 两个以上的窗口,只需要掌握两个窗口的切换即可
public void testSwitchWindow() throws InterruptedException {
    ChromeDriver driver = new ChromeDriver();
    driver.get("http://www.baidu.com");
    Thread.sleep(1000);
    driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
    driver.findElement(By.cssSelector("#su")).submit();
    //当前有两个窗口,分别是 百度窗口 和 CXK窗口,我们要怎么切换呢?
    //1.获取  当前页面的句柄  和  全部页面的句柄
    String now = driver.getWindowHandle();
    Set<String> all = driver.getWindowHandles();
    //遍历,切换当前页面句柄为另一个
    for (String str : all){
        if (str!=now){
            driver.switchTo().window(str);//注意这个 switchTo方法
        }
    }
}

屏幕截图

注意屏幕截图 要保存截图为 文件的格式,而保存文件 需要加入一个 新的依赖
  • 多次执行的话,重名文件会被覆盖,我们可以将文件的命名添加动态数据(时间戳)

//这个里面的参数选择 OutputType.File
File file = driver.getScreenshotAs(OutputType.FILE);
String fileName = "Capture.png";
//这里还要使用 FileUtils类
FileUtils.copyFile(file,new File(fileName));

4.等待

程序执行的速度要比浏览器快很多,所以我们要设置等待,防止我们的操作前置

强制等待

线程阻塞实现进行,也就是我们上面一直写到的 Thread.sleep() 这种方法我们在自动化测试中不能用的特别多。如果一个用例就需要几秒,几千个程序就需要浪费很多时间

隐式等待

隐式等待会 做用于driver的整个生命周期。会 一直轮询判断元素是否存在,如果不存在就在时间内不断轮询,直到元素能够被找到
private static ChromeDriver driver = new ChromeDriver();
public static void waitControl(){
    //设置隐式等待最长时间为10s  下面的语句会很快就执行完  implicitly隐式地,含蓄地
    driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    driver.get("http://baidu.com");
    driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
    driver.findElement(By.cssSelector("#su")).submit();
}

显式等待

显示等待 只做用于一条语句,也是会 一直轮询判断元素是否存在
private static ChromeDriver driver = new ChromeDriver();
public static void waitControl2(){
//不同的是只有findElement(By.cssSelector("#su"))被显式等待,并不是全局
    new WebDriverWait(driver,Duration.ofSeconds(5)).until(driver->driver.findElement(By.cssSelector("#su")));
}

5.浏览器导航

浏览器导航,通常用到的有 前进 后退 和 刷新。看下面代码
private static ChromeDriver driver = new ChromeDriver();
public static void navigateControl() {
    driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    //搜索简写
    //driver.get("http://www.baidu.com");
    //搜索全写,和上面的一样的
    driver.navigate().to("http://www.baidu.com");
    driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
    //后退一步
    driver.navigate().back();
    //前进一步
    driver.navigate().forward();
    //刷新一下
    driver.navigate().refresh();
}

6.弹窗

弹窗分为三种,警告弹窗(只有确认案件,只是提示你一下)、确认弹窗(可以选择确定或者取消)、提示弹窗(可以输入信息)。如下图所示
//切换到弹窗,进行弹窗的处理
Alert alert = driver.switchTo().alert();
//弹窗输入文本(注意页面可能看不到效果,但是是输入了文本)
alert.sendKeys("xxx内容");
//弹窗点击确认按钮
alert.accept();
//弹窗点击取消按钮
alert.dismiss();

注意:

  • 当弹窗只有一个按钮,accept和dismiss都能处理

  • 如果弹窗没有本文框,使用了sendkeys也是不会报错的,浏览器会执行操作,但是页面没有变化

7.选择框

选择框点击其他地方,就会收回,无法定位xpath或者selector,那么应该怎么做呢?

选择框类型:根据文本选择根据序号选择根据属性选择

假如我们选择 中非 那么看我们怎么实现的:

// 1.找到选择框元素
WebElement element  = driver.findElement(By.cssSelector("注意这里是选择框元素<select>"));
// 2.创建选择框对象
Select select = new Select(element);
// 3.选择的三种方式 :
// ① 根据文本来选择
select.selectByVisibleText("中非");//选择可见的文本(有一些前端代码是不可见的)
// ② 通过属性来进行选择
select.selectByValue("zhongfei");
// ③ 通过序号进行选择
select.selectByIndex(2);//注意序号从0开始

8.执行脚本

通过executeScript方法来执行JS代码,在控制台我们可以输入JS代码来进行控制,可以现在控制台测试后,然后粘贴到Java代码中
public static void executionScript() throws InterruptedException {
    driver.get("https://image.baidu.com/");
    //相当于鼠标滑轮向下滑动
    Thread.sleep(2000);
    driver.executeScript("document.documentElement.scrollTop=500");
    //相当于鼠标滑轮滑动到 最顶部
    Thread.sleep(2000);
    driver.executeScript("document.documentElement.scrollTop=0");
    //通过js代码直接 把搜索框里的值设置为 “蔡徐坤”
    Thread.sleep(2000);
    driver.executeScript("let text = document.querySelector(\"#kw\");text.value=\"蔡徐坤\";");
}

9.文件上传

文件上传其实就是上传文件的路径,在自动化测试中,不需要我们再进行点击上传-->选择文件-->确定。而是 直接通过sendkeys发送文件路径即可。
WebElement element = driver.findElement(By.cssSelector("文件框的selector"));
element.sendKeys("文件地址");

10.浏览器的参数设置

在通常测试中,我们测试人员通常不会去关注浏览器的运行,而是直接查看自动化执行的结果。所以我们可以设置浏览器参数为无头模式(不打开浏览器窗口)。
public static void noHead(){
    // 1.先创建一个options来作为参数方便构建ChromeDriver
    ChromeOptions options = new ChromeOptions();
    options.addArguments("headless");
    // 2.这里我们new ChromeDriver 是使用带参数的方法
    ChromeDriver chromeDriver = new ChromeDriver(options);
    chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    // 3.操作浏览器
    chromeDriver.get("http://www.baidu.com");
    chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
    chromeDriver.findElement(By.cssSelector("#su")).click();
    //执行 我们可以发现 并没有打开浏览器窗口  而是直接执行成功
}

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

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

相关文章

【软件工程】课程作业(三道题目:需求分析、概要设计、详细设计、软件测试)

文章目录&#xff1a;故事的开头总是极尽温柔&#xff0c;故事会一直温柔……&#x1f49c;一、你怎么理解需求分析&#xff1f;1、需求分析的定义&#xff1a;2、需求分析的重要性&#xff1a;3、需求分析的内容&#xff1a;4、基于系统分析的方法分类&#xff1a;5、需求分析…

Java static关键字(重新认识main方法)

static关键字一、static修饰成员的特点二、static什么时候使用三、static注意事项四、重新认识main方法static 是静态的意思&#xff0c;可以修饰成员变量&#xff0c;也可以修饰成员方法 一、static修饰成员的特点 被其修饰的成员, 被该类的所有对象所共享多了一种调用方式, 可…

Vue(6)

文章目录1. 自定义指令1.1 函数式1.2 对象式1.3 自定义指令常见坑1.4 创建全局指令2. 生命周期2.1 引出生命周期2.2 分析生命周期2.3 总结3. 组件3.1 认识组件3.2 使用组件 (非单文件组件)3.3 全局组件3.4 组件的几个注意点3.5 组件的嵌套3.6 VueComponent 构造函数3.7 一个重要…

openresty学习笔记

openresty 简介 openresty 是一个基于 nginx 与 lua 的高性能 web 平台&#xff0c;其内部 集成了大量精良的 lua 库、第三方模块以及大数的依赖项。用于 方便搭建能够处理超高并发、扩展性极高的动态 web 应用、 web 服务和动态网关。 openresty 通过汇聚各种设计精良的 ngi…

LearnOpenGL-入门-纹理

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网&#xff1a;https://learnopengl-cn.github.io/ 文章目录纹理纹理环绕方式纹理过滤多…

3.抽象工厂模式(Abstract Factory)

与工厂模式对比 工厂模式 工厂模式是类创建模式。在工厂模式中&#xff0c;只需要生产同一种产品&#xff0c;只不过是生产厂家不同。 所以产品类的设计&#xff1a; 抽象的产品类Product具体的产品类Product_A&#xff0c;Product_B, Product_C, Product_D…… 工厂的设计…

BFC的含义以及应用

什么是BFC? BFC全称是Block Formatting context&#xff0c;翻译过来就是块级格式化上下文。简单来说&#xff0c;BFC是一个完全独立的空间。让空间里的子元素不会影响到外面的布局。&#x1f603;&#x1f603;&#x1f603; 如何触发BFC呢&#xff1f; mdn给了如下方式&a…

HMM-理论补充

目录 一.隐马尔科夫模型 二.HMM定义 三.隐马尔科夫模型的贝叶斯网络 四.HMM的确定 五.HMM的参数 六.HMM的参数总结 七.HMM的两个基本性质 1.齐次假设&#xff1a; 2.观测独立性假设&#xff1a; 八.HMM举例 九.HMM的3个基本问题 十.概率计算问题 1.直接算法 2.前向…

C语言学习笔记——程序环境和预处理

目录 前言 一、程序环境 1. 翻译环境 1.1 主要过程 1.2 编译过程 2. 运行环境 二、预处理 1. 预定义符号 2. #define 2.1 #define定义标识符 2.2 #define定义宏 2.3 命名约定和移除定义 3. 条件编译 4. 文件包含 结束语 前言 每次我们写完代码运行的时候都…

刷题28-有效的变位词

32-有效的变位词 解题思路&#xff1a; 注意变位词的条件&#xff0c;当两个字符串完全相等或者长度不等时&#xff0c;就不是变位词。 把字符串中的字符映射成整型数组&#xff0c;统计每个字符出现的次数 注意数组怎么初始化&#xff1a; int [] s1new int[26]代码如下&a…

C语言数据结构(一)—— 数据结构理论、线性表【动态数组、链表(企业版单向链表)】

数据结构理论1.1 数据数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可以操作的对象&#xff0c;是能被计算机识别&#xff0c;并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。1.2数据…

决策树、随机森林、极端随机树(ERT)

声明&#xff1a;本文仅为个人学习记录所用&#xff0c;参考较多&#xff0c;如有侵权&#xff0c;联系删除 决策树 通俗来说&#xff0c;决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友&#xff0c;于是有了下面的对话&#xff1a; 女儿&#x…

C++17 nodiscard标记符

文章目录前言弃值表达式nodiscard标记符函数非弃值声明类/枚举类/结构 非弃值声明返回类引用与类指针前言 在C 17中引入了一个标记符nodiscard&#xff0c;用于声明一个 “非弃值(no-discard)表达式”。那么在开始之前&#xff0c;我们需要了解一下什么是弃值表达式。 弃值表…

LearnOpenGL-入门-着色器

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网&#xff1a;https://learnopengl-cn.github.io/ 文章目录着色器GLSL数据类型输入与输…

SpringMVC - 12 - 注解配置SpringMVC(完全注解开发)

文章目录注解配置SpringMVC1、创建初始化类WebInit&#xff0c;代替web.xml2、创建SpringConfig配置类&#xff0c;代替spring的配置文件3、创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4、TestController进行测试注解配置SpringMVC 使用配置类和注解代替web.xml和…

友云生态全球高峰论坛暨长沙首届私董会隆重召开

由友云生态主办的“赢在巅峰决策未来”在友云生态全球新消费、新金融、新资本高峰论坛暨长沙首届私董会于2023年2月22日隆重召开&#xff01;本场私董会以“赢在巅峰 决策未来”为主题&#xff0c;从思维、定位、格局、布局四个角度探讨未来发展的全新动能。作为行业标杆性盛会…

网络应用之HTTP响应报文

HTTP响应报文学习目标能够知道HTTP响应报文的结构1. HTTP响应报文分析HTTP 响应报文效果图:响应报文说明:--- 响应行/状态行 --- HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述 --- 响应头 --- Server: Tengine # 服务器名称 Content-Type: text/html; charsetUTF-8 # 内容类…

【RabbitMQ笔记06】消息队列RabbitMQ七种模式之Topics主题模式

这篇文章&#xff0c;主要介绍消息队列RabbitMQ七种模式之Topics主题模式。 目录 一、消息队列 1.1、主题模式&#xff08;Topics&#xff09; 1.2、案例代码 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;编写生产者 &#xff08;3&#xff09;编写消费…

MapReduce 性能优化

MapReduce用于大规模数据集的并行运算&#xff0c;所以性能优化也是需要重点关注的内容&#xff0c;下面是我在学习过程中&#xff0c;对于MapReduce 性能优化的点&#xff0c;分享大家学习&#xff0c;enjoy~~ MapReduce的运行流程 以上是MapReduce的运行流程&#xff0c;所以…

Zebec社区上线ZIP-2(地平线升级行动)提案,海量激励将被释放

此前&#xff0c;Zebec社区在上线了投票治理系统Zebec Node后&#xff0c;曾上线了首个提案ZIP-1&#xff0c;对 Nautilus Chain 的推出进行了投票&#xff0c;作为 Zebec Chain 上线前的“先行链”&#xff0c;该链得到了社区用户的欢迎&#xff0c;投通过票的比例高达98.3%。…