自动化测试selenium(2)

目录

WebDriver介绍

WebDriver使用

使用WebDriver驱动操作浏览器(打开一个百度)

WebDriver 相关API

定位元素

操作元素


上一篇主要介绍了自动化测试的概念以及selenium的基本原理, 这里我们来讲一下如何利用selenium来写测试用的脚本.

WebDriver介绍

Selenium是一个用于自动化网页浏览操作的工具, 而WebDriver是一个Selenium的一个子项目,它提供了一个用于控制各种浏览器的编程接口(也就是我们之前提到的浏览器驱动). 简单地说, WebDriver是Selenium的一个实现, 它提供了与浏览器交互的功能.

具体来说, WebDriver提供了一组API, 允许开发人员以编程的方式模拟用户在浏览器中进行的各种操作, 例如点击链接, 填写表单, 提交表单, 模拟键盘输入等等. 通过使用WebDriver, 开发人员可以编写自动化测试脚本, 来对网页进行功能测试, 界面测试等.

总之, Selenium和WebDriver是紧密相关的, WebDriver是Selenium的一部分, 提供了对浏览器的控制能力, 而Selenium是一个更广泛的项目, 包含了WebDriver在内的多个组件, 用于支持网页自动化测试等应用场景.

WebDriver使用

这里就不教大家如何搭建环境了, 建议跳转到其它地方自行搭建(主要作者比较懒). 然后后面的环境均为Chrome浏览器, 使用的语言是Java.

使用WebDriver驱动操作浏览器(打开一个百度)

直接给出代码:

    public static void test01() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
    }

 这段代码时使用WebDriver控制Chrome浏览器的一个典型案例, 下面解析一下代码:

1.ChromeOptions options = new ChromeOptions();

这是创建了一个ChromeOptions对象, 用于配置Chrome浏览器的选项.

2.options.addArguments("--remote-allow-origins=*")

这里使用这个参数即允许所有请求之意

3.WebDriver webDriver = new ChromeDriver(options);

使用ChromeOptions创建一个ChromeDriver对象, 这个对象将用于控制Chrome浏览器.

4.使用webDriver的get方法访问指定的URL.

WebDriver 相关API

定位元素

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

那么我们在百度中如何确定一个元素的位置呢, 这里就用到了定位元素的方法. 下面主要介绍两种.

(1)CSS选择器定位元素

就是用到了CSS里的语法

类选择器: .class值(.s_ipt)

id选择器: #id值 (#kw)

标签选择器: 标签名.

(2)xPath定位元素(xpath是一个语法)

绝对路径(通过 / 开头): /html/body/div/div/div(不常用).

相对路径(通过 // 开头):

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

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

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

4.相对路径 + 文本匹配: //span[text()="我是文本"]

如何选择:>

 

举例: 通过两种方式定位"百度搜索框"元素. 

​
//1.使用CSS选择器定位
//".s_ipt"表示通过这个类名来定位元素, 然后使用webDriver.findElement()方法来查找这个元素
WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
//2.使用XPath定位
//引号内是XPath表达式, 表示通过id属性为'kw'来定位元素, 然后使用webDriver.findElement()方法查找元素
WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));

​

CSS选择器和XPath选择器的区别:

1. 语法: CSS选择器使用类似于CSS的语法, 选择器简单明了, 易于理解和书写.  XPath选择器语法比较复杂, 但更灵活

2.性能: 一般情况下, CSS选择器性能比XPath选择器更好. 因为浏览器在解析CSS选择器时, 可以直接使用底层的浏览器引擎优化, 而XPath则需要额外的解析和计算成本.

3.灵活性: XPath选择器要比CSS选择器更加灵活, 可以实现更复杂的定位逻辑.

4.可读性: CSS选择器通常更直观, 已于理解和维护, 特别是对简单的选择器. XPath选择器语法相对复杂, 可能不太容易理解, 特别是对于不熟悉XPath的开发者.

操作元素

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

click 点击对象

sendKeys 在对象上模拟按键输入

clear 清除对象输入的文本内容

submit 提交

text 用于获取元素的文本信息

下面来举个栗子:

//找到百度搜索框
WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
//输入软件测试
element.sendKeys("软件测试");
//点击百度一下并点击
webDriver.findElement(By.cssSelector("#su")).click();
//清空输入框
element.clear();       

这样就可以轻松完成输入->点击->清空输入框这一系列操作. 

 通过getText()获取到页面的内容:

        //点击百度一下并点击
        webDriver.findElement(By.cssSelector("#su")).click();
        Thread.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());
        }

运行结果:

