自动化测试工具Selenium的语法续.

news2024/9/28 5:28:58

OK,那么上篇博客我们介绍了如何搭建基于Java+selenium的环境,并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例,那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法,感谢关注,期待三连~

目录

一、定位一组元素

二、下拉框处理

三、上传文件

四、quit和close的区别

五、浏览器页面跳转

六、截图操作


一、定位一组元素

webdriver 可以很方便的使用 fifindElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用fifindElements 方法。
定位一组对象一般用于以下场景:
1、批量操作对象,比如将页面上所有的 checkbox 都勾选上;
2、先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的
checkbox ,然后选择最后一个;
OK,我们来做个具体的演示:
1、在我们的桌面上新建一个文本文件,然后把下面的前端代码填入保存;

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Checkbox</title>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="c1">checkbox1</label>
<div class="controls">
<input type="checkbox" id="c1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c2">checkbox2</label>
<div class="controls">
<input type="checkbox" id="c2" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c3">checkbox3</label>
<div class="controls">
<input type="checkbox" id="c3" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio</label>
<div class="controls">
<input type="radio" id="r1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio</label>
<div class="controls">
<input type="radio" id="r2" />
</div>
</div>
</form>
</div>
</body>
</html>

2、保存之后,修改文件的名称为“xx.html”,我这里取的是demo6.html;

3、双击打开,观察界面展示;

 

那么这里我们想实现一次性勾选checkbox1,2,3这三个选项,即实现多选,那么怎么做呢?

也就是我们开头提到的定位一组元素,看代码实现:

package AutoTest.Selenium1;

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

import java.util.List;

//定位一组元素
public class demo6 {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.get("file:///C:/Users/ASUS/Desktop/demo6.html");

        List<WebElement> webElements = driver.findElements(By.cssSelector("input"));
        for (int i = 0; i < webElements.size(); i++) {
            if(webElements.get(i).getAttribute("type").equals("checkbox")){
                webElements.get(i).click();
            }else{
                //什么也不做
            }
        }
    }
}

我们发现是使用了List<WebElement>来存储所有带input标签的元素;

这个时候我们查看网页源代码,我们发现每个可以勾选的按钮都带有type属性;

 那么就可以使用方法getAttribute("type"),括号中放的是数据类型,来定位到所有类型带type的元素;定位到之后进行click()点击操作;

运行结果:

二、下拉框处理

那么我们在设计自动化用例的时候也经常会遇到input带下拉框的这种情况,比如下面:

源代码:

<html>
<body>
<select id="ShippingMethod"
onchange="updateShipping(options[selectedIndex]);" name="ShippingMethod">
<option value="12.51">UPS Next Day Air ==> $12.51</option>
<option value="11.61">UPS Next Day Air Saver ==> $11.61</option>
<option value="10.69">UPS 3 Day Select ==> $10.69</option>
<option value="9.03">UPS 2nd Day Air ==> $9.03</option>
<option value="8.34">UPS Ground ==> $8.34</option>
<option value="9.25">USPS Priority Mail Insured ==> $9.25</option>
<option value="7.45">USPS Priority Mail ==> $7.45</option>
<option value="3.20" selected="">USPS First Class ==> $3.20</option>
</select>
</body>
</html>

那么这种情况的话直接使用普通的cssSelector或者xpath方法是无法完成页面元素定位的,那么如何操作呢?这里主要会用到一个Select函数,创建一个Select对象,然后调用里面对应的方法;常见的使用下标定位或者通过value来进行定位;

package AutoTest.Selenium1;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.Select;

//下拉框处理
public class demo7 {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.manage().window().maximize();
        driver.get("file:///C:/Users/ASUS/Desktop/demo7.html");

        WebElement webElement = driver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(webElement);
        select.selectByIndex(3);
        select.selectByValue("9.03");
    }
}

value值查看:

三、上传文件

 先构建一个页面,代码如下:

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>upload_file</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js">
</script>
<link
href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstra
p-combined.min.css" rel="stylesheet" />
<script type="text/javascript">
</script>
</head>
<body>
<div class="row-fluid">
<div class="span6 well">
<h3>upload_file</h3>
<input type="file" name="file" />
</div>
</div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitterbootstrap/2.3.2/js/bootstrap.
min.js"></script>
</html>

效果:

自动化代码:

package AutoTest.Selenium1;

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

//上传文件
public class demo8 {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.manage().window().maximize();
        driver.get("file:///C:/Users/ASUS/Desktop/demo8.html");

        driver.findElement(By.cssSelector("input")).sendKeys("C:\\Users\\ASUS\\Desktop\\UPUP.txt");

    }
}

 定位到上传文件的按钮,然后输入自己要上传文件的路径即可,这里使用绝对路径和相对路径均可;运行结果:

四、quit和close的区别

quit是关闭整个浏览器,close只是关闭当前窗口,即quit会清空缓存,而close不会清空缓存。

代码验证:

package AutoTest.Selenium1;

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

import static java.lang.Thread.sleep;

