Selenium——基于Web的UI自动化测试工具(一)

        一、selenium简介

        Selenium是一个自动化测试工具,用于模拟用户在Web上的行为。它支持多种浏览器,如Chrome、Firefox、IE等。Selenium可以实现多种操作,包括打开浏览器、导航到指定URL、填写表单、点击按钮、获取页面元素等。
        Selenium有多种语言实现,包括Java、Python、C#等,可以根据自己的喜好和需求选择合适的语言来编写测试脚本。
        Selenium还提供了丰富的API和工具,如Selenium WebDriver、Selenium Grid等,可以用于构建可靠的、可扩展的自动化测试框架。
        Selenium的特点包括:

  • 支持多种浏览器:可以在不同的浏览器上运行测试,确保在不同环境下的兼容性;
  • 灵活性:可以模拟用户的各种操作,如点击、输入、滚动等;
  • 可扩展性:可以根据需求自定义各种操作和断言,满足不同的测试需求;
  • 多种语言支持:支持Java、Python、C#等多种编程语言,方便开发者使用;
  • 强大的定位机制:可以通过多种方式定位页面元素,如ID、name、class等。

        二、python搭建selenium的环境

        pip基本命令

pip list # 查看当前所有的第三方库
pip install 第三方包名 # 在线下载、安装指定的第3方包
pip uninstall 第三防包名 # 卸载指定的第三方包

        selenium安装

pip install selenium

        如果觉得官方下载源较慢,可以使用国内的镜像地址(清华源)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium

        下载对应浏览器的驱动程序文件

1.Chrome驱动地址:http://npm.taobao.org/mirrors/chromedriver
2.Firefox驱动地址:https://github.com/mozilla/geckodriver/releases/
3.IE驱动地址:http://selenium-release.storage.googleapis.com/index.html

        将下载的驱动包解压出来的exe文件,放置在环境变量path能找到的路径下

        三、WebDriver(Web驱动)类详细用法

        1. WebDriver类的对象是真正操作浏览器的对象,不同的浏览器会有不同的驱动类对象别名。
        2. 启动浏览器 —— 创建对应浏览器的驱动类对象(必须要设置好浏览器驱动程序文件)
        示例代码:

from selenium import webdriver
dr = webdrvier.Chrome() # 启动Chrome浏览器

        3. 驱动对象常用方法
      

驱动对象.get("url") —— 打开指定URL的页面
驱动对象.close() —— 关闭当前页面(如果关闭是浏览器中最后一个页面,整个浏览器也会退出)
驱动对象.quit() —— 退出浏览器,终止驱动程序

        定位页面元素的方法

        理解:8种定位页面元素策略、2套方式(返回单个页面元素、返回多个页面元素)
方式一:定位单个页面元素,返回的是WebElement。格式:find_element
        常用方法

驱动对象.find_element_by_id("id属性") —— 根据页面元素的id属性
驱动对象.find_element_by_name("name属性") —— 根据页面元素的name属性驱动对象.find_element_by_class_name("class样式名") —— 根据页面元素的”类样式名“
如果标签的class属性值中有空格,代表具有多个类样式名,我们只能用其中的一个样式名
驱动对象.find_element_by_tag_name("标签名") —— 根据标签名来定位元素驱动对象.find_element_by_link_text("超链接文本") —— 根据超链接标签的内部文本只对超链接标签(a标签)有用
驱动对象.find_element_by_partial_link_text("部分超链接文本")只对超链接标签(a标签)有用
驱动对象.find_element_by_css_selector("CSS选择器") —— 根据CSS选择器来定位元素
驱动对象.find_element_by_xpath("xpath") —— 根据XPATH表达式定位元素

        注意点:

