自动化测试和selenium的使用

news2024/11/25 7:02:31

目录

自动化测试定义

为什么选择selenium来作为我们web自动化测试的工具?

自动化测试定位元素

使用cssSelector定位

使用XPath 定位

操作测试对象 

模拟手动从键盘输入

点击对象

获取页面文本

 清除对象输入的文本内容

添加等待(三种方式)

强制等待sleep()

隐式等待

显式等待

打印信息

浏览器操作

浏览器窗口大小设置

浏览器前进、后退设置

键盘事件

鼠标事件

上传文件操作

屏幕截图


自动化测试定义

        自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程
        现在随着软件产品版本的迭代更新,需要对旧版本进行大量的回归测试,如果这都需要测试人员手工测试的话,会大大降低工作效率,因此就需要自动化测试来替代一部分人工测试。
        自动化测试包括UI自动化,接口自动化,单元测试自动化

为什么选择selenium来作为我们web自动化测试的工具?

  1. 首先selenium是免费开源的。
  2. 支持多浏览器例如,chrome,firefox,edge,ie等。
  3. 支持多系统例如:Linux,windows,macos等。
  4. 支持多语言,例如java,python等。
  5. selenium提供了很多可使用的API。

自动化测试定位元素

        对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪个街道、楼层、门牌找到这个人。  
        那么一个对象也有类似的属性,我们可以通过这些属性找到这对象。

使用cssSelector定位

        CSS 使用选择器来为页面元素绑定属性,CSS 的比较灵活可以选择控件的任意属性,通过findElement(By.cssSelector())函数来使用。

        以百度输入框为例:

  1. 获取百度浏览器的网址:https://www.baidu.com/   
  2. 找到百度输入框的cssSelector的定位元素(使chromeF12开发者模式,点击百度输入框,复制selector),输入关键词“迪丽热巴”
  3. 找到百度的点击按钮并点击

代码如下

package com.javazidonghau;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
public class firstAutoTest {
    //第一个简单的自动化示例
    public void dilireba() throws InterruptedException {
        //创建一个驱动对象来打开浏览器
        ChromeDriver driver = new ChromeDriver();
        Thread.sleep(3000);
      //输入百度浏览器网站
        driver.get("https://www.baidu.com");
        Thread.sleep(3000);
        //找到百度输入框,并输入关键词"迪丽热巴"
        driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
        Thread.sleep(3000);
        //找到百度一下按钮,并点击
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        //释放掉驱动对象并关闭浏览器
        driver.quit();
    }
}

 

使用XPath 定位

 //找到百度输入框,并输入关键词"杨洋"
        driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("杨洋");
        Thread.sleep(3000);
        //找到百度一下按钮,并点击
        driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
        Thread.sleep(3000);
        //释放掉驱动对象并关闭浏览器
        driver.quit();

 

操作测试对象 

       前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个元素进行操作。是鼠标点击还是键盘输入,或者清除元素的内容,或者提交表单等。这个取决于定位元素需要进行的下一步操作。

        web自动化测试中比较常用的操作对象的方法有下面几个:

  • sendKeys()     模拟手动从键盘输入
  • click()      点击对象
  • getText()     获取页面文本
  • clear()       清除对象输入的文本内容

模拟手动从键盘输入

      driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("杨洋");

sendKeys方法可以模拟我们用户从键盘输入

点击对象

 driver.findElement(By.xpath("//*[@id=\"su\"]")).click();

click() 方法可以用于点击一个按钮

获取页面文本

String s1=  driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]")).getText();
        System.out.println(s1);

        getText()方法可以用来获取页面的文本信息,但不能获取定位元素的属性值,如果想要获取属性值就可以使用getAttribute()来进行获取

举例:获取百度热搜第一个文本页面 

package com.javazidonghau;

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