//quit和close的区别
public class demo9 {
    public static void main(String[] args) throws InterruptedException {
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--remote-allow-origins=*");
            ChromeDriver driver = new ChromeDriver(options);
            driver.manage().window().maximize();
            driver.get("https://www.baidu.com");

//            driver.findElement(By.cssSelector("#kw")).sendKeys("杨幂");
            driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
            sleep(3000);
            //quit是关闭整个浏览器
//            driver.quit();
            //close只是关闭当前窗口
            driver.close();
            //即quit会清空缓存,而close不会清空缓存。
    }
}

 使用close()函数时,现在是打开了两个窗口句柄;

随着代码的运行,关闭了一个窗口句柄;

如果使用quit的话是运行结束之后直接退出浏览器;

五、浏览器页面跳转

那么我们在设计自动化代码的时候,可能会遇到页面从当前页面跳转到另一个新的页面,那么这个时候再去使用cssSelector或者Xpath方法去定位元素的话,肯定是定位不到的,因为跳转到了新的页面,get方法打开的是旧的页面,那么如何解决呢?

比如在百度首页,我们点击新闻这个超链接,那么浏览器会打开两个页面;

点击“新闻”按钮,来到了一个新的页面;

 

那么我们发现这个页面也是可以进行搜索框输入数据进行百度一下的;

看代码注释:

package AutoTest.Selenium1;

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

import java.util.Set;

import static java.lang.Thread.sleep;

public class demo10 {
    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.manage().window().maximize();
        driver.get("https://www.baidu.com");

        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);

        //通过getWindowHandles获取所有的窗口句柄
        //通过getWindowHandle获取get打开的页面窗口句柄
        Set<String> handles =  driver.getWindowHandles();
        //target用来获取当前最新的页面地址
        String target = "";
        for (String handle:handles) {
            target = handle;
        }
        driver.switchTo().window(target);
        driver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        driver.findElement(By.cssSelector("#s_btn_wr")).click();
    }
}

运行结果:

六、截图操作

这个操作的话就是会在指定的页面进行截图,然后保存到对应的路径,在实际工作中对比与我们的预期结果是否一致;

1、首先需要在我们的配置文件pom.xml中导入依赖;

 依赖代码:

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>

自动化代码:

package AutoTest.Selenium1;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.io.File;
import java.io.IOException;

import static java.lang.Thread.sleep;

/**
 * 截图操作:需要导入依赖,可以去pom.xml文件中查看依赖,依赖从maven中央仓库中搜索common-io,下载。
 */
public class dmeo11 {
    public static void main(String[] args) throws IOException, InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.manage().window().maximize();
        driver.get("https://www.baidu.com");

        driver.findElement(By.cssSelector("#kw")).sendKeys("自动化测试");
        driver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        File file = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(file,new File("D://demo10.png"));
    }
}

运行可以去我们自己设定的目录路径下面查看是否生成了对应的截图:

OK,以上就是selenium的所有常见操作的方法了,创作不易,可以动动小手一键三连啦,我们下篇博客更新自动化测试框架Junit的用法~

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

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

相关文章

快速学会创建uni-app项目并了解pages.json文件

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 创建 uni-app 项目 通过 HBuilderX 创建 pages.json pages style globalStyle tabBar 前言…

从零做软件开发项目系列之二——需求调研

在接到软件开发任务之后&#xff0c;第一件要做的事情就是进行需求调研工作&#xff0c;基于前期的沟通以及合同向用户了解具体需求&#xff0c;从而有针对性地开展后续工作。整个调研过程分为调研准备&#xff0c;调研实施&#xff0c;需求分析。 1 调研准备 俗话说&#x…