通过这个写一个简单的测试脚本: 

//校验
        //找到搜索结果
        List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));
        int flag = 0;
        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("测试不通过");
        }

 而submit()方法顾名思义是用于提交表单, 让我们举个使用的栗子:

        //定位到百度搜索框
        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        //输入要搜索的内容
        element.sendKeys("软件测试");
        //找到百度一下按钮
        WebElement button = webDriver.findElement(By.cssSelector("#su"));
        button.submit();

运行结果:

  

也是成功地跳转了, 而我们发现, 这个操作似乎与click()方法作用一致, 但是实际上仍是有一定去别的. 就是submit操作的元素需要放在from表单内, 而click则没有这个限制(所以更加推荐使用click()方法).

观察一下:

我们再使用一个没有form表单的来对比一下.

其中页面中"新闻"并没有在form表单内. 下面来写一个测试脚本.

    public static void test03() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();
    }

 运行结果:

很显然, 报错了, 因此我们不能对非form表单中的元素使用submit()方法.

添加等待

之前我们也学到过使用Thread.sleep(time_out)来进行强制等待, 在这里我们不再过多赘述.

这里我们学习一下只能等待.

 "智能等待"指的是在某些情况下, 没有其它更好的解决方案, 只能通过等待来解决问题. 在软件开发或自动化测试中, 经常会遇到需要等待某些条件满足的情况, 例如等待页面加载完成, 等待元素, 等待异步操作完成等.(突出体现在设定一定的时间, 不一定等待时间到了才操作, 当资源准备好之后, 在时间范围内即可操作).

在Web自动化测试中, 等待是一种常见技术, 用于处理页面加载速度,  网络延迟或异步操作等因素带来的不确定性. 通过等待, 可以确保在进行后续, 页面已经加载完成或者目标元素已经出现, 从而避免因为页面未完全加载或元素未出现而导致的测试失败或错误.

在Selenium WebDriver中, 提供了不同类型的等待方式,  例如隐式等待, 显式等待和硬性等待等, 可以选择根据具体的情况选择合适的等待方式来确保测试的稳定性和可靠性.

 隐式等待

通过添加implicitlyWait()方法就可以方便地实现智能等待;

//使用: 数目, 单位
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);

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

 

 

 

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

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

相关文章

GitHub repository - Branch - SSH clone URL - Clone in Desktop - Download ZIP

GitHub repository - Branch - SSH clone URL - Clone in Desktop - Download ZIP 1. Branch2. SSH clone URL3. Clone in Desktop4. Download ZIPReferences 1. Branch 显示当前分支的名称。从这里可以切换仓库内分支&#xff0c;查看其他分支的文件。 2. SSH clone U…

单细胞RNA测序(scRNA-seq)Cellranger流程入门和数据质控

单细胞RNA测序(scRNA-seq)Cellranger流程入门和数据质控 单细胞RNA测序(scRNA-seq)基础知识可查看以下文章: 单细胞RNA测序(scRNA-seq)工作流程入门 单细胞RNA测序(scRNA-seq)细胞分离与扩增 1. 单细胞RNA-seq样本数据说明 样本数据来源文章:Acquired cancer re…

Unity TextMeshProUGUI 获取文本尺寸·大小

一般使用ContentSizeFitter组件自动变更大小 API 渲染前 Vector2 GetPreferredValues(string text)Vector2 GetPreferredValues(string text, float width, float height)Vector2 GetPreferredValues(float width, float height) 渲染后 Vector2 GetRenderedValues()Vector…

自动化测试(selenium篇)

这次我们来介绍selenium 我们主要来讲解这几个要点 1.什么是自动化测试 2.什么是selenium 3.为什么来讲selenium 4.selenium的环境搭建 5.selenium的 API 1.什么是自动化测试 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条…

快速掌握缓存技术:学习多个缓存供应商(ehcache,redis,memcached,jetcache,j2cache)

缓存技术 缓存模拟缓存Spring缓存技术第三方缓存技术Ehcache缓存供应Redis缓存memcached缓存&#xff08;国内&#xff09; jetcache缓存供应商jetcache的基本使用设置外部服务设置本地服务 jetcache方法缓存j2cache 缓存 什么是缓存 缓存是一种介于数据永久存储介质与数据应用…

【U8+】打开固定资产卡片提示:运行时错误‘91’,未设置对象变量或with block变量。

【问题描述】 用友U8软件&#xff0c;固定资产模中打开某张卡片后&#xff0c; 提示&#xff1a;运行时错误‘91’&#xff0c;未设置对象变量或with block变量。 Ps&#xff1a;但不是所有卡片打开的时候都会提示&#xff0c;有的正常。 【解决方法】 跟踪数据库后&#xff…

