八、自动化函数

1.元素的定位

web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。

常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector

常用的主要由cssSelector和xpath

1.1 cssSelector选择器

选择器的功能:选中页面中指定的标签元素

选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位。

selector选择器

xpath

XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点。

xpath使用路径表达式来选择xml文档中的节点

xpath语法中:

xpath://*[@id=“kw”]

1.2.1 获取HTML页面所有的节点

//*

1.2.2 获取HTML页面指定的节点

//[指定节点]

//ul:获取HTML页面所有的ul节点

//input:获取HTML页面所有的input节点

1.2.3 获取一个节点中的直接子节点

/

//span/input

1.2.4 获取一个节点的父节点

//input/…获取input节点的父节点

1.2.5实现节点属性的匹配

[@…]

//*[@id=‘kw’]匹配HTML页面中id属性为kw的节点

1.2.6 使用指定索引的方式获取对应的节点内容

注意:xpath的索引是从1开始的。

百度热搜xpath定位://*[@id=“s-hotsearch-wrapper”]/div

更便捷的生成selector/xpath的方式:右键选择复制"Copy selector/xpath"

没有这样的元素

注意:登录状态下和非登录状态下自动化打开的页面不一定相同,因为在做自动化测试一定要注意页面状态的一致性NoSuchElementException找不到元素异常

findElement(By) 在页面查找元素,返回值Element

findElements(By) 在页面查找元素,返回值为List

2.操作测试对象