public class firstAutoTest {
    public void dilireba() throws InterruptedException {
        //创建一个驱动对象来打开浏览器
        ChromeDriver driver = new ChromeDriver();
        Thread.sleep(3000);
      //输入百度浏览器网站
        driver.get("https://www.baidu.com");
        //找到百度页面的对应文本的xpath定位
      String s1=  driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]")).getText();
        Thread.sleep(3000);
        System.out.println(s1);
        //释放掉驱动对象并关闭浏览器
        driver.quit();
    }
}

 清除对象输入的文本内容

      driver.findElement(By.xpath("//*[@id=\"kw\"]")).clear();

clear()可以清除输入框输入的文本信息

添加等待(三种方式)

强制等待sleep()

Thread.sleep(3000);//3000毫秒即3秒

sleep()表示设置一个固定的等待时间,如果我们的页面已经提前全部加载完毕,也必须等待固定设

置的时间才能进行下一步。如果涉及过多的测试用例,则会十分影响自动化测试效率。

举例:未设置等待时间发生异常

public class firstAutoTest {
    //第一个简单的自动化示例
    public void dilireba() throws InterruptedException {
        //创建一个驱动对象来打开浏览器
        ChromeDriver driver = new ChromeDriver();
      //输入百度浏览器网站
        driver.get("https://www.baidu.com");
        //找到百度输入框,并输入关键词"杨洋"
      driver.findElement(By.cssSelector("#kw")).sendKeys("杨洋");
        driver.findElement(By.cssSelector("#su")).click();
         //Thread.sleep(3000);
        driver.findElement(By.cssSelector("#\\\\34  > div > div:nth-child(1) > h3"));
        //释放掉驱动对象并关闭浏览器
        driver.quit();
    }
}

        当在输入和点击操作完成后,未设置一个等待时间又开始定位下一个元素,此时发现运行异常报错,报错原因是程序执行的速度很快,当上一个操作的页面渲染还没有结束,下一个操作又要开始定位元素导致未找到定位元素,于是发生异常。

        解决方案:设置一个等待时间

public class firstAutoTest {
    //第一个简单的自动化示例
    public void dilireba() throws InterruptedException {
        //创建一个驱动对象来打开浏览器
        ChromeDriver driver = new ChromeDriver();
      //输入百度浏览器网站
        driver.get("https://www.baidu.com");
        //找到百度输入框,并输入关键词"杨洋"
      driver.findElement(By.cssSelector("#kw")).sendKeys("杨洋");
        driver.findElement(By.cssSelector("#su")).click();
         Thread.sleep(3000);//强制等待
        driver.findElement(By.cssSelector("#\\\\34  > div > div:nth-child(1) > h3"));
        //释放掉驱动对象并关闭浏览器
        driver.quit();
    }
}

        

隐式等待

        sleep()当遇到许多测试用例时,会大大降低测试效率,此时隐式等待的作用就比设置sleep()比较智能。隐式等待设置的等待时间范围内,轮询等待元素,如果元素出现之后就立即结束进行下一步,不需要等待时间结束。

        隐式等待节省了大量的等待时间,元素展示之后,就可以直接执行下一步。如果在规定的时间范围内,元素仍然没有出现,则会抛出一个异常【NoSuchElementException】,停止运行

 driver.manage().timeouts().implicitlyWait(Duration.ofMillis(3000));
public class firstAutoTest {
    //第一个简单的自动化示例
    public void dilireba() throws InterruptedException {
        //创建一个驱动对象来打开浏览器
        ChromeDriver driver = new ChromeDriver();
      //输入百度浏览器网站
        driver.get("https://www.baidu.com");
        //找到百度输入框,并输入关键词"杨洋"
      driver.findElement(By.cssSelector("#kw")).sendKeys("杨洋");
        driver.findElement(By.cssSelector("#su")).click();
        // Thread.sleep(3000); //强制等待
     driver.manage().timeouts().implicitlyWait(Duration.ofMillis(3000));//隐式等待
     driver.findElement(By.cssSelector("#\\\\34  > div > div:nth-child(1) > h3"));
        //释放掉驱动对象并关闭浏览器
        driver.quit();
    }
}

