自动化测试-Selenium

news2024/11/8 16:34:27

目录

什么是自动化测试

Selenium介绍

Selenium是什么

Selenium特点

Selenium工作原理

Selenium+Java环境搭建

1.下载chrome浏览器,查看版本号.

2.下载chrome浏览器驱动

3.配置环境变量

4.创建java项目,在pom文件中添加依赖

5. 验证环境是否搭建成功

Selenium常用API的使用

定位元素findElement

css定位

XPath定位

 css和XPath哪个更好

操作测试对象

等待

浏览器的操作

键盘事件

鼠标事件

一组元素的获取

下拉框处理

alert弹窗

文件的上传

关闭浏览器

切换窗口

截图


什么是自动化测试

自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果.将人为驱动的测试行为转化为机器执行的过程.

自动化测试就相当于将人工测试手段进行转换,让代码去执行.

自动化分类

单元测试,接口测试,UI自动化测试.


Selenium介绍

Selenium是什么

是针对web界面进行自动化测试的框架.

Selenium特点

支持各种浏览器,支持各种平台(linux,mac,windows),支持各种语言(phython,java,C#,js...),有丰富的API.

Selenium工作原理

自动化脚本代码:通过idea编写的代码.

webdriver浏览器驱动:需要手动下载.

浏览器:chrome浏览器等等..

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

Selenium+Java环境搭建

1.下载chrome浏览器,查看版本号.

2.下载chrome浏览器驱动

https://chromedriver.chromium.org/downloads

 

3.配置环境变量

解压下载好的驱动压缩包,将下载好的chromedriver.exe放到java系统环境变量bin目录下.

4.创建java项目,在pom文件中添加依赖

在maven仓库中搜索Selenium-Java对应的依赖 

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

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

如果打开了浏览器,则说明安装成功了.


Selenium常用API的使用

定位元素findElement

css定位

id选择器:#id

类选择器:.id

标签选择器:标签名

后代选择器:父级选择器 子级选择器

XPath定位

绝对路径:/html开头的,比如/html/head/title(不常用)

相对路径

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

相对路径+属性值://input[@class="s_ipt"]

 

 相对路径+通配符://*[@*="s_ipt"]

相对路径+文本匹配://a[text()="新闻"]


完整的自动化测试代码还要有预期结果和对实际结果的校验

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 {
        test01();
    }

    private static void test01() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        //元素的定位,找到百度搜索输入框
        //类选择器css
        //WebElement element =  webDriver.findElement(By.cssSelector(".s_ipt"));
        //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.get(i).getText().equals("软件测试")){
                System.out.println("测试不通过");
            }else {
                System.out.println("测试通过");
            }
        }
    }
}


 css和XPath哪个更好

css选择器定位元素效率更高,所以推荐使用css选择器.


操作测试对象

定位只是第一步,定位之后需要对这个元素进行操作。是鼠标点击还是键盘输入,或者清除元素的内容,或者提交表单等。这个取决于定位元素需要进行的下一步操作。
webdriver 中比较常用的操作对象的方法有下面几个:
  • click 点击对象
  • sendkeys 在对象上模拟按键输入
  • clear 清除对象输入的文本内容
  • submit 提交
  • text 用于获取元素的文本信息
  • getAttribute 获取元素的属性信息

注意:submit,如果点击的元素放在form标签中,此时使用submit实现的效果和click是一样的,如果点击的元素放在非form标签中,此时submit会报错.


等待

sleep强制等待

智能等待

智能等待包括隐式等待和显示等待

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

隐式地等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长

显示等待

区别:

隐式等待等待的是所有的元素,显示等待等待的是一定的条件,条件是程序员自己设定的.

但是它们都属于智能等待.


浏览器的操作

浏览器的前进,浏览器的后退,浏览器滚动条的操作

