(Python + Selenium4)Web自动化测试自学Day1

目录

  • 文章声明⭐⭐⭐
  • 让我们开始今天的学习吧!
    • 自动打开Chrome浏览器
    • 实现自动搜索
    • 元素定位
      • 常用的元素定位方式
      • By.ID
      • By.CLASS_NAME
      • By.TAG_NAME
      • By.NAME
      • By.LINK_TEXT
      • By.PARTIAL_LINK_TEXT
      • By.CSS_SELECTOR
        • 根据id定位
        • 根据class定位
        • 根据属性定位
        • 组合定位
      • By.XPATH


文章声明⭐⭐⭐

  1. 该文章为我(有编程语言基础,非编程小白)的 Python Selenium4 Web自动化测试自学笔记
  2. 知识来源为 B站UP主(软件测试老白)的Python Selenium4课程视频,归纳为自己的语言与理解记录于此并加以实践
  3. 不出意外的话,我大抵会 持续更新
  4. 想要了解前端开发(技术栈大致有:Vue2/3、微信小程序、uniapp、HarmonyOS、NodeJS、Typescript)与Python的小伙伴,可以关注我!谢谢大家!

让我们开始今天的学习吧!

自动打开Chrome浏览器

运行代码,自动打开Chrome浏览器并进入B站,持续两秒,代码如下:

# 相关导入
import time
from selenium.webdriver import Chromeif __name__ == '__main__':# 实例化浏览器对象web = Chrome()# 全屏web.maximize_window()# 使用get方法进入网站web.get('https://www.bilibili.com/')# 持续两秒time.sleep(2)# 关闭浏览器,selenium4加不加close方法都会关闭浏览器web.close()

不出意外,浏览器自动打开并停留在了B站首页两名后,自动关闭,浏览器顶部还提示:Chrome正受到自动测试软件的控制,如下图所示:
在这里插入图片描述


实现自动搜索

我们的需求是:打开Chrome浏览器,并在搜索输入框输入Python关键词进行搜索,代码如下:

# 相关导入
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import Byif __name__ == '__main__':# 实例化浏览器对象web = Chrome()# 全屏web.maximize_window()# 使用get方法进入网站web.get('https://www.bilibili.com/')# 找到输入框的位置,然后输入关键词:Pythonweb.find_element(By.CLASS_NAME, 'nav-search-input').send_keys('Python')# 找到搜索按钮的位置,点击搜索web.find_element(By.CLASS_NAME, 'nav-search-btn').click()# 持续五秒time.sleep(5)# 关闭浏览器,selenium4加不加close方法都会关闭浏览器web.close()

元素定位

常用的元素定位方式

  • By.ID
  • By.CLASS_NAME
  • By.TAG_NAME
  • By.NAME
  • By.LINK_TEXT
  • By.PARTIAL_LINK_TEXT
  • By.CSS_SELECTOR
  • By.XPATH

By.ID

# 相关导入
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import Byif __name__ == '__main__':# 实例化浏览器对象web = Chrome()# 全屏web.maximize_window()# 使用get方法进入网站web.get('https://www.baidu.com/')# 通过ID,定位到输入框element = web.find_element(By.ID, 'kw')# 输入框输入内容element.send_keys('selenium')# 持续五秒time.sleep(5)# 关闭浏览器,selenium4加不加close方法都会关闭浏览器web.close()

By.CLASS_NAME

想要定位到如图按钮:
在这里插入图片描述

使用 find_element(By.CLASS_NAME) 进行第一次尝试:

# 相关导入
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import Byif __name__ == '__main__':# 实例化浏览器对象web = Chrome()# 全屏web.maximize_window()# 使用get方法进入网站web.get('https://www.bilibili.com/')# 因为很多标签大概率会拥有相同的class# 而通过find_element(By.CLASS_NAME)定位到多个拥有相同class的元素时,默认选取第一个# 所以下面这一行代码不可取web.find_element(By.CLASS_NAME, 'channel-link').click()# 持续五秒time.sleep(5)# 关闭浏览器,selenium4加不加close方法都会关闭浏览器web.close()

使用 find_elements(By.CLASS_NAME) 成功运行:

