自动化测试常用函数:元素定位、操作与窗口管理

news2024/9/25 14:05:50

目录

一、元素的定位

1. cssSelector

2. xpath

2.1 获取HTML页面所有的节点

2.2 获取HTML页面指定的节点

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

2.4 获取一个节点的父节点

2.5 实现节点属性的匹配

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

二、操作测试对象

1. 点击/提交对象

2. 模拟按键输入

3. 清除文本内容

4. 获取文本信息

5. 获取当前页面标题

6. 获取当前页面URL

三、窗口

1. 切换窗口

2. 窗口设置大小

3. 屏幕截图

4. 关闭窗口


一、元素的定位

  • web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。
  • 常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector。
  • 常用的主要有 cssSelector xpath。

常见浏览器打开开发者工具的方法:

1. Google Chrome:

  • 右键点击网页,选择“检查”(Inspect)。
  • 按 `Ctrl + Shift + I`(Windows/Linux)或 `Command + Option + I`(Mac)。

2. Mozilla Firefox:

  • 右键点击网页,选择“检查元素”(Inspect Element)。
  • 按 `Ctrl + Shift + I`(Windows/Linux)或 `Command + Option + I`(Mac)。

3. Microsoft Edge:

  • 右键点击网页,选择“检查”(Inspect)。
  • 按 `Ctrl + Shift + I`(Windows)。

4. Safari:

  • 在菜单栏中选择“开发”,然后选择“显示 Web 检查器”(Show Web Inspector)。
  • 按 `Command + Option + I`。

5. Opera:

  • 右键点击网页,选择“检查”(Inspect)。
  • 按 `Ctrl + Shift + I`。

6. Internet Explorer:

  • 按 `F12`。

7. 使用快捷键:

  • 大多数现代浏览器都支持按 `F12` 打开开发者工具。

8. 菜单栏:

  • 在一些浏览器中,你可以通过点击浏览器窗口顶部的菜单栏中的“工具”(Tools)或“更多”(More),然后选择“开发者工具”(Developer Tools)来打开。

注意:不同的浏览器版本可能会有细微的差别,但上述方法应该适用于大多数情况。

1. cssSelector

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

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


  • “搜索输入框元素”: #kw


  • “百度一下按钮”: #su


定位百度首页的“百度热搜”元素,可以使用通过id选择器和子类选择器进行定位:#hotsearch-content-wrapper > li

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))

driver.get("https://www.baidu.com")

ret = driver.find_elements(By.CSS_SELECTOR, "#hotsearch-content-wrapper > li")
for i in ret:
    print(i.text)#获取每个元素对应的文本信息

driver.quit()

2. xpath

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

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


xpath语法中:

2.1 获取HTML页面所有的节点

  • //*

2.2 获取HTML页面指定的节点

//[指定节点]

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


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

  • /
  • //span/input

2.4 获取一个节点的父节点

  • ..
  • //input/.. 获取input节点的父节点

2.5 实现节点属性的匹配

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

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

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

  • 例如:百度首页通过://div/ul/li[3] 定位到第三个百度热搜标签

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

二、操作测试对象

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

1. 点击/提交对象

  • click()

例:找到百度第一条热搜并点击

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))

driver.get("https://www.baidu.com")
time.sleep(1)

#点击事件(查找元素 + 点击按钮)
#第一种写法
driver.find_element(By.CSS_SELECTOR,"#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title").click()
time.sleep(2)

#第二种写法(先查找后点击)
# ele = driver.find_element(By.CSS_SELECTOR, "#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")
# ele.click()

#关闭浏览器
driver.quit()

2. 模拟按键输入

  • send_keys(" ")

例:在百度输入框输入一行文字

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))

driver.get("https://www.baidu.com")
time.sleep(1)

#查找元素 + 输入内容
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("天行健,君子以自强不息")
time.sleep(2)

#关闭浏览器
driver.quit()

3. 清除文本内容

  • 输入文本后又想换一个新的关键词,这里就需要用到 clear()
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))

driver.get("https://www.baidu.com")
time.sleep(1)

#查找元素 + 输入内容
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("天行健,君子以自强不息")
time.sleep(2)

driver.find_element(By.CSS_SELECTOR, "#kw").clear()
time.sleep(2)

driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("地势坤,君子以厚德载物")
time.sleep(2)

#关闭浏览器
driver.quit()

4. 获取文本信息

  • 获取文本信息: text
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))

driver.get("https://www.baidu.com")
time.sleep(1)

#获取文本信息
text = driver.find_element(By.CSS_SELECTOR, "#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title").text
print(text)
assert text == "“嫦娥”既是中国的 又属于全人类"

#关闭浏览器
driver.quit()


  •  获取属性值: get_attribute("属性名称") 
#获取属性值
text = driver.find_element(By.CSS_SELECTOR, "#su").get_attribute("value")
print(text)

5. 获取当前页面标题

  • title

#获取当前页面标题
title = driver.title
print(title)