定位单个元素的方法,返回值是找到的“页面元素”对象(WebElement)
页面元素.send_keys("内容") —— 向页面元素中输入内容
页面元素.clear() —— 清空输入框中的文本
页面元素.click() —— 单击页面元素
页面元素.get_attribute("属性名") —— 获取页面元素的标签属性
页面元素.text —— 获取页面元素的内部文本(开始标签和结束标签之间的
内容)
单个标签的页面元素,内部文本永远为空字符串。
如果页面上有多个匹配的元素,只返回其中一个元素。
尽量根据元素的唯一特定来定位
如果页面上没有匹配的元素,会报错:NoSuchElementException
没有找到这个元素


        方式二:定位多个页面元素,返回的是list。格式:find_elements
        常用方法

驱动对象.find_elements_by_id("id属性") —— 根据页面元素的id属性
驱动对象.find_elements_by_name("name属性") —— 根据页面元素的name属
性
驱动对象.find_elements_by_class_name("class样式名") —— 根据页面元素
的”类样式名“
如果标签的class属性值中有空格,代表具有多个类样式名,我们只能用其中
的一个样式名
驱动对象.find_elements_by_tag_name("标签名") —— 根据标签名来定位元素驱动对象.find_elements_by_link_text("超链接文本") —— 根据超链接标签的内部文本
只对超链接标签(a标签)有用
驱动对象.find_elements_by_partial_link_text("部分超链接文本")
只对超链接标签(a标签)有用
驱动对象.find_elements_by_css_selector("CSS选择器") —— 根据CSS选择
器来定位元素
驱动对象.find_elements_by_xpath("xpath") —— 根据XPATH表达式定位元素

注意点:

定位多个元素的方法,返回值是找到的“页面元素”的列表,是list。
列表中的元素是页面上的标签元素(WebElement)
如果页面上没有匹配的元素,不报错,只不过返回的列表长度为0


        4. 驱动对象的常用属性

驱动对象.title —— 获取当前页面窗口的标题
驱动对象.current_url —— 获取当前页面的URL 

        四、CSS选择器

标签名选择器 —— 语法: 标签名

h3 —— 匹配页面上所有的h3元素
a —— 匹配页面上的所有a标签

类样式选择器 —— 语法: .类样式名

.abc —— 匹配页面上的class="abc"的标签
.my-god —— 匹配页面上的class="my-god"的标签

ID选择器 —— 语法: #ID属性值

ID属性值是自定义的,它匹配页面上那些出现id="指定id属性值"的标签
#hot —— 匹配页面上的id="hot"的标签
#ok —— 匹配页面上的id="ok"的标签

属性选择器 —— 语法: [属性名="值"]

匹配页面上出现了指定属性且等于指定值的标签
[id=button] —— 找到id属性等于button的元素
[color='red'] —— 找到color属性等于red的元素
[value="登 录"] —— 找到value属性等于“登 录”的元素(引号当前必须打,因为属性值中
有空格)

上述的四种基础选择器的组合(表述标签在网页的层次结构)

选择器1 选择器2 —— 找到所有匹配“选择器1”里面的匹配“选择器2”的元素 —— 里面就行
p a —— 找到a标签,a标签的外面必须有p标签
.hot p .rf —— 找到所有的class为rf的标签,但是这些标签必须在p标签的里面,且p标签必须在有class为hot的元素内部。
选择器1 > 选择器2 —— 找到所有匹配“选择器1”的下一级匹配“选择器2”的元素 —— 必须是下
一级
p > a —— 找到a标签,a标签的父标签必须是p标签

        五、XPATH

xpath表达式可以用于在xml、html文件中,以”路径“的写法来定位文件中的“节点”
节点 —— 描述一个元素在html文件中的路径
注意:XPATH表达式必须是以节点为基础的
路径符号(xpath表达式是从文档的根开始计算的)

  • / —— 进入下一级节点
  • // —— 任意一级节点
/html/body/p/span/a —— 从根标签开始一级一级的向下找到符合路径的a标签
//p//a —— 找到所有在p标签里的a标签
//p/a —— 找到所有在p标签下一级的a标签

xpath里面的限定: 节点[限定条件]