# 相关导入
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import Byif __name__ == '__main__':# 实例化浏览器对象web = Chrome()# 全屏web.maximize_window()# 使用get方法进入网站web.get('https://www.bilibili.com/')# 定位到综艺按钮并点击web.find_elements(By.CLASS_NAME, 'channel-link')[4].click()# 持续五秒time.sleep(5)# 关闭浏览器,selenium4加不加close方法都会关闭浏览器web.close()

途中我通过Debug查询到了索引值:
在这里插入图片描述

注意,当遇到有多个class值的标签时,例如:

在这里插入图片描述

不可以使用整个"recommended-swipe grid-anchor"作为 find_elements() 方法的第二个参数使用,会报错


By.TAG_NAME

  • 不常用,常用于定位在整个页面中数量极其少的元素
  • 可以配合F12的Console使用,即先查询该标签在整个页面的数量多或少、索引值为多少,再使用 By.TAG_NAME 去定位该元素
  • 用法同 By.CLASS_NAME,这里就不予演示

By.NAME

  • name属性常出现于HTML里的表单元素
  • 用法同 By.CLASS_NAME 一样,这里就不予演示

By.LINK_TEXT

适用于查询链接元素

定位如下图元素:
在这里插入图片描述
标签如图:
在这里插入图片描述
代码如下:

# 相关导入
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import Byif __name__ == '__main__':# 实例化浏览器对象web = Chrome()# 全屏web.maximize_window()# 使用get方法进入网站web.get('https://www.bilibili.com/')# 定位元素并点击,第二个参数只需要链接文本即可web.find_element(By.LINK_TEXT, '现代社会宗教真的在减少吗?【思维实验室】').click()# 持续五秒time.sleep(5)# 关闭浏览器,selenium4加不加close方法都会关闭浏览器web.close()

By.PARTIAL_LINK_TEXT

使用方法同 By.LINK_TEXT ,只不过 find_element() 和 find_elements() 第二个参数:链接文本,变为了模糊查询,即网页里的链接文本包含该参数的值即可查询定位,用 By.LINK_TEXT 的例子来演示:
在这里插入图片描述
代码如下:

# 相关导入
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import Byif __name__ == '__main__':# 实例化浏览器对象web = Chrome()# 全屏web.maximize_window()# 使用get方法进入网站web.get('https://www.bilibili.com/')# 定位元素并点击,这里的第二个参数包含在链接文本里即可web.find_element(By.PARTIAL_LINK_TEXT, '现代社会宗教真的在减少吗').click()# 持续五秒time.sleep(5)# 关闭浏览器,selenium4加不加close方法都会关闭浏览器web.close()

By.CSS_SELECTOR

根据id定位
# 输入框标签:<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
# 搜索按钮标签:<input type="submit" id="su" value="百度一下" class="bg s_btn">
# 根据id定位输入框和搜索按钮,并输入内容后点击搜索按钮
web.find_element(By.CSS_SELECTOR, '#kw').send_keys('Python')
web.find_element(By.CSS_SELECTOR, '#su').click()
根据class定位
# 输入框标签(属性筛选了一部分):<input class="nav-search-input">
# 搜索按钮标签(属性筛选了一部分):<div class="nav-search-btn"></div>
# 根据class定位输入框和搜索按钮,并输入内容后点击搜索按钮
web.find_element(By.CSS_SELECTOR, '.nav-search-input').send_keys('Python')
web.find_element(By.CSS_SELECTOR, '.nav-search-btn').click()
根据属性定位
# 输入框标签:<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
# 根据name属性定位输入框
web.find_element(By.CSS_SELECTOR, '[name="wd"]')# a标签(属性筛选了一部分):<a href="http://image.baidu.com/">图片</a>
# 根据href属性定位
web.find_element(By.CSS_SELECTOR, 'a[href="http://image.baidu.com/"]')
# 根据href属性模糊匹配-包含
web.find_element(By.CSS_SELECTOR, 'a[href*="baidu.com/"]')
# 根据href属性模糊匹配-匹配开头
web.find_element(By.CSS_SELECTOR, 'a[href^="http://image"]')
# 根据href属性模糊匹配-匹配结尾
web.find_element(By.CSS_SELECTOR, 'a[href$="baidu.com/"]')
组合定位
# 输入框标签(属性筛选了一部分):<input class="nav-search-input">
# 组合定位class
web.find_element(By.CSS_SELECTOR, 'input.nav-search-input')# 输入框标签(属性筛选了一部分):<input id="nav-search-input">
# 组合定位id
web.find_element(By.CSS_SELECTOR, 'input#nav-search-input')