【高效开发工具系列】obsutil安装与使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

SpringBoot工程快速构建

一、构建流程 1.创建Maven项目 2.导入SpringBoot起步依赖 3.定义Controller 4.编写引导类 5.启动测试 二、使用idea快速构建 1.创建SpringBoot模块 2.勾选依赖 3.定义Controller 4.启动测试

Angular 使用DomSanitizer防范跨站脚本攻击

跨站脚本Cross-site scripting 简称XSS&#xff0c;是代码注入的一种&#xff0c;是一种网站应用程序的安全漏洞攻击。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在使用网页时就会收到影响&#xff0c;这类攻击通常包含了HTML和用户端脚本语言&#xff08;JS&…

【vue】用vite创建vue项目

前置要求 要有Node.js 1. 用vite创建vue项目 在cmd中&#xff0c;进入一个文件夹 在文件资源管理器上面的文件目录中&#xff0c;输入cmd&#xff0c;回车在cmd中通过cd命令进入对应文件夹 创建项目 npm create vitelatest # 创建项目创建项目过程中的一些选项 Ok to pro…

MyBatis源码介绍

文章目录 MyBatis的核心流程介绍SqlSessionFactory的理解MyBatis中的Executor的源码理解Spring中是如何解决MySQL的SqlSession的线程安全问题MyBatis面向Mapper编程工作原理Mybatis动态sql执行原理Mybatis的一级、二级缓存实现原理Mybatis的插件运行原理以及如何编写一个插件my…

【力扣】142. 环形链表 II

142. 环形链表 II 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&am…

Filebeat+Kafka+ELK 的服务部署

一. kafka 架构深入 1.1 Kafka 工作流程及文件存储机制 Kafka 中消息是以 topic 进行分类的&#xff0c;生产者生产消息&#xff0c;消费者消费消息&#xff0c;都是面向 topic 的。 topic 是逻辑上的概念&#xff0c;而 partition 是物理上的概念&#xff0c;每个 partit…

javaScript设计模式之简单工厂模式

简单工厂模式(Simple Factory):又叫静态工厂方法&#xff0c;由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。 场景一 假设我们需要计算圆形和矩形的面积 function Circle(radius) {this.radius radius;}Circle.prototype.getArea function() {re…

[Win11·Copilot] Win11 系统更新重启后任务栏 Copilot 图标突然消失 | 解决方案

文章目录 前言Copilot介绍产生异常的原因解决方案总结 前言 在 Windows 11 的最新系统更新之后&#xff0c;一些用户报告了任务栏中 Copilot 图标消失的问题。这篇技术博文将为您提供详细的解决方案&#xff0c;帮助您恢复 Copilot 图标&#xff0c;并确保您能够继续享受 Copi…

设计模式——迭代器模式15

迭代器模式提供一种方法访问一个容器对象中各个元素&#xff0c;而又不需暴露该对象的内部细节。 设计模式&#xff0c;一定要敲代码理解 抽象迭代器 /*** 迭代抽象* */ public interface Iterator<A> {A next();boolean hasNext(); }迭代器实现 /*** author ggbond*…

git工具上传文件超过100MB解决方法

Github 上传超过100M的大文件 - 简书 (jianshu.com) 看到一个不错的贴子。 29660DESKTOP-CAB6SQB MINGW64 /d/predict-system $ git init Initialized empty Git repository in D:/predict-system/.git/29660DESKTOP-CAB6SQB MINGW64 /d/predict-system (master) $ git lfs tr…

2024年mathorcup数学建模C题思路分析-物流网络分拣中心货量预测及人员排班

# 1 赛题 C 题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图 ’ 是一个简化的物流 网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同 流向进行分拣并发往下一个场地&#xff0c;最终使包裹…

BERT论文解读及情感分类实战

文章目录 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence Prediction (NSP)模型输入 下游任务微调GLUE数据集SQuAD v1.1 和 v2.0NER 情感分类实战IMDB影评情感数据集数据集构建模型构建超参数设置训练结果注意事项 简…

重生奇迹MU圣导师与弓箭手职业对比

职业定位对比 在职业定位上&#xff0c;弓箭手是一个远程物理输出职业&#xff0c;不过弓箭手也有一定的辅助能力&#xff0c;可以为队友提供控场效果&#xff0c;还能为队友提供一个攻击力加成BUFF。同时弓箭手也是一个非常需要操作的职业&#xff0c;想要玩好这个职业&#…