private static void test04() throws InterruptedException {
    WebDriver webDriver = new ChromeDriver();
    //打开百度首页
    webDriver.get("https://www.baidu.com");
    // 搜索java
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("java");
    webDriver.findElement(By.cssSelector("#su")).click();
    //强制等待3s
    sleep(3000);
    //浏览器后退
    webDriver.navigate().back();
    sleep(3000);
    //浏览器刷新
    webDriver.navigate().refresh();
    //浏览器前进
    sleep(3000);
    webDriver.navigate().forward();
    //滚动条操作
    sleep(3000);
    ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
    //浏览器全屏
    webDriver.manage().window().fullscreen();
    //设置浏览器的宽高
    sleep(3000);
    webDriver.manage().window().setSize(new Dimension(600,1000));
}


键盘事件

private static void test05() throws InterruptedException {
    WebDriver webDriver = new ChromeDriver();
    //打开百度首页
    webDriver.get("https://www.baidu.com");
    // 搜索java
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("java");
    webDriver.findElement(By.cssSelector("#su")).click();
    //ctrl+A
    sleep(3000);
    webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");
    //ctrl+x
    sleep(3000);
    webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");
    //ctrl+v
    sleep(3000);
    webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
}
send_keys(Keys.CONTROL,'a') # 全选( Ctrl+A
send_keys(Keys.CONTROL,'c') # 复制( Ctrl+C
send_keys(Keys.CONTROL,'x') # 剪贴( Ctrl+X
send_keys(Keys.CONTROL,'v') # 粘贴( Ctrl+V

鼠标事件

private static void test06() throws InterruptedException {
    WebDriver webDriver = new ChromeDriver();
    //打开百度首页
    webDriver.get("https://www.baidu.com");
    // 搜索java
    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();
}
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 移动

一组元素的获取

获取复选框checkbox.

 

 
   

private static void page01() {

WebDriver webDriver = new ChromeDriver();

webDriver.get("http://localhost:63342/_20230512testcode/src/main/Page/test01.html?_ijt=4brheilpuaaaoa465u843m3sth&_ij_reload=RELOAD_ON_SAVE");

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 {

// 否则什么也不操作

;

}

}

}


下拉框处理

下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框对下拉框进行操作后,再定位到下拉框内里的选项。
private static void page03() {
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);//通过下标定位,从0开始
//通过源代码属性里的value值定位
select.selectByValue("12.51");

}


alert弹窗

 

点击弹窗按钮,弹出一个弹框输入姓名,点击确认.

 
 

private static void page04() throws InterruptedException {

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


文件的上传

上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。其实,在selenium webdriver 没我们想的那么复杂;只要定位上传按钮,通过 send_keys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。
private static void page05() {
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:\\javaword");
}

关闭浏览器

关闭浏览器的方式有两种.

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(4000);
// webDriver.quit();
webDriver.close();
}

quit和close的区别

  • quit是关闭了整个浏览器,close关闭只是当前的页面(get请求的哪个页面,就关闭哪个)
  • quit会清空缓存,close不会清空缓存

切换窗口

我们打开百度页面,点击新闻,页面会跳转到新闻页面,在新闻页面里的输入框里输入新闻联播,点击百度一下.

常规的这种方式会报错,因为页面发生了切换,元素的定位只是在最开始的页面里,没有转换到新的页面里,所以发生了报错.

没有找到元素,是因为元素默认是在get打开的页面里寻找元素的.

 
  

private static void test11() 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);

// 通过getWindowHandles获取所有的窗口句柄

// 通过getWindowHandle获取的get打开的页面窗口句柄

System.out.println(webDriver.getWindowHandle());

Set<String> handles = webDriver.getWindowHandles();

String target_handle = "";

for(String handle:handles) {

target_handle = handle;

}

webDriver.switchTo().window(target_handle);

sleep(3000);

webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");

webDriver.findElement(By.cssSelector("#s_btn_wr")).click();

}

 


截图

