【测试】自动化——常用函数

news2024/10/12 19:47:56

元素的定位 

查找元素:find_element(方式,“元素”),表示查找一个元素;

find_element(方式,“元素”),表示查找多个元素。

###使用查找多个元素
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()

如果想要获取页面多个元素时,可以使用find_elements。

查找元素的方式:选择器、xpath、ID、class_name

常⽤的主要由cssSelector和xpath

cssSelector

选择器的功能:选中⻚⾯中指定的标签元素

选择器的种类分为基础选择器和复合选择器,常⻅的元素定位⽅式可以通过id选择器和⼦类选择器来进⾏定位.

之前是ID选择器来定位“百度一下”按钮。

定位百度⾸⻚的“百度热搜”元素,可以使⽤通过id选择器和⼦类选择器进⾏定位:#s-hotsearch-wrapper > div

“搜索输⼊框元素”:#kw

“百度⼀下按钮”:#su

xpath

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

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

xpath语法中:

//* : 表示获取HTML页面所有的节点

[@...] : 实现节点属性的匹配

例如://#[@id='kw']

/ : 获取一个节点中的直接子节点

//[指定节点] : 获取HTML页面指定的节点 

.. : 获取一个页面中的父节点 

鼠标直接复制可以解决问题,但是难免后面会需要手动的修改/编写选择器元素、xpath元素,因此我们堆选择器和xpath要有一定的了解。

操作测试对象

获取到了⻚⾯的元素之后,接下来就是要对元素进⾏操作了。常⻅的操作有点击、提交、输⼊、清除、获取⽂本。

  • 点击/提交按钮

click()

# 方法一
# driver.find_element(By.CSS_SELECTOR,"#su").click()
# 方法二
# element=driver.find_element(By.CSS_SELECTOR,"#su)
# element.click()

页面上任意位置/元素都可以实行点击操作。

# #1.打开浏览器-----驱动管理
ChromeIns=ChromeDriverManager().install()
# ###创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# #2.输入百度网址------https://www.baidu.com
driver.get("https://www.baidu.com")
time.sleep(2)
# time.sleep(2)
# #4.点击“百度一下”按钮
driver.find_element(By.CSS_SELECTOR,"#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title").click()
time.sleep(2)
# #5.关闭浏览器
driver.quit()
  • 模拟按键输入

send_keys("")

# #1.打开浏览器-----驱动管理
ChromeIns=ChromeDriverManager().install()
# ###创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# #2.输入百度网址------https://www.baidu.com
driver.get("https://www.baidu.com")
time.sleep(2)
# time.sleep(2)
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("百度翻译")
time.sleep(2)
# #5.关闭浏览器
driver.quit()

这种也可以写出俩种方式。

模拟键盘输入,因此键盘上可以输入的内容都可以填写上去。

  • 清楚文本内容

输入文本又需要更换文本,就需要使用clear()

如果只是这样的代码会出现这样的情况,所以需要使用clear()

连续的send_keys()会将多次输入的内容拼接在一起。

这里就进行了清除。

  • 获取文本信息

获取文本信息:Text

获取到元素对应的文本信息后,通过断言判断文本信息是否符合预期。

【注意】特殊情况,元素属性值不等于文本信息

获取属性值需要使用方法 get_attribute(属性)。

  • 获取文本标题

获取文本标题:title

  • 获取当前页面URL

获取当前页面URL:current_url

适用场景:页面元素可点击跳转的情况下,用来检测跳转的结果是否是正确的。 

窗口

窗口的切换 

  • 打开⼀个新的⻚⾯之后获取到的title和URL仍然还是前⼀个⻚⾯的?

当我们⼿⼯测试的时候,我们可以通过眼睛来判断当前的窗⼝是什么,但对于程序来说它是不知道当前最新的窗⼝应该是哪⼀个。对于程序来说它怎么来识别每⼀个窗⼝呢?每个浏览器窗⼝都有⼀个唯⼀的属性句柄(handle)来表⽰,我们就可以通过句柄来切换。

  • 获取当前页面句柄

driver.current_window_handle

  • 获取所有页面的句柄

driver.window_handles

  • 切换句柄

curHandle = driver.curret_window_handle

allHandle = driver.window_handles

// 遍历所有的句柄,切换新的页面

for handle in allHandle:

        if handle != curHandle:

        driver.switch_to.window(handle)