语法总结:

  • 节点[N] —— 找父节点中第N个满足条件的子节点
  • 节点[last()] —— 找父节点中最后1个满足条件的子节点
  • 节点[@属性名="值"] —— 匹配具有指定属性值的节点(属性名前面要打@符号,值两
  • 边必须有引号)
  • 节点[text()="值"] —— 匹配内部文本等于指定值的节点
  • 节点[contains(text(), "值")] —— 匹配内部文本中含有指定值的元素节点[contains(@属性名, "值")] —— 匹配指定属性含有指定值的元素
  • 节点[starts-with(@属性名, "值")] —— 匹配指定属性以指定值开头的元素
  • 节点[条件1 and 条件2] —— 匹配同时满足条件1和条件2的节点节点[条件1 or条件2] —— 匹配同时满足条件1或者条件2的节点节点[not(条件)] —— 匹配不满足指定条件的节点

示例代码:

//p[1] —— 找到是其父标签中的第1个子段落标签
//div/p[last()] —— 找到是其父标签中的最后一个子段落标签
//div[@class='poem']/p[last()] —— 找到父标签是div且有class属性等于poem的下面
的p标签中的最后一个
//*[@name='email'] —— 找到任意一级的任意元素,但它的name属性必须等于email
//a[text()='注册'] —— 找到内部文本等于“注册”的a标签元素
//span[text()="注意"] —— 找到内部文本等于“注意”的span标签元素
//*[contains(text(), '注')] —— 找到任意的标签中,内部文本包含“注”的所有元素
//li[contains(@id, 'stu')] —— 找到id属性中包含了stu的li元素
//li[starts-with(@id, 'stu')] —— 找到id属性以包stu打头的li元素
找到所有id属性以“yw”或者id属性以“sx”打头的li元素
//li[starts-with(@id, 'yw') or starts-with(@id, 'sx')]
找到所有id属性不以“stu”打头,但含有“stu”的li元素
//li[not(starts-with(@id, 'stu')) and contains(@id, 'stu')]

        六、使用selenium + unittest编写自动化测试的用例代码

用unittest来组织一个测试点的相关测试用例,会把一个测试点的系统测试用例中重要的用例选择出来,转换(写)成自动化测试用例代码,一条测试用例对应一个测试方法,真正操作浏览器、定位元素、操作元素的代码,是写在每个测试方法中,在测试方法中写断言,如果多个测试方法有一些共同要先执行、最后执行的代码,可以定义“固件方法”来实现:

如果在setUp方法中创建了浏览器驱动,记得用 self.驱动对象 =
在测试方法中,均用 self.驱动对象.

示例套件:

import unittest
from selenium import webdriverclass 测试类名(unittest.TestCase):def setUp(self):# 启动浏览器、打开XXX页面self.driver = webdriver.Chrome()self.driver.get("XXX")def tearDown(self):self.driver.quit()def test_测试方法1(self):# 这里面写操作浏览器的代码# self.driver# 进行断言def test_测试方法2(self):# 这里面写操作浏览器的代码# self.driver# 进行断言if __name__ == '__main__':
unittest.main()

        七、使用Select类来操作页面上的下拉框

构建一个代表页面上某个下拉框的Select类的对象

示例代码:

from selenium.webdriver.support.select import Select
下拉框 = Select(驱动对象.find_element_by_xxx("下拉框元素的定位特征"))

 三个选中选项的方法

示例代码:

下拉框.select_by_visible_text("本科") # 根据选项标签的内部文本,选中选项
下拉框.select_by_value("cz") # 根据选项标签的value属性,选中选项
下拉框.select_by_index(6) # 根据选项标签的索引(从0开始),选中选项

一个代表所有选项元素列表的属性 —— options

示例代码:

for elem in 下拉框.options:
# elem就是页面上下拉框中每个选项的页面元素elem.click()

        八、使用By类的类属性,来代表元素定位的策略