在maven仓库里搜索common-io,添加对应的依赖.

 

 
  

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 file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);

FileUtils.copyFile(file, new File("D://20230521jietu.png"));

}


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

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

相关文章

libevent实践08:实现定时器第二季

简介 获取libevent的版本号字符串 /**Get the Libevent version.Note that this will give you the version of the library that yourecurrently linked against, not the version of the headers that youvecompiled against.return a string containing the version numbe…

利用RabbitMQ实现消息投递削峰填谷

目录 异步和同步如何选择 异步线程 同步收发消息 一、导入依赖库 二、创建RabbitMQ配置类 三、创建消息任务类 异步和同步如何选择 依靠多线程&#xff0c;Java代码可以同步执行也可以异步执行 RabbitMQ提供了同步和异步两种收发消息模式 我们采用 Java异步线程 MQ同步…

MongoRepository

一、介绍 MongoRepository是一个接口,与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个MongoDB集合中的文档数据进行增删改查,示例如下所示: import org.bson.types.ObjectId; import org.springframework.data.mongodb.repository…

[数据结构 -- 手撕排序第一篇] 插入排序

目录 1、常见的排序算法 2、插入排序的思路 2.1 基本思想 2.2 直接插入排序 2.2.1 单趟排序的思路 2.2.2 单趟排序代码实现 3、插入排序代码 4、插入排序打印测试 5、插入排序的时间复杂度 5.1 最坏情况 5.2 最好情况 6、直接插入排序的特性总结 1、常见的排序算法 2、插入排序…

SpringMVC (二) 第一个MVC程序

学习回顾&#xff1a;SpringMVC &#xff08;一&#xff09; 什么是SpringMVC Hello&#xff0c;SpringMVC 现在我们来看看如何快速使用SpringMVC编写我们的程序吧&#xff01; 一、配置版 1、新建一个Moudle &#xff0c; springmvc-02-hello &#xff0c; 添加web的支持&…

Spring面试题--AOP

什么是AOP&#xff0c;你们项目中有没有使用到AOP&#xff1f; AOP称为面向切面编程&#xff0c;用于将那些与业务无关&#xff0c;但却对多个对象产生影响的公共行为和逻辑&#xff0c;抽取并封装为一个可重用的模块&#xff0c;这个模块被命名为“切面”&#xff08;Aspect&a…

2024中山大学898水文地质与工程地质考研初试复习资料

C8260153[电子书]2024年中山大学898水文地质与工程地质考研精品资料 说明&#xff1a;本套资料由高分研究生潜心整理编写&#xff0c;高清电子书&#xff0c;考研推荐资料。 一、考研真题及重点名校真题 1.附赠重点名校真题 ①重点名校&#xff1a;水文地质学基础2010-2013…

魏副业而战:抖音图文带货玩法,月入5w+

我是魏哥&#xff0c;与其在家躺平&#xff0c;不如魏副业而战&#xff01; 最近魏哥一直在研究短视频带货&#xff0c;看了很多案例&#xff0c;发现了一些NB的账号。 说真的&#xff0c;视频带货真的可以认真的研究研究&#xff0c;不管是做直播&#xff0c;还是发视频&…

【C++11】左值引用 与 右值引用

定义 左值 / 左值引用 左值&#xff08;Lvalue&#xff09;&#xff1a; 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以 对它取地址 可以对它赋值&#xff0c;左值可以出现赋值符号的左边&#xff0c;右值不能出现在赋值符号左边。定义时const修…

青少年机器人技术一级核心知识点:机械结构及模型(二)

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

持续集成工具Jenkins安装和部署

前言 Jenkins的执行流程图如下&#xff1a; 1. 前期准备 1.1 安装JDK 目前新版本的Jenkins对JDK的要求基本上都在JDK11以上&#xff0c;所以我这边将我服务器的JDK版本升级成为JDK11。 具体升级步骤如下&#xff1a; 下载安装包 官网可能需要注册账号&#xff0c;这里我…

微信:如何查询自己名下已实名认证绑定的几个微信账户?

你知道如何查询自己名下已实名认证绑定了几个微信账户吗&#xff1f;微信规则同一个人最多可以注册绑定完成5个微信账户认证&#xff0c;如果想注册新微信号&#xff0c;必须保证实名认证微信账户不足5个。而且通过查询自己名下实名认证微信账户还可以确认&#xff0c;自己的身…

LINUX系统(ubuntu)安装以及应用调试(不定时更新)

一&#xff1a;linux的介绍 Linux是一种基于UNIX操作系统的开源&#xff08;Open Source&#xff09;操作系统。它由芬兰计算机科学家 Linus Torvalds 在1991年首次发布&#xff0c;目前已经发展成为最流行和广泛使用的操作系统之一。 Linux以其稳定性、安全性和灵活性而闻名…

07-C++学习笔记-函数

&#x1f4da; 函数的概念 函数是一段可重复使用的代码块&#xff0c;用于完成特定的任务。通过使用函数&#xff0c;可以将程序划分为多个模块&#xff0c;提高代码的可读性、可维护性和复用性。 在C中&#xff0c;函数由函数头和函数体组成。函数头包含函数的返回类型、函数…

日期格式化不起作用 2022-09-18T05:25:30.000+00:00

java->web JsonFormat(pattern “yyyy-MM-dd HH:mm:ss”)一般版本问题或依赖冲突不起作用 解决&#xff1a; spring:jackson:serialization:write-dates-as-timestamps: falsedate-format: yyyy-MM-dd HH:mm:ss这个配置会在java对象传输给web前端的时候对日期的字段进行…

Linux 查看端口占用命令

文章目录 1、lsof -i:端口号2、netstat 命令2.1 netstat -tunlp 命令2.2 netstat -anp 命令 1、lsof -i:端口号 用于查看某一端口的占用情况&#xff0c;比如查看5000端口使用情况&#xff1a; lsof -i:5000常用命令&#xff1a; lsof -i:5000&#xff1a;查看5000端口占用 …

QT或VS2015报错:Error: C2661: QColor::ct::ct: 没有重载函数接受 5 个参数解决方案

安装了QT5.14.2 MSCV2015配置并同时在QT或VS2015测试并运行都提示没有重载函数接受 5 个参数。 同时还会出现C2134错误&#xff1a;QMetaObject::SuperData::operator const QMetaObject *: 调用不会生成常数表达式的错误 搜索了网络上的结果都让换其它版本&#xff0c;没有…

高压线路零序电流方向保护程序逻辑原理(一)

一、微机型零序电流方向保护概念 &#xff08;一&#xff09;保护电流元件的配置 零序电流方向保护是反应大接地电流系统的线路发生接地故障时&#xff0c;零序电流分量大小和方向的多段式电流方向保护。在我国大接地电流系统线路上都装设了这种接地保护装置&#xff0c;这种保…

(推荐)Abaqus中C++子程序开发入门

ABAQUS是支持C子程序开发的&#xff0c;相比于传统的Fortran&#xff0c;C作为高级语言的优势不言而喻&#xff0c;再搭配优秀的C程序库&#xff0c;使得我们的编程效率大大提高&#xff0c;尤其是对于熟悉C编程的开发者&#xff0c;不失为一种更好的选择。 1 软件配置 1.1 环…

20230702 正态分布的几个性质

正态分布以及高斯函数的定义 如果随机变量 X X X 的密度函数为 f μ , σ ( x ) 1 σ 2 π e − ( x − μ ) 2 2 σ 2 , x ∈ R , σ > 0 f_{\mu, \sigma}(x)\frac{1}{\sigma \sqrt{2 \pi}} e^{-\dfrac{(x-\mu)^2}{2 \sigma^2}}, \quad x \in \mathbb{R}, \sigma>0 …