显式等待

        显示等待需要使用到 selenium 里中的一个类 ExpectedConditions,以及 until 方法。

//点击后出现弹窗,显示登录成功  
WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(3));  
//出现弹窗之后,才开始停止等待 
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#\\34  > div >div:nth-child(1) > h3")));

   显示等待通过使用WebDriverWait类来传入两个参数:浏览器驱动driver和等待时间Duration.ofSeconds()

until方法中 ExpectedConditions表示预期条件,presenceOfElementLocated()表示定位元素


public class firstAutoTest {
    //第一个简单的自动化示例
    public void dilireba() throws InterruptedException {
        //创建一个驱动对象来打开浏览器
        ChromeDriver driver = new ChromeDriver();
      //输入百度浏览器网站
        driver.get("https://www.baidu.com");
        //找到百度输入框,并输入关键词"杨洋"
      driver.findElement(By.cssSelector("#kw")).sendKeys("杨洋");
        driver.findElement(By.cssSelector("#su")).click();
        // Thread.sleep(3000); //强制等待
    // driver.manage().timeouts().implicitlyWait(Duration.ofMillis(3000));//隐式等待
              //传入驱动和等待的时间
        WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(3));//显示等待
                //等待的条件
   wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#\\34  > div > div:nth-child(1) > h3")));
        driver.quit();
    }
}

打印信息

public class firstAutoTest {
    public void dilireba() throws InterruptedException {
        //创建一个驱动对象来打开浏览器
        ChromeDriver driver = new ChromeDriver();
      String s1 =driver.getTitle();//获取当前标题:百度一下,你就知道
      String s2 = driver.getCurrentUrl();//获取当前的url:https://www.baidu.com
      System.out.println(s1);
      System.out.println(s2);
    }
}

浏览器操作

浏览器窗口大小设置

    public void window() throws InterruptedException {
        driver.manage().window().maximize();//将窗口设置为最大
        Thread.sleep(2000);
        driver.manage().window().minimize();//将窗口设置为最小
        Thread.sleep(2000);
        driver.manage().window().setSize(new Dimension(500,500));//自定义大小
    }

浏览器前进、后退设置

    driver.navigate().back();//后退
    Thread.sleep(3000);
    driver.navigate().forward();//前进
    Thread.sleep(3000);

键盘事件

        从键盘输入就需要使用sendKeys(),可以来输入键盘的按键和组合键。WebElement 提供了所有的Keys()方法,需要导入此包:

import org.openqa.selenium.WebElement;
 public void Test() throws InterruptedException {
        ChromeDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
      WebElement  web= driver.findElement(By.cssSelector("#kw"));
      web.sendKeys("我们都要好好的");
      Thread.sleep(2000);
      web.sendKeys(Keys.ESCAPE);//回退键
        web.sendKeys(Keys.ENTER);//回车键
        web.sendKeys(Keys.SPACE);//空格键
        web.sendKeys(Keys.TAB);//TAB键
        web.sendKeys(Keys.CONTROL,"A");//ctrl+A  全选
        web.sendKeys(Keys.CONTROL,"C");//ctrl+c  复制
        web.sendKeys(Keys.CONTROL,"V");//ctrl+V  粘贴
        web.sendKeys(Keys.CONTROL,"X");//ctrl+x  剪切
        Actions action=new Actions(driver);
        action.sendKeys(Keys.F5);//按F5键刷新
        Thread.sleep(2000);
        driver.quit();
    }

 

鼠标事件

上传文件操作

        定位上传按钮,通过sendKeys()  添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。
public void test1() throws InterruptedException {
    ChromeDriver driver = new ChromeDriver();
    //进入百度网站
    driver.get("https://www.baidu.com");
    driver.findElement(By.xpath("//span[@class='soutu-btn']")).click();
    //上传按钮为input标签,定位上传按钮
    WebElement element = driver.findElement(By.xpath("//input[@class='upload-pic']"));
    Thread.sleep(2000);
    //输入文件路径,上传文件
    element.sendKeys("D:\\download\\test.jpg");
    Thread.sleep(2000);
    driver.quit();
}