selenium将定位元素的八种策略,定义在了By类中,用8个类属性来代表

By类需要导入:

from selenium.webdriver.common.by import By

使用方式:无论定位单个元素还是多个元素,喜欢用“短款”的定位方法

  • 驱动对象.find_element(By.XXX, "值")
  • 驱动对象.find_elements(By.XXX, "值")

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

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

相关文章

简单使用Linux printf 将十进制转换为十六进制

在开发和排查问题过程中,有时我们需要做一些进制的转换,以下是一些快速的小技巧: 下面的是 十进制转换为十六进制: ❯ printf "0x%x\n" 100 0x64 还可以把 十六进制转为十进制: ❯ printf "%d\n&q…

flutter性能优化总结

Flutter应用程序默认已经具有良好的性能,因此您只需要避免常见的陷阱,就可以获得出色的性能。 流畅度(提高渲染性能) 控制build()方法的耗时 避免在 build() 方法中进行重复且耗时的工作,因为当父 widget 重建时,子 Wdiget 的 b…

XILINX 7系列时钟资源

文章目录 前言一、时钟概要1.1、CC1.2、BUFR、BUFIO、BUFMR1.3、CMT1.4、BUFH1.5、BUFG 二、时钟路由资源三、CMT 前言 本文主要参考xilinx手册ug472 一、时钟概要 7系列FPGA时钟资源主要有CC、BUFR、BUFIO、BUFMR、CMT、BUFG、BUFH和GTE_COMMON 1.1、CC “CC”&#xff0…

代码签名证书是什么?软件签名证书功能和分类

代码签名证书是什么?代码签名证书(Code Signing Certificate)是用于对可执行文件或脚本,软件代码等进行数字签名,可验证软件发布者身份、保证软件签名后未被篡改,以此验证开发者身份的真实性和保护代码的完…

【QT】Qt Charts的实际使用中的一些小细节完善如:resetZoom、fitInView

在Qt中&#xff0c; 使用 Qt Charts来创建和操作图表&#xff0c;重置图表缩放状态的功能可以通过调整图表视图的缩放比例来实现。Qt Charts中的QChartView提供了相关的方法来控制图表的缩放和平移。 示例代码&#xff0c;以及如何对此功能进行扩展&#xff1a; #include <…

Go —— GMP面试题

前言 关于GMP的详细讲解请移步&#xff1a;Go —— 协程 简单介绍一下Go的GMP调度模型 0&#xff09;G&#xff1a;协程&#xff0c;M&#xff1a;系统线程&#xff0c;P&#xff1a;协程调度器 1&#xff09;通过go func() 生成一个 G 2&#xff09;G会优先放到P的本地队…

C++_List的学习

1.概述 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2. list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素 3. list…

运营商名称 是如何显示到 手机通知栏上的?

在我们日常使用手机的过程中&#xff0c;经常会在通知栏或设置菜单中看到特定的运营商名称&#xff0c;例如"中国移动"、"中国联通"或"中国电信"等。 那么&#xff0c;这些运营商的名称是如何出现在我们手机上的呢&#xff1f;手机又是如何区分不…

软信天成:如何通过5个步骤获得高层对主数据管理项目的支持

如今&#xff0c;全球各地的组织正在采用主数据管理&#xff08;MDM&#xff09;以应对日益严峻的数据问题。然而&#xff0c;成功地实现 MDM 项目并非易事&#xff0c;这需要得到高层的全力支持。下面&#xff0c;软信天成将详细介绍五步策略&#xff0c;协助您获得高层对MDM项…

连接mysql或mariaDB报错:is not allowed to connect to this MariaDB server

1.报错信息&#xff1a;Host ‘192.168.3.91’ is not allowed to connect to this MariaDB server 2.报错原因&#xff1a;因为没有远程连接数据库的权限 一般为新创建数据库或新创建的用户没有远程连接数据库的权限&#xff0c;需要进行授权 # mysql -u root -p # use mysql…