在测试中,通常情况下一般会打开俩个标签页实现标签页的切换测试,更多时候直接输入对应页面的链接在当前标签页下进行测试。

若是页面发送跳转后,未打开新的标签,不需要切换。

窗口大小的设置

#窗口最大化

driver.maximize_window()

#窗口最小化

driver.minimize_window()

#窗口全屏

driver.fullscreen_window()

#手动设置窗口大小

driver.set_window_size(1024,768)

仅做了解即可,在自动化测试中不关注页面的变换。

屏幕截图

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

当自动化运行报错时,仅仅通过终端的错误提示给到的有用信息是一定的,若是能将当时的页面截图拍下来,能更好的定位问题并解决问题。

driver.save_screenshot(”../images/image.png“)

屏幕截图保存下来的图片名称(路径+名称);

test.png:图片文件保存在脚本文件所在路径下,图片名称为test.png

由于图片给定的图片名称是固定的,当我们多次运行自动化脚本时,历史的图片将会被覆盖。

  • 高阶版本

filename="autotest-"+datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S')+'.png'

driver.save_screenshot(“../images/”+filename)

由于文件名中不能包含空格,因此还需要将时间进行格式化

关闭窗口

driver.close();

注意:窗口关闭后driver需要重新定义

  • driver.close():退出一个窗口
  • driver.quit():退出一个浏览器

当执行driver.quit(),所有的标签页都会退出。

【注意】关闭窗口不等于关闭浏览器,因此在执行driver.close()之和仍然需要调用driver.quit()

弹窗

弹窗是在⻚⾯是找不到任何元素的,这种情况怎么处理?使⽤selenium提供的Alert接⼝

警告弹窗

确认弹窗

提示弹窗

这三个弹窗页面上定位不到弹窗元素;同时出现了弹窗,页面其他的元素也无法定位。

当页面出现了弹窗,必须先处理弹窗之和才能帝国为到页面的元素。

  1. 切换到弹窗
  2. 关闭弹窗(点击确定/取消)

alert = driver.switchTo.alert

// 确认

alert.accept()

//取消

alert.dismiss()

// 输入框

alert.send_keys("hello")

等待

【注意】:注意字符”\\“  

由于脚本执行的速度非常快,而页面要加载的资源比较多,因此当脚本执行到该行代码时页面还没有渲染完成,因此找不到该元素,当添加了time.sleep(3)之和,页面已经在3秒内加载完成,此时再取查找该元素就可以找到。 

通常代码执⾏的速度⽐⻚⾯渲染的速度要快,如果避免因为渲染过慢出现的⾃动化误报的问题呢?可以使⽤selenium中提供的三种等待⽅法:

强制等待

time.sleep() // 单位为秒,当调用该方法时,程序会直接阻塞,等待指定秒数后继续执行后面的代码

  • 优点:使用简单,调试的时候比较有效
  • 缺点:影响运行效率,浪费大量时间。

当有1个数量较少的测试脚本时,添加强制等待消耗的时间不过数秒。实际在工作中,业务场景比较复杂时,要添加的自动化脚本非常多,通常来说自动化测试脚本数量可达到上百。

隐式等待

隐式等待是⼀种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执⾏,直到超时没找到元素才会报错。

implicitly_wait()  参数:秒

隐式等待的生命周期:隐式代码作用域是整个脚本的所有元素,即只要driver对象没有被释放掉driver.quit(),隐式等待一直生效。

【注意】若等待指定秒数查找不到元素,就会报错。

优点:智能等待,作用于全局

显示等待

显示等待也是一种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码。

WebDriverWait(driver, sec).until(functions)

functions: 涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类

wait = WebDriverWait(driver, 2)