By.XPATH

 	# 绝对路径,从根节点开始选取# web.find_element(By.XPATH, '/html/body/div/div/div[3]/a').click()# 相对路径,从任意节点开始选取,经常配合属性定位选取标签,格式如下:# web.find_element(By.XPATH, '//input[@id="kw"]').send_keys('ok')# 多属性组合定位# web.find_element(By.XPATH, '//input[@id="kw" and @name="wd" and @class="s_ipt"]').send_keys('ok')# 多组数据使用下标定位# web.find_element(By.XPATH, '//div[@id="s-top-left"]/a[4]').click()# 定位某元素的父元素,使用/..表示某标签的父标签# web.find_element(By.XPATH, '//div[@id="s-top-left"]/..').click()# 文本等于# web.find_element(By.XPATH, '//a[text()="文库"]').click()# 文本包含# web.find_element(By.XPATH, '//a[contains(text(),"文")]').click()# 同级下方标签# web.find_element(By.XPATH, '//a[text()="文库"]/following-sibling::a[3]').click()# 同级上方标签# web.find_element(By.XPATH, '//a[text()="文库"]/preceding-sibling::a[3]').click()

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

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

相关文章

js的for嵌套和数组的map+some两种方法实现两个对象数组进行比对,得到一个期望的新数组

项目需求有个数据需要处理,现有两个数组arr1和arr2,其中 arr1为[“香蕉”, “苹果”, “梨子”],arr2为 [{ checked: true, name: “苹果” }] ,现在想实现的目的是,只要有arr1里的项与arr2项里的name一致的话就将其checked设为true,否则设为false,最终得到的数组是arr3,…

#error 在C语言中的作用

1、#error命令是C/C语言的预处理命令之一 #error 是C语言中的预处理指令之一&#xff0c;用于在编译时生成一个错误消息。当编译器遇到 #error 指令时&#xff0c;会立即停止编译&#xff0c;并将指定的错误消息输出到编译器的错误信息中。 在给定的代码中&#xff0c;#error…

ubuntu/linux 如何在虚拟环境中下载MPI-IS mesh

麻了&#xff0c;又碰到这个库了&#xff0c;记录一下&#xff0c;希望对大家有用 下载代码&#xff1a;https://github.com/MPI-IS/mesh 安装libboost-dev sudo apt-get install libboost-dev激活自己的虚拟环境&#xff0c;下面的操作在自己的虚拟环境里进行 在mesh-master…

vivado 不支持的SDC命令

不支持以下SDC命令。 • set_clock_gating_check • set_clock_transition • set_ideal_latency • set_ideal_network • set_ideal_transition • set_max_fanout • set_drive • set_driving_cell • set_fanout_load • set_input_transition • se…

玩转Mysql 二(MySQL的目录结构与表结构)

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 一、MYSQL目录结构及命令存放路径 1、查看MYSQL数据文件存放路径 mysql> show variables like datadir; 注意:生成环境要提前规划好数据存放目录,存储一般以T为单位闪盘。 2、MYSQL命令存放…

系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[基础知识]

分类目录&#xff1a;《系统学习Python》总目录 我们可以在类中定义两种方法&#xff0c;它们不需要一个实例就可以被调用&#xff1a;静态方法&#xff08;staticmethod&#xff09;大致与一个类中简单的无实例函数的工作方式类似&#xff0c;而类方法则被传人一个类而不是一个…

Note: A Woman Doctor Lina

A woman doctor Lina 女医生丽娜 Born in a pigs’ nest, Lina led a poor life in her childhood. 出生在猪圈里&#xff0c;丽娜过着贫穷的童年生活。 led nest She was looked down upon by the children of her generation. 她被她同时代的孩子瞧不起。 generation look…

day 38 动态规划(1)

day38 代码随想录 2024.1.6 开始动态规划&#xff01; 递归五部曲&#xff1a; 确定dp数组含义确定递推公式dp数组初始化遍历顺序举例推导dp数组 1. 50斐波那契数列 经典的动态规划入门第一题&#xff0c;直接递归五部曲&#xff0c; 本题递归数组是具体要求的值&#xff0c…

每日一题 - 240106 - D - Loong and Takahashi