属于我们Go语言的toString!

在 Go 语言中&#xff0c;类似于 Java 中的 toString() 方法&#xff0c;可以通过实现 String() 方法来自定义类型的字符串表示形式。这种机制使得在打印自定义类型的值时能够输出更加可读性高的字符串。在本文中&#xff0c;我们将探讨如何在 Go 中实现类似的功能&#xff0c;…

SCI一区 | Matlab实现OOA-TCN-BiGRU-Attention鱼鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现OOA-TCN-BiGRU-Attention鱼鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现OOA-TCN-BiGRU-Attention鱼鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

基于springboot实现常州地方旅游管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游管理系统演示 摘要 随着旅游业的迅速发展&#xff0c;传统的旅游信息查询方式&#xff0c;已经无法满足用户需求&#xff0c;因此&#xff0c;结合计算机技术的优势和普及&#xff0c;针对常州旅游&#xff0c;特开发了本基于Bootstrap的常州地方旅游管…

Python2.7和Python3.6共存的环境中,如何使用 Python 3.6 的 pip 安装其他包(如scikit-learn)

在开发环境中同时安装多个 Python 版本是一种常见的情况&#xff0c;本文将介绍在Python2.7和Python3.6共存的环境中&#xff0c;如何使用 Python 3.6 的 pip 安装其他包&#xff08;如scikit-learn&#xff09;。 步骤&#xff1a; 确定 Python 3.6 的 pip 路径&#xff1a; …

MacOS初识SIP——解决快捷指令sh脚本报错Operation not permitted

前言 因为一些原因&#xff0c;设计了一套快捷指令&#xff0c;中间涉及到一个sh脚本的运行&#xff0c;通过快捷指令运行时就会报错&#xff1a;operation not permitted 奇怪的是在快捷指令窗口下运行一切正常&#xff0c;但是从其他地方直接调用&#xff0c;例如通过Comma…

WebGL入门

WebGL采用HTML5中新引入的<canvas>元素(标签),它定义了网页上的绘图区域。 1、Canvas是什么 在HTML5出现之前,如果你想在网页上显示图像,只能使用HTML提供的原生方案<img>标签。用这个标签显示图像虽然简单,但只能显示静态的图片,不能进行实时绘制和渲染。…

微服务 - (狂神)

什么是微服务&#xff1a; 微服务方案&#xff1a; 1. SpringCloud NetFlix 2. Dubbo 3. SpringCloud Alibaba 解决了什么问题&#xff1a; 1. 服务过多&#xff0c;客户端怎么访问 2. 服务过多&#xff0c;服务间怎么传值 3. 服务过多&#xff0c;如何治理 4. 服务过多…

【Flutter】三个Channel(Android-java / Ios-swift)

Channel 实现与原生通信 【1】MethodChannel flutter MethodChannel官方文档 通过MethodChannel来传递数据&#xff0c;调用方法 案例 分别调用Android和Ios原生的获取电量的方法 Flutter端 实例一个MethodChannel&#xff0c; 唯一标识name&#xff0c;定义方法名称get…

UVA814 邮件传输的代理交互 解题报告

UVA814 邮件传输的代理交互 解题报告 题目链接 https://vjudge.net/problem/UVA-814 题目大意 本题的任务为模拟发送邮件时MTA&#xff08;邮件传输代理&#xff09;之间的交互。所谓MTA&#xff0c;就是email地址格式usermtaname的“后面部分”。当某人从user1mta1发送给另…

JavaScript ECMAScript标准的与时俱进:从ES6至ES14的革新之路与关键技术特性剖析

ECMAScript&#xff08;通常缩写为ES&#xff09;是一种标准化的脚本语言规范&#xff0c;由ECMA International&#xff08;前身为European Computer Manufacturers Association&#xff0c;欧洲计算机制造商协会&#xff09;制定。自1997年发布首个版本以来&#xff0c;ECMAS…