基于微信小程序的宠物领养平台的设计与实现(Java+spring boot+微信小程序+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于微信小程序的宠物领养平台的设计与实现&#xff08;Javaspring boot微信小程序MySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java…

【工程实践】使用pandas的记录

前言 工作中处理数据时&#xff0c;经常需要使用pandas&#xff0c;记录一些工作中使用pandas的习惯。 1. 合并数据 #读取原始数据 data1 pd.read_excel(/home/zhenhengdong/WORk/Classfier/Dates/Original/1.xlsx) data2 pd.read_excel(/home/zhenhengdong/WORk/Classfier/…

石油化工钻井消防vr虚拟教学实训增加学员参与感

随着石油化工企业的生产规模和数量不断扩大&#xff0c;石油化工火灾事故常有发生&#xff0c;给企业及当地居民造成难以挽回的严重损失&#xff0c;为了避免石油化工火灾安全事故发生&#xff0c;VR安全培训公司深圳华锐视点制作的石油化工火灾vr模拟应急救援系统&#xff0c;…

java+springboot+mysql小区自来水实时监控管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的小区自来水实时监控管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;楼栋管理&#xff1b;租户管理、用水管理&…

远程真机测试为什么需要应用性能指标监控?

我们在使用app、小程序等手机应用的时候&#xff0c;经常会发生“卡死“等现象。”卡死“会让用户认为你的app不可信&#xff0c;从而引发删除等情况。我们辛辛苦苦、花费大量精力和费用推广的app就失败了。 因此&#xff0c;我们就需要知道&#xff0c;app在使用时候&#…

ROS_LINUX入门学习笔记=2=

B站ros机器人工匠阿杰入门教程 rqt_robot_steering 控制小乌龟 在index ros .rog中查找相关的包&#xff1a;rosindex 下图是rqt_robot_steering的简介 其中可以查看github源码地址 website可以查看效果图 下载相关的包 sudo apt install ros-kinetic-rqt-robot-steering r…

项目实战笔记2:硬技能(上)

序&#xff1a; 本节串讲了项目管理硬技能&#xff0c;有些术语可以结合书或者网上资料来理解。没有想书上讲的那样一一列举。 做计划 首先强调为什么做计划&#xff1f; 计划就是各个角色协同工作的基准&#xff08;后面做风险监控、进度的监控&#xff09;&#xff0c;贯穿于…

【华为认证】HCIA真题20道(看看HCIA的技术你掌握了多少)

正在备考华为认证的小伙伴应该知道&#xff0c;除了理论知识外&#xff0c;刷题也相当重要&#xff0c;周工这里有一份HCIAHCIP-Datacom带解析的最新题库 点赞留言 即可领取。 下图所示&#xff0c;主机A和主机B使用哪种网络设备可以实现通信&#xff1f;&#xff08; &…

设计模式-工厂设计模式

核心思想 在简单工厂模式的基础上进一步的抽象化具备更多的可扩展和复用性&#xff0c;增强代码的可读性使添加产品不需要修改原来的代码&#xff0c;满足开闭原则 优缺点 优点 符合单一职责&#xff0c;每个工厂只负责生产对应的产品符合开闭原则&#xff0c;添加产品只需添…

骨传导耳机品牌推荐,精选十大骨传导耳机品牌推荐

随着手机作为大众日常生活不可分割的一部分&#xff0c;使用耳机也成为了许多人的日常。相较于有线耳机&#xff0c;有越来越多的人愿意去选择无线耳机&#xff0c;骨传导耳机的受众也进一步提高了&#xff0c;那么面对市面上眼花缭乱的品牌&#xff0c;该如何选择呢&#xff1…

怎样清理电脑内存?分享4个快速清理方法!

“求救求救&#xff01;电脑总是没内存怎么办啊&#xff1f;明明没有存很多东西啊&#xff0c;电脑容量也很大&#xff0c;总是没内存真的很影响心情哎&#xff01;有什么方法可以解决这个问题吗&#xff1f;” 电脑内存的清理是维护系统性能的重要步骤之一。如果电脑内存不足&…

Powered by Paraverse | 平行云助力彼真科技打造演出“新物种”

01 怎么看待虚拟演出 彼真科技 我们怎么看待虚拟演出&#xff1f; 虚拟演出给音乐人或者音乐行业带来了哪些新的机会&#xff1f;通过呈现一场高标准的虚拟演出&#xff0c;我们的能力延伸点在哪里&#xff1f; 先说一下我们认知里的虚拟演出的本质&#xff1a; 音乐演出是一…

一天赚四五十的副业,可以试试这几种

大家都希望能够有额外的零花钱&#xff0c;尤其是对于学生和不收入稳定的人来说。今天&#xff0c;我将分享一些简单实用的赚钱技巧&#xff0c;帮助你每天赚取四五十的零花钱&#xff0c;让你的钱包更丰盈。 第一种&#xff1a;蚂蚁路客和友活来了 支付宝旗下两款接任务拍门…

消息队列——RabbitMQ(一)

MQ的相关概念 什么事mq MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xff…

智汇云舟携三大系列产品亮相第68届中国安防工程商集成商大会

8月18日&#xff0c;由中国安全防范产品行业协会指导&#xff0c;永泰传媒主办的中国安防工程商&#xff08;系统集成商&#xff09;大会暨第68届中国安防新产品、新技术成果展示在广州盛大开幕。 来自华南各省、市安防协&#xff08;学&#xff09;会及全国安防工程商、系统集…

使用本地电脑搭建可以远程访问的SFTP服务器

文章目录 1. 搭建SFTP服务器1.1 下载 freesshd 服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2. 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内网连接测试成功 3. 使用cpolar内网穿透3.1 创建SFTP隧道3.2 查看在线隧道列表 4. 使用SFTP客户端&#x…

C++系列-浅拷贝和深拷贝

浅拷贝和深拷贝 浅拷贝深拷贝 如果属性有在堆区开辟内存的&#xff0c;一定要自己提供拷贝构造函数&#xff0c;进行深拷贝&#xff0c;以免堆区内存重复释放。 浅拷贝 浅拷贝会带来的问题是堆区空间重复释放 因为是浅拷贝&#xff0c;在调用第二个对象的析构函数时&#xff0…

React前端开发架构:构建现代响应式用户界面

在当今的Web应用开发中&#xff0c;React已经成为最受欢迎的前端框架之一。它的出色性能、灵活性和组件化开发模式&#xff0c;使得它成为构建现代响应式用户界面的理想选择。在这篇文章中&#xff0c;我们将探讨React前端开发架构的核心概念和最佳实践&#xff0c;以帮助您构建…