屏幕截图

 public void dilireba() throws InterruptedException, IOException {
        //创建一个驱动对象来打开浏览器
        ChromeDriver driver = new ChromeDriver();
        Thread.sleep(3000);
      //输入百度浏览器网站
         driver.get("https://www.baidu.com");
        Thread.sleep(3000);
        //找到百度输入框,并输入关键词"杨洋"
      driver.findElement(By.cssSelector("#kw")).sendKeys("杨洋");
      Thread.sleep(3000);
        //找到百度一下按钮,并点击
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        //屏幕截图
        File file = driver.getScreenshotAs(OutputType.FILE);
        //将截图文件保存在指定路径下
        File filename = new File("./src/test/my.png");
        FileUtils.copyFile(file,filename);//在Maven需要导入FileUtils的依赖
        driver.findElement(By.cssSelector("#head_wrapper"));
        //释放掉驱动对象并关闭浏览器
        driver.quit();
    }

 

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

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

相关文章

00 SQL介绍

什么是SQL Structured Query Language:结构化查询语言 其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式可能会存在一些不一样的地方,我们称为“方言”。 SQL通用语法 SQL 语句可以单行或多行书写,以分号结尾。 可使用空…

干货 | 如何让Zotero更加强大?这六个插件是您的不二之选!

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ Zotero是由安德鲁w梅隆基金会斯隆基金会以及美国博物馆和图书馆服务协会资助开发,是一个免费易用的文献管理软件,可协助我们收集、管理及引用研究资源,包括期刊、书籍…

系统集成项目管理工程师 笔记(第20章:知识产权管理、第21章:法律法规和标准规范)

文章目录 20.1.2 知识产权的特性 58420.2.1 著作权及邻接权 58520.2.2 专利权 58920.2.3 商标权 59221.3 诉讼时效 59921.6.3 标准分级与标准类型 60321.7.2 信息系统集成项目管理常用的技术标准 6061、基础标准2、开发标准3、文档标准4、管理标准 第20章 知识产权管理 584 20.…

LeetCode刷题系列之----->(指针玩转链表篇)(三)

🍉博客主页:阿博历练记 📖文章专栏:数据结构与算法 🔍代码仓库:阿博编程日记 🌹欢迎关注:欢迎友友们点赞收藏关注哦 文章目录 🖋1.题目描述💡 逻辑分析&#…

Java+Selenium常用方法梳理

五一假期,祝大家节日快乐。本篇继续自动化测试知识梳理。selenium 自己封装好用的方法,如悬停,句柄获取,可直接调用,实现自己的需求。 1、多窗口切换 即获取页面的句柄,来实现页面的切换,以ha…

GC日志分析工具一GCview使用介绍

目录 一、GCViewer介绍 二、GCViewer 使用 2.1 编译 2.2 使用 一、GCViewer介绍 业界较为流行分析GC日志的两个工具——GCViewer、GCEasy。GCEasy部分功能还是要收费的,今天笔者给大家介绍一下GCViewer的使用与功能点。Memory Analyzer Mat JVM 分析 二、GCVi…

Msfconsole使用永恒之蓝入侵Win7并上传执行可执行文件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、信息收集二、开始入侵1.启动msfconsole2.搜索漏洞3.文件上传其他 总结 前言 提示:这里可以添加本文要记录的大概内容: 我昨天我测…

初识springframework

目录 一.框架的概念: 1.什么是框架? 2.框架的作用? 二.springframework-core(bean容器) 1.什么是bean容器? 对bean容器的理解(M) 对IOC和DI的理解(M) DI的底层实现原理是依赖…

Linux:网络套接字

理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址. 思考: 我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上, 但是还需要有一个其他的标识来区分出, 这个数据要给哪个程序进行…