6. 获取当前页面URL

  • current_url

#获取当前页面URL
url = driver.current_url
print(url)

三、窗口

1. 切换窗口

1)获取当前页面句柄:

driver.current_window_handle

2)获取所有页面句柄:

driver.window_handles

3)切换当前句柄为最新页面:

for handle in allHandle:
    if handle != curHandle:
        driver.switch_to.window(handle)
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))

driver.get("https://www.baidu.com")
time.sleep(1)

#点击百度首页的图片功能,跳转到图片页面

#跳转之前百度首页的标题和URL
print("before:"+driver.title)
print("before:"+driver.current_url)

driver.find_element(By.CSS_SELECTOR, "#s-top-left > a:nth-child(8)").click()

#1.获取当前页面句柄
curHandle = driver.current_window_handle
#2.获取所有页面句柄
allHandle = driver.window_handles
#3.切换当前页面为最新页面
for handle in allHandle:
    if handle != curHandle:
        driver.switch_to.window(handle)

#跳转之后百度图片的标题和URL
print("after:"+driver.title)
print("after:"+driver.current_url)

#关闭浏览器
driver.quit()

2. 窗口设置大小

  • 窗口最大化
driver.maximize_window()
  • 窗口最小化
driver.minimize_window()
  • 窗口全屏
driver.fullscreen_window()
  • 手动设置窗口大小
driver.set_window_size(300, 300)
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))

driver.get("https://www.baidu.com")

#窗口大小的设置
#窗口最大化
time.sleep(2)
driver.maximize_window()
#窗口最小化
time.sleep(2)
driver.minimize_window()
#窗口全屏
time.sleep(2)
driver.fullscreen_window()
#手动设置窗口大小
time.sleep(2)
driver.set_window_size(300, 300)

#关闭浏览器
driver.quit()

3. 屏幕截图

        我们的自动化脚本一般部署在机器上自动的去运行,如果出现了报错,我们是不知道的,但是我们可以通过抓拍来记录当时的错误场景。

🌴简单版本

driver.save_screenshot("./images/image.png")
  • 如果不指定图片保存路径,屏幕截图后会自动保存在当前项目同级目录下;
  • 如果想保存在指定文件夹下面,就要新建文件夹,步骤如图所示: 


 🌴高阶版本

        由于图片给定的名称是固定的,当我们多次运行自动化脚本时,历史的图片将会被覆盖;所以为了将历史的图片文件保存下来,就需要每次生成的图片文件名称都不一样,这时就得咋们的高阶版本上场了。

from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))

#打开百度标签页
driver.get("https://www.baidu.com")

#屏幕截图
#1.简单版本
driver.save_screenshot("./images/test.png")

#2.高阶版本
filename = "autotest-"+datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"
driver.save_screenshot("./images/"+filename)

#关闭浏览器
driver.quit()

4. 关闭窗口

driver.quit():表示退出浏览器,所有的标签页都会被关闭。

driver.close():表示退出一个窗口。
注意:窗口关闭后driver要重新定义。

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager

#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))

#打开百度标签页
driver.get("https://www.baidu.com")

#打开新的标签页
time.sleep(2)
driver.find_element(By.CSS_SELECTOR, "#s-top-left > a:nth-child(6)").click()

#关闭标签页
time.sleep(2)
driver.close()

#关闭浏览器
time.sleep(2)
driver.quit()

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

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

相关文章

多个ECU测试方案-IP地址相同-DoIP刷新-环境测试耐久测试

情况1:只有一个ECU进行测试 - 接口模块只需要使用一个车载以太网转换器; 情况2:多ECU同时测试,但ECU IP地址不一样,上位机多个网口 - 上位机测试软件,需要通过PC的不同网卡,访问各个ECU&#…

基于 RealSense D435相机实现手部姿态检测

基于 RealSense D435i相机进行手部姿态检测,其中采用 Mediapipe 进行手部检测,以下是详细步骤: Mediapipe 是一个由 Google开发的开源框架,专门用于构建多媒体处理管道,特别是计算机视觉和机器学习任务。它提供了一系列…

第68期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle

本文转自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7352676.html?templateId1718516 问题现象 某些三方件,例如 工作流引擎activiti,暂未适配yashandb,使用中会出现如下异常: 问题的风险及影响 …

【YashanDB知识库】查询YashanDB表空间使用率

本文转自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7369203.html?templateId1718516 【问题分类】功能使用 【关键字】表空间,使用率 【问题描述】YashanDB使用过程中,如何查询表空间的使用率 【问题原因分析】需要查…

NTPD使用/etc/ntp.conf配置时钟同步详解

NTPD使用/etc/ntp.conf配置时钟同步详解 引言安装NTPD配置/etc/ntp.conf1. 权限控制(restrict)2. 指定上层NTP服务器(server)3. 本地时间服务器(可选)启动NTPD服务验证时间同步ntpd服务默认多长时间同步一次ntp.conf上如何配置同步的频率和间隔配置步骤注意事项结论引言 …