wait.until(expected_conditions.invisibility_of_element((By.CSS_SELECTOR,"... ..."))

invisibility_of_element(locator):检查元素不可见性;

visibility_of_element(locator):检查元素的可见性

方法说明
title_is(title)检查页面标题的期望值
title_contains(title)检查标题是否包含区分大小写的子字符串的期望值
visibility_of_element_located(locator,str)检查元素是否存在于页面的DOM上并且可见的期望值
presence_of_element_located(locator,str)用于检查元素是否存在于页面的DOM上的期望值
visibility_of(element)检查已知存在于页面DOM上的元素是否可见的期望
alert_is_present()检查是否出现弹窗

优点:显示等待是智能等待,可以自定义显示等待的条件,操作灵活。

缺点:写法复杂

【注意】显示等待可以等待隐式等待无法处理的问题(例如:弹窗)

隐式等待与显示等待不建议一起使用,可能导致出现不可预测的时间。但是强制等待可以任意配合隐式等待或者等待来使用。

浏览器导航

打开网址

driver.get("")

浏览器的前进、后退和刷新

  • driver.back()
  • driver.forward()
  • driver.refresh()

文件上传

点击⽂件上传的场景下会弹窗系统窗⼝,进⾏⽂件的选择。selenium⽆法识别⾮web的控件,上传⽂件窗⼝为系统⾃带,⽆法识别窗⼝元素。但是可以使⽤sendkeys来上传指定路径的⽂件,达到的效果是⼀样的。

当通过页面元素调起上传的窗口后,文件窗口不能被作为元素选中,此时要解决的问题是,如何定位要弹窗并选中文件。

driver.find_element(By.CSS_SELECTOR,"... ... ").send_keys("文件")

通过send_keys()方法可以实现将本地文件夹中的文件上传上来(注意要写完整的文件路径+文件名)

浏览器参数设置

设置无头参数

创建浏览器对象时,可以传递必要的参数

  • 无头模式:程序在后端运行,界面看不到页面的表现

options = weddriver.ChromeOptions()

options.add_argument("-headless")//设置参数,-headless:无头模式

自动化打开浏览器默认情况下为有头模式

driver=webdriver.Chrome

(service=ChromeService(ChromeDriverManager().install()),options=options)

页面加载策略

options.page_load_strategy='加载方式'

页面加载方式主要有三种类型:

策略说明
normal默认值,等待所有资源下载(主体框架、图片、视频等资源)
eagerDOM访问已经准备就绪,但诸如图像的其他资源可能仍在加载
none

完全不会阻塞WebDriver

driver.get()的方法会一直等待页面加载完成。但是实际上主页面加载完成之就会继续执行自动化,若一直等待的话可能会造成页面超时,元素找不到问题。

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

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

相关文章

uniapp学习(005-2 详解Part.2)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第41p-第p51的内容 文章目录 mainifest.json文件配置获取微信小程序appid注册微信小程序微信小程序控制台图形界…

Linux 命令:每日一学,文件查找之find命令实践

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 前言简述 描述:前面我们一些学习了Linux文件内容查看、分隔列、排序、统计等命令,相信认真学习实践过的看友都已经初步掌握了吧,今天我们继续学习下Linux中…

本地生活服务项目入局方案解析!本地生活服务商系统能实现怎样的作业效果?

当前,各大平台的本地生活服务业务日渐兴盛,提高创业者入局意向的同时,也让本地生活服务项目有哪些等问题也成为了多个创业者社群中的热议对象。而从目前的讨论情况来看,在创业者们所询问的众多本地生活服务项目中,通过…

从二维到三维,电商行业有哪些变化?

从二维到三维,电商行业经历了一系列显著的变化,这些变化不仅体现在商品展示的方式上,还深刻影响了消费者的购物体验、电商平台的运营策略以及整个电商行业的竞争格局。 一、商品展示方式的变革 二维展示阶段: 在电商行业的早期&…

一键安装与配置Stable Diffusion,轻松实现AI绘画

随着技术的迭代,目前 Stable Diffusion 已经能够生成非常艺术化的图片了,完全有赶超人类的架势,已经有不少工作被这类服务替代,比如制作一个 logo 图片,画一张虚拟老婆照片,画质堪比相机。 最新 Stable Di…

kubernetes(K8s)学习(一)

本文主要是搭建一个k8s平台,并部署一个springboot的jar包,后续以此作为学习k8s的环境。 1. 搭建k8s集群 网上有很多指导,大家可以在网上搜索一下,比如这个:K8s搭建集群-CSDN博客,本人通过VMware安装3台虚拟…

国外电商系统开发-运维系统操作脚本

查看脚本内容,只需要点击即可: 执行脚本,请点击 点击了下一步后,可以输出脚本参数,当然你可以可以不输入,直接下一步就行: 现在,点击【下一步】执行开始出初始化脚本: …

【力扣刷题实战】(归并排序)合并两个有序数组

大家好,我是小卡皮巴拉 文章目录 目录 力扣题目: 合并两个有序数组 题目描述 示例 1: 示例 2: 示例 3: 解题思路 具体思路 题目要点 作图助解 完整代码(C语言) 兄弟们共勉 &#…

Linux多任务编程(网络编程-数据库篇)

前言 本文记录嵌入式领域用的小型数据库 sqlite数据库,以及c语言中使用sqlite3。 数据库 数据存储方式(3种) (1)直接地址存储:单片机的烧写; (2)文件存储&…

接口多继承与子类继承多接口时的冲突问题,方法冲突与变量冲突.....

🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

IDEA2024最新版本运行Web应用时 Tomcat 日志中的中文乱码问题修复解决

一、IDEA2024运行Tomcat日志中的中文乱码问题修复 在使用tomcat的时候经常遇到乱码问题,要么是控制台输出乱码或者输出日志乱码,要么页面接收乱码,产生乱码的根本原因就是编码和解码不一致。网上有的文章写得也有问题,今天自己多看…

计算机毕业设计 | springboot商城售后管理系统 购物平台(附源码)

1,绪论 1.1 开发背景 在数字化时代的推动下,产品售后服务管理机构面临着信息化和网络化的挑战。传统的手工管理和纸质档案已经无法满足管理人员和读者的需求。为了提高产品售后服务管理机构的管理效率和服务质量,开发和实现一个基于Java的售…

轻量服务器和云服务器ecs哪个好用一些?

轻量服务器和云服务器ecs哪个好用一些?轻量服务器与云服务器ECS在多方面存在显著差异,对于需要高性能计算和大规模数据处理的用户来说,ECS可能是更好的选择;而对于预算有限且需求较为简单的用户来说,轻量服务器可能更为…

计算机网络:数据链路层 —— 可靠传输服务

文章目录 可靠传输停止-等待 (SW) 协议超时重传机制分组编号机制ACK 丢失问题ACK 延迟问题 注意事项信道利用率 回退 N 帧 (GBN) 协议滑动窗口信道利用率无传输差错超时重传、回退N帧 累计确认 选择重传 (SR) 协议滑动窗口 可靠传输 若数据链路层向其上层提供的服务类型为可靠…

【Linux】Screen的使用:新建、退出、再登陆

Linux screen 命令详解与使用指南 在Linux系统中,screen 是允许用户在单个终端会话中运行多个进程,并能在会话之间切换。 适用情况:screen 特别适用于远程登录(如通过SSH)时,确保即使网络连接断开&#x…

2017年-2021年 软件工程程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析

文章目录 2017年1.c语言程序设计部分2.数据结构程序设计部分 2018年1.c语言程序设计部分2.数据结构程序设计部分 2019年1.c语言程序设计部分2.数据结构程序设计部分 2020年1.C语言程序设计部分2.数据结构程序设计部分 2021年1.C语言程序设计部分2.数据结构程序设计部分 2017年 …

《RabbitMQ篇》消息应答和发布确认

消息应答 消息应答机制:消费者接收信息并处理完之后,告诉rabbitmq该信息已经处理,rabbitmq可以把该信息删除了. 消息自动重新入队:如果处理某个消息的消费者异常关闭了,没有发送ACK确认,rabbitmq会将其重…

GEE 高阶应用:eeExtra包(Python、R、julia和JavaScript API)

目录 简介 功能 它是如何工作的? 安装 功能 缩放和偏移 光谱指数 STAC features JavaScript API模型 简介 Google Earth Engine (GEE) 是一个基于云的服务,用于矢量和栅格数据的地理空间处理。Earth Engine 平台具有 JavaScript 和 Python API,提供不同的方法来处…

STM32学习--5-2 旋转编码器计次

接线图 按键按下,旋转编码器输出低电平 Encoder.c #include "stm32f10x.h" // Device headerint16_t Encoder_Count; void Encoder_init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); // 开启APB2Periph外设GPIOB时钟…

Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)

0x01 产品简介 Palo Alto Networks Expedition 是一款强大的工具,帮助用户有效地迁移和优化网络安全策略,提升安全管理的效率和效果。它的自动化功能、策略分析和可视化报告使其在网络安全领域中成为一个重要的解决方案。 0x02 漏洞概述 Palo Alto Networks Expedition中存…