D - Loong and Takahashi TAG - 回形矩阵 回形矩阵 回形矩阵时间复杂度 - O ( N N ) O(N \times N) O(NN) // #include<bits/stdc.h> using namespace std; // #define int long long const int N50; int g[N][N];void solve() {int n;scanf("%d",&n )…

私有云平台搭建openstack和ceph结合搭建手册

OpenStack与云计算 什么是云&#xff1f; 如何正确理解云&#xff0c;可以从以下几个方面。 云的构成。 用户&#xff1a;对用户而言是透明无感知的&#xff0c;不用关心底层构成&#xff0c;只需要知道利用云完成自己任务即可。 云提供商&#xff1a;对云资产管理和运维。 云…

CentOS安装JDK

目录 一、文件准备 1、目录创建 2、导入jdk压缩文件 3、解压压缩包 二、配置 1.配置环境变量 2.使用source命令生效环境变量 3、测试 总结 一、文件准备 1、目录创建 在/usr/local下创建java 目录 2、导入jdk压缩文件 3、解压压缩包 tar -zxf jdk-8u201-linux-x64.t…

[C#]使用onnxruntime部署yolov8-onnx印章检测

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8是目标检测领域中的一种先进算法&#xff0c;它是YOLO&#xff08;You Only Look Once&#xff09;系列算法的最新发展。YOLO算法以其高效和实时的性能而著名&#xff0c;而YOLOv8则进一…

计算机毕业设计----ssm大学生兼职论坛

项目介绍 该项目是一个大学生校园兼职平台&#xff0c;分为前台和后台功能&#xff0c;主要用户有三种角色&#xff1a;分别是商家、学生、管理员。商家可以发布兼职信息&#xff0c;发布后&#xff0c;管理员进入后台确认信息是否有效&#xff0c;并且审核该兼职信息。学生登…

vue接入高德地图

使用 JSAPI 安全模式,代理服务请以_AMapService 作为一级路由 index.html <script type"text/javascript">window._AMapSecurityConfig {serviceHost: "http://xx.xx.xx.xx:8223/_AMapService"};</script><script type"text/javascr…

gRPC - gRPC 整合 SpringBoot(全代码 + 避坑!)

目录 一、gRPC 整合 SpringBoot 1.1、创建项目 1.2、天坑&#xff08;看前须知&#xff09;&#xff01; 1.2.1、天坑背景 1.2.2、解决天坑 1.3、api 开发 1.4、server 开发 1.5、client 开发 1.6、演示效果 一、gRPC 整合 SpringBoot 1.1、创建项目 api&#xff1a;编…

关于图像分类任务中划分数据集,并且生成分类类别的josn字典文件

1. 前言 在做图像分类任务的时候&#xff0c;数据格式是文件夹格式&#xff0c;相同文件夹下存放同一类型的类别 不少网上的数据&#xff0c;没有划分数据集&#xff0c;虽然代码简单&#xff0c;每次重新编写还是颇为麻烦&#xff0c;这里记录一下 如下&#xff0c;有的数据…

大语言模型的幻觉:解析、成因及解决方法

目录 前言1 大语言模型的幻觉现象解析1.1 输入冲突幻觉&#xff08;Input-conflicting&#xff09;1.2 上下文冲突幻觉&#xff08;Context-conflicting&#xff09;1.3 事实冲突幻觉&#xff08;Fact-conflicting&#xff09; 2 幻觉产生的原因2.1 数据偏差和模型缺陷2.2 知识…

“人家赚那么多”系列03:如何慢速练习?

01 慢速练习 慢速练习是学习和发展中常用的基本技巧。 比如说&#xff0c;当你初学吉他时&#xff0c;开始时肯定是以比预期速度慢得多的节奏&#xff0c;逐段逐段地演奏&#xff0c;随着每次的重复&#xff0c;逐渐增加速度&#xff0c;直到完全达到正确的速度。 回想学习英语…

基于SpringBoot的在线考试系统绿色

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的在线考试系统绿色,java…

如何发布自己的golang库

如何发布自己的golang库 1、在 github/gitee 上创建一个 public 仓库&#xff0c;仓库名与 go 库名一致&#xff0c;然后将该仓库 clone 到本地。 本文这里使用 gitee。 $ git clone https://gitee.com/zsx242030/goutil.git2、进入项目文件夹&#xff0c;进行初始化。 $ go…