虚拟数据架构能否取代传统数据架构?

虚拟数据架构能否取代传统数据架构? 前言虚拟数据架构能否取代传统数据架构 前言 数据虚拟化能够将分散在不同地方的数据整合起来,形成一个统一的视图,让数据同学能够更轻松地访问和分析这些数据。就像是把一堆杂乱无章的拼图碎片拼成了一幅…

从前端到全栈,你只差这款神器!

作为一名前端开发者,你是否也遇到过这样的困扰:界面做好了,功能完成了一半,却因为没有后端支持而卡住了进度?想自己搭建服务器,发现耗时耗力,学习曲线陡峭,最后项目拖延、效率大打折…

瑞芯微RK3566鸿蒙开发板Android11修改第三方输入法为默认输入法

本文适用于触觉智能所有支持Android11系统的开发板修改第三方输入法为默认输入法。本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板,搭载了瑞芯微RK3566芯片,类树莓派设计,是Laval官方社区主荐的一款鸿蒙开发主板。 一、安装输入法并查看输入…

mysql如何快速编写单表查询语句

目录 背景生成sql语句 背景 我们在编写查询语句的时候,都提倡需要用到哪些字段就查哪些字段,这样有两个好处:1、可以增加程序运行效率,2、可以避免无关字段被暴露。那我们一个字段一个字段写就比较烦,有没有方法快速生…

优化 Go 语言数据打包:性能基准测试与分析

场景:在局域网内,需要将多个机器网卡上抓到的数据包同步到一个机器上。 原有方案:tcpdump -w 写入文件,然后定时调用 rsync 进行同步。 改造方案:使用 Go 重写这个抓包逻辑及同步逻辑,直接将抓到的包通过网…

udig处理 shape地图中 数据显示

比如城市的名称的显示 udig新建project 新建Map 然后添加shape 修改 attribute 中文 为英文 没啥用,改不了 这里Label 勾选下,选择 市 拷贝XML 到geoserver style里面 参考 geoserver发布shp地图-CSDN博客

排序算法Java实现

文章目录 排序算法概述比较排序算法非比较排序算法稳定 vs 不稳定Java 中的排序 外部排序1) 冒泡排序2) 选择排序3) 堆排序4) 插入排序5) 希尔排序6) 归并排序递归实现时间复杂度非递归实现 7) 归并插入8) 快速排序随机基准点处理重复值 9) 计数排序10) 桶排序11) 基数排序 排序…

javaseday31多线程

什么是多线程 线程与进程 小结 并发和并行 并发 并行 小结 多线程的实现方式 方法一 public class Demo1 {public static void main(String[] args) {//使用多线程的第一种方法/*** 1、创建一个类继承Thread类* 2、并重写run方法* 3、创建子类对象,并启动线程*/M…

深度知识追踪(论文复现)

深度知识追踪(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 深度知识追踪(论文复现)论文概述论文方法实验部分数据集实验步骤step1:安装环境依赖step2:下载数据集,将其变成one-hot编码step3:进行训练…

备战软考Day04-计算机网络

1、计算机网络的分类 2、七层网络体系结构 3、网络的设备与标准 4、TCP/IP协议族 TCP/IP作为Internet的核心协议,被广泛应用于局域网和广域网中,目前已成为事实上的国际标准 1、TCP/IP分层模型 TCP/IP协议是Internet的基础和核心,和OSI参考…

SqlSugar的where条件中使用可空类型报语法错误

SQLServer数据表中有两列可空列,均为数值类型,同时在数据库中录入测试数据,Age和Height列均部分有值。   使用SqlSugar的DbFirst功能生成数据库表类,其中Age、Height属性均为可空类型。   当Where函数中的检索条件较多时&a…

Web3技术在元宇宙中的应用:从区块链到智能合约

随着元宇宙的兴起,Web3技术正逐渐成为其基础,推动着数字空间的重塑。元宇宙不仅是一个虚拟世界,它还代表着一个由去中心化技术驱动的新生态系统。在这个系统中,区块链和智能合约发挥着至关重要的作用,为用户提供安全、…

cefsharp新版本OnBeforeResourceLoad 禁止http自动跳转https显示404错误解决办法 含代码

一、问题 因项目需要,域名没有ssl证书,结果http访问时被强制定向到https前缀,结果会显示404 测试版本cefsharp126.x (x64) 框架 CefSharp.WinForms.NETCore 二、代码(核心代码) 如果请求url是http,且目标是https时,则阻止请求 //判断请求变化 if (url.StartsWith(<…

[linux 驱动]regmap子系统详解与实战

目录 1 描述 2 结构体 2.1 regmap 2.2 regmap_bus 2.3 regmap_config 3 regmap 操作函数 3.1 regmap 申请与初始化 3.1.1 regmap_init_i2c 3.1.2 regmap_init_spi 3.1.3 regmap_exit 3.2 regmap 设备访问 API 函数 3.2.1 regmap_read 3.2.2 regmap_write 4 示例 1…