获取到了页面的元素之后,接下来就是要对元素进行操作了。常见的操作有点击、提交、输入、清除、获取文本。

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;public class SeleniumChromeTest {public static void main(String[] args) throws InterruptedException {// 设置 ChromeDriver 的路径String chromeDriverPath = "D:\\网页下载\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"; // 替换为你的 chromedriver 路径System.setProperty("webdriver.chrome.driver", chromeDriverPath);// 配置 Chrome 浏览器选项ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*"); // 解决某些版本的兼容性问题// 初始化 ChromeDriverWebDriver driver = new ChromeDriver(options);try {// 打开目标网页driver.get("https://www.baidu.com");// 等待页面加载完成Thread.sleep(2000);// 定位搜索框元素WebElement searchBox = driver.findElement(By.id("kw"));// 在搜索框中输入内容searchBox.sendKeys("Selenium Java 自动化测试");// 定位“百度一下”按钮WebElement searchButton = driver.findElement(By.id("su"));// 点击按钮提交搜索searchButton.click();// 等待搜索结果加载完成Thread.sleep(3000);// 输出当前页面的标题System.out.println("当前页面标题: " + driver.getTitle());} catch (Exception e) {e.printStackTrace();} finally {// 关闭浏览器driver.quit();}}
}
2.1点击/提交对象

click()

// 找到百度一下按钮并点击

driver.findElement(By.cssSelector(“#su”)).click();

除了按钮之外,页面的绝大多数元素都可以点击

页面隐藏的标签、不可见的标签就不能点击。

第一步筛选:看标签的属性是否有hidden关键字

第二步:看每个标签对应的样式

2.2模拟按键输入

sendKeys(“”)

driver.findElement(By.cssSelector(“#kw”)).sendKeys(“输入文字”);

输入框可以接收的内容都可以通过sendKeys发送过去

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.apache.commons.io.FileUtils;import java.io.File;
import java.time.Duration;
import java.util.List;public class FirstTest {WebDriver driver = null;void createDriver() {String chromeDriverPath = "D:\\网页下载\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"; // 替换为你的 chromedriver 路径System.setProperty("webdriver.chrome.driver", chromeDriverPath);// 增加浏览器配置:创建驱动对象要强制指定允许访问所有的链接// 配置 Chrome 浏览器选项ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*"); // 解决某些版本的兼容性问题// 初始化 ChromeDriverdriver = new ChromeDriver(options);}// 测试百度搜索关键字:迪丽热巴void test01() throws InterruptedException {createDriver();try {// 2.输入完整的网址: https://www.baidu.comdriver.get("https://www.baidu.com");WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));// 3.找到输入框,并输入关键词:迪丽热巴wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#kw"))).sendKeys("迪丽热巴");// 4.找到百度一下按钮,并点击wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#su"))).click();} catch (Exception e) {e.printStackTrace();takeScreenshot();} finally {if (driver != null) {Thread.sleep(8000);// 5.关闭浏览器driver.quit();}}}private void takeScreenshot() {if (driver != null) {try {File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(screenshot, new File("screenshot.png"));System.out.println("截图已保存到 screenshot.png");} catch (Exception e) {e.printStackTrace();}}}// 元素的定位void test02() throws InterruptedException {createDriver();// 选择器driver.findElement(By.cssSelector("#s-hotsearch-wrapper > div"));driver.findElement(By.xpath("//*[@id=\"s-hotsearch-wrapper\"]/div"));List<WebElement> ll = driver.findElements(By.cssSelector("#hotsearch-content-wrapper > li > a >span.title-content-title"));for (int i = 0; i < 10; i++) {// 获取元素Ele对应的文本System.out.println(ll.get(i).getText());}driver.quit();}// 操作元素void test03() throws InterruptedException {createDriver();//        WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//        ele.click();try {// 打开目标网页driver.get("https://www.baidu.com");// 等待页面加载完成Thread.sleep(2000);// 这两行代码是上面的测试代码
//            WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//            ele.click();// 定位搜索框元素WebElement searchBox = driver.findElement(By.id("kw"));// 在搜索框中输入内容searchBox.sendKeys("Java语言");// 定位“百度一下”按钮WebElement searchButton = driver.findElement(By.id("su"));// 点击按钮提交搜索searchButton.click();// 等待搜索结果加载完成Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();} finally {// 关闭浏览器driver.quit();}}
}
2.3清除文本内容

输入文本后又想换一个新的关键词,这里就需要用到clear()

若想要在一个场景下更换多个关键词,需要将前一个关键词清除掉,若不清除,每次sendKeys将完成拼接的操作

void test03() throws InterruptedException {createDriver();//        WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//        ele.click();try {// 打开目标网页driver.get("https://www.baidu.com");// 等待页面加载完成Thread.sleep(2000);// 这两行代码是上面的测试代码
//            WebElement ele = driver.findElement(By.cssSelector("#head_wrapper"));
//            ele.click();// 定位搜索框元素WebElement searchBox = driver.findElement(By.id("kw"));// 在搜索框中输入内容searchBox.sendKeys("Java语言");Thread.sleep(2000);searchBox.clear();Thread.sleep(2000);searchBox.sendKeys("赏心悦目的图片");// 定位“百度一下”按钮WebElement searchButton = driver.findElement(By.id("su"));// 点击按钮提交搜索searchButton.click();// 等待搜索结果加载完成Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();} finally {// 关闭浏览器driver.quit();}}
2.4获取文本信息

如果判断获取到的元素对应的文本是否符合预期呢?获取元素对应的文本并打印一下

获取文本信息:getText()

为什么打印的txt为空?

因为"百度一下"是input标签里的属性值 getAttribute(String)

2.5获取当前页面标题和URL

getTitle()

getCurrentUrl()

3.窗口设置大小

1)窗口的大小设置

// 窗口最小化
driver.manage().window().minimize();
// 窗口最大化
driver.manage().window().maximize();
// 窗口全屏
driver.manage().window().fullscreen();
// 手动设置窗口大小
driver.manage().window().setSize(new Dimension(800, 600));

打开百度新闻(窗口的切换)

是两个新闻标签页

1)获取当前页面句柄

driver.getWindowHandle();

2)获取所有页面句柄:

driver.getWindowHandles();

void test04() {createDriver();try {// 打开百度首页driver.get("https://www.baidu.com");System.out.println("已打开百度首页:" + driver.getTitle());// 显式等待页面加载完成WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));// 点击“新闻”链接WebElement newsLink = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#s-top-left > a:nth-child(1)")));newsLink.click();System.out.println("已点击新闻链接");// 获取当前窗口句柄String curHandle = driver.getWindowHandle();System.out.println("当前窗口句柄为:" + curHandle);System.out.println("===============================================");// 获取所有窗口句柄并切换到新窗口Set<String> allHandles = driver.getWindowHandles();for (String handle : allHandles) {if (!handle.equals(curHandle)) { // 使用 equals() 比较字符串driver.switchTo().window(handle);System.out.println("跳转之后:" + driver.getTitle());// 显式等待目标元素加载完成WebElement headlineTabs = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#headline-tabs > ul")));System.out.println("找到目标元素:" + headlineTabs.getText());break; // 切换到新窗口后退出循环}}} catch (Exception e) {e.printStackTrace();} finally {// 关闭浏览器if (driver != null) {driver.quit();}}
}

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

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

相关文章

Web三漏洞学习(其二:sql注入)

靶场&#xff1a;NSSCTF 、云曦历年考核题 二、sql注入 NSSCTF 【SWPUCTF 2021 新生赛】easy_sql 这题虽然之前做过&#xff0c;但为了学习sql&#xff0c;整理一下就再写一次 打开以后是杰哥的界面 注意到html网页标题的名称是 “参数是wllm” 那就传参数值试一试 首先判…

单片机非耦合业务逻辑框架

在小型单片机项目开发初期&#xff0c;由于业务逻辑相对简单&#xff0c;我们往往较少关注程序架构层面的设计。 然而随着项目经验的积累&#xff0c;开发者会逐渐意识到模块间的耦合问题&#xff1a;当功能迭代时&#xff0c;一处修改可能引发连锁反应。 此时&#xff0c;构…

Zookeeper三台服务器三节点集群部署(docker-compose方式)

1. 准备工作 - 服务器:3 台服务器,IP 地址分别为 `10.10.10.11`、`10.10.10.12`、`10.10.10.13`。 - 安装 Docker:确保每台服务器已安装 Docker 和 Docker Compose。 - 网络通信:确保三台服务器之间可以通过 IP 地址互相访问,并开放以下端口: - `2181`:Zookeeper 客户…

Mac关闭sip方法

Mac关闭sip方法 导航 文章目录 Mac关闭sip方法导航完整操作流程图详细步骤 完整操作流程图 这东西是我在网上搬运下来的&#xff0c;但是我在为业务实操过程中&#xff0c;根据实操情况还是有新的注意点的 详细步骤 1.在「关于本机」-「系统报告」-「软件」;查看SIP是否开启…

C++| 深入剖析std::list底层实现:链表结构与内存管理机制

引言 std::list的底层实现基于双向链表&#xff0c;其设计哲学与std::vector截然不同。本文将深入探讨其节点结构、内存分配策略及迭代器实现原理&#xff0c;揭示链表的性能优势和潜在代价。 1. 底层数据结构&#xff1a;双向链表 每个std::list节点包含&#xff1a; 数据域…

汉诺塔问题——用贪心算法解决

目录 一&#xff1a;起源 二&#xff1a;问题描述 三&#xff1a;规律 三&#xff1a;解决方案 递归算法 四&#xff1a;代码实现 复杂度分析 一&#xff1a;起源 汉诺塔&#xff08;Tower of Hanoi&#xff09;问题起源于一个印度的古老传说。在世界中心贝拿勒斯&#…

【Python】Python 100题 分类入门练习题 - 新手友好

Python 100题 分类入门练习题 - 新手友好篇 - 整合篇 一、数学问题题目1&#xff1a;组合数字题目2&#xff1a;利润计算题目3&#xff1a;完全平方数题目4&#xff1a;日期天数计算题目11&#xff1a;兔子繁殖问题题目18&#xff1a;数列求和题目19&#xff1a;完数判断题目21…

【linux】--- 进程概念

进程概念 1.认识冯诺依曼结构2. 操作系统&#xff08;Operator system)2.1 概念2.2 设计OS的目的2.3 理解操作系统2.4 如何理解管理2.5 理解系统调用和库函数 3. 进程3.1 基本概念和基本操作3.1.1 描述进程 - PCB3.1.2 task_struct3.1.3 查看进程 3.2 进程状态3.2.1 运行&&…

算法堆排序记录

【算法】排序算法之堆排序 - 知乎 应用场景&#xff1a;获取第n个大或者小的数 操作步骤&#xff1a; 1、将数组构造成堆 2、调整根节点为最大堆 ->倒序对每个根节点执行最大化 ->根节点最大化过程中如果发生交换&#xff0c;需要保证子节点也为最大堆&#xff08;执行…

STM32 模块化开发实战指南:系列介绍

本文是《STM32 模块化开发实战指南》系列的导读篇,旨在介绍整个系列的写作目的、适用读者、技术路径和每一篇的主题规划。适合从事 STM32、裸机或 RTOS 嵌入式开发的个人开发者、初创工程师或企业项目团队。 为什么要写这个系列? 在嵌入式开发中,很多人刚开始都是从点亮一个…

【眼底辅助诊断开放平台】项目笔记

这是一个标题 任务一前端页面开发&#xff1a;后端接口配置&#xff1a; 任务二自行部署接入服务 日志修改样式和解析MD文档接入服务 Note前端登陆不进去/更改后端api接口304 Not Modifiedlogin.cache.jsonERR_CONNECTION_TIMED_OUT跨域一般提交格式proxy.ts src/coponents 目录…

【后端开发】Spring MVC-计算器、用户登录、留言板

文章目录 前后端分离设计接口设计思路项目问题解决思路 计算器需求分析接口定义前端页面代码服务器代码 用户登录需求分析接口定义用户登录校验接口查询登录用户接口 前端页面代码用户登录校验查询登录用户 服务器代码前后端交互 留言版需求分析接口定义获取全部留言发布留言前…

在Ubuntu-22.04.5中安装ONLYOFFICE DocSpace(协作空间)【注意:安装失败,谨慎参考!】

1. 通过Docker安装 预计需要下载10G的镜像。 &#xff08;1&#xff09;下载docspace安装脚本 curl -fsSL https://download.onlyoffice.com/docspace/docspace-install.sh -o docspace-install.sh &#xff08;2&#xff09;修改docker compose的别名为docker-compose ali…

2025年计算机领域重大技术突破与行业动态综述

——前沿技术重塑未来&#xff0c;开发者如何把握机遇&#xff1f; 2025年第一季度&#xff0c;全球计算机领域迎来多项里程碑式进展&#xff0c;从量子计算到人工智能&#xff0c;从芯片设计到网络安全&#xff0c;技术革新与产业融合持续加速。本文梳理近三个月内最具影响力…

一、LLM 大语言模型初窥:起源、概念与核心原理

一、初识大模型 1.1 人工智能演进与大模型兴起:从A11.0到A12.0的变迁 AI 1.0时代&#xff08;2012-2022年&#xff09; 感知智能的突破&#xff1a;以卷积神经网络&#xff08;CNN&#xff09;为核心&#xff0c;AI在图像识别、语音处理等感知任务中超越人类水平。例如&#…

Redis 分布式锁+秒杀异步优化

文章目录 问题思路setnx实现锁误删问题和解决方案Redis Lua脚本问题引出解决方案 setnx实现的问题Redission快速入门redission可重入锁原理 秒杀优化(异步优化)异步秒杀思路秒杀资格判断Redis消息队列 问题 比如我们两个机器都部署了我们项目&#xff0c;这里nginx使用轮询的方…

机器学习中的距离度量与优化方法:从曼哈顿距离到梯度下降

目录 前言一、曼哈顿距离(Manhattan Distance)&#xff1a;二、切比雪夫距离 (Chebyshev Distance)&#xff1a;三、 闵可夫斯基距离(Minkowski Distance)&#xff1a;小结四、余弦距离(Cosine Distance)五、杰卡德距离(Jaccard Distance)六、交叉验证方法6.1 HoldOut Cross-v…

HTML 嵌入标签对比:小众(<embed>、<object>) 与 <iframe> 的优缺点及使用场景和方式

需求背景 在网页开发中&#xff0c;嵌入外部资源预览&#xff08;如视频、PDF、地图或其他网页&#xff09;是常见的需求。HTML 提供了多种标签来实现这一功能&#xff0c;其中 <embed>、<object> 和 <iframe> 是最常用的三种。本文将对比它们的优缺点&…

未来七轴机器人会占据主流?深度解析具身智能方向当前六轴机器人和七轴机器人的区别,七轴力控机器人发展会加快吗?

六轴机器人和七轴机器人在设计、功能和应用场景上存在明显区别。六轴机器人是工业机器人的传统架构&#xff0c;而七轴机器人则在多自由度和灵活性方面进行了增强。 本文将在理解这两者的区别以及为何六轴机器人仍然是市场主流&#xff0c;从多个方面进行深入解读六轴和七轴区…

C++基础精讲-07

文章目录 1. const对象2. 指向对象的指针3. 对象数组4. c中const常见用法总结4.1 修饰常量4.2 修饰指针4.3 修饰函数参数4.4 修饰函数返回值4.5 修饰成员函数4.6 const对象 5. 赋值运算符函数&#xff08;补充&#xff09;5.1 概念5.2 默认赋值运算符函数局限5.3 解决办法 1. c…