@Autowired和@Resource注解之间的关系区别,Bean的作用域和生命周期,Spring的执行流程

目录 一. Autowired 和 Resource 注解 二. Bean的作用域 1. singleton(单例模式) 2. prototype(原型模式)(多例模式) 3. 请求作用域:request 4. 会话作用域:session 三. Spring 的执行流程 四. Bean 的生命周期 1. 实例化 2. 设置属性 3. Bea…

【数据结构初阶】环形链表

目录 一、判断链表中是否存在环思路分析 二、求环的长度三、求入环点 一、判断链表中是否存在环 题目链接: 判断链表中是否存在环 思路 把它转换为追击问题(快慢指针) 快指针比慢指针多走一步,当快指针正好进入环时,慢…

脑科学数据挖掘论文精读系列(1)【抑郁对大脑神经影响和对脊椎损伤患者运动恢复的影响探究】

Depression mediated the relationships between precentral-subcortical causal links and motor recovery in spinal cord injury patients 手动防爬虫,原创作者CSDN:总是重复名字我很烦啊,联系邮箱daledeng123163.com直达原文 这是一篇收…

操作系统——操作系统用户界面

0.关注博主有更多知识 操作系统入门知识合集 目录 3.1操作系统启动过程 3.1.1BIOS和主引导记录MBR 思考题: 3.1.2操作系统的启动过程 思考题: 3.2用户界面 3.2.1用户界面概念 思考题: 3.2.2系统调用 3.1操作系统启动过程 3.1.1BIO…

【五一创作】使用Resnet残差网络对图像进行分类(猫十二分类,模型定义、训练、保存、预测)(一)

使用Resnet残差网络对图像进行分类 (猫十二分类,模型定义、训练、保存、预测)(一) 目录 一、项目简介 二、环境说明 1、安装库 2、导入需要的库 三、分类过程 (1)、解压数据集 (2&#xf…

Spring中的Bean

1. Bean的配置 Spring 可以被看作是一个大型工厂,这个工厂的作用就是生产和管理 Spring 容器中的Bean。如果想要在项目中使用这个工厂,就需要开发者对Spring 的配置文件进行配置。 Spring 容器支持XML 和 Properties 两种格式的配置文件,在实…

【Python Web】Flask超实用基础知识总结(内附代码)

Flask是一种轻量级Web应用框架,使用Python编写。它是一个简单易用的框架,适合构建小型到中型的Web应用程序。Flask提供了基本的Web开发功能,如路由、请求处理、模板渲染、文件上传等。 下面是Flask的一些基础语法 文章目录 1.静态文件处理2.…

【建议收藏】计算机视觉是什么?这几个计算机视觉的核心任务你真的了解吗?

文章目录 📚引言📖计算机视觉的核心任务📑图像分类和对象识别📑目标检测📑语义分割📑实例分割📑图像生成 📖计算机视觉的应用领域📑人脸识别📑自动驾驶&#…

【论文阅读】LORA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS

3.最近很多工作好像都绕不开lora,无论是sd还是llm.... 1. 背景 问题:大模型重新训练所有模型参数的完全微调变得不太可行。lora在做什么 我们提出了低秩自适应,即LoRA,它冻结预先训练的模型权重,并将可训练的秩分解矩…

高级数据结构 Trie树(字典树)

高级数据结构 Trie树(字典树) (Trie Tree)字典树_Rkun18的博客-CSDN博客 字典树节点表示 #define TRIE_MAX_CHAR_NUM 26 //这里你可以自由设置 根据不同需求设置 如果有大小或者其他符号你就需要增大这个数字struct TrieNode{T…

在amd64与arm上用paddlelite部署paddelOCR(Ascend硬件)

由于部署的硬件是华为昇腾 NPU(Ascend310),参考网址https://www.paddlepaddle.org.cn/lite/v2.10/demo_guides/huawei_ascend_npu.html#npu-paddle-lite 先拉取paddlelite用来编译库 git clone https://github.com/PaddlePaddle/Paddle-Lit…