软件测试-Selenium学习笔记

"""  目标:  driver.find_element()  需求:  1. 使用driver.find_element()方法  2. 输入用户名:admin  3. 输入密码:123456  
"""  # 导包  
from selenium import webdriver  
from time import sleep  # 获取 浏览器驱动对象  
from selenium.webdriver.common.by import By  driver = webdriver.Edge()  # 打开 注册A.html  
url = r"E:\前端和测试 外包\测试学习\8天web自动化全套测试—资料\web自动化_day01_课件+笔记+资料+代码\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"  
driver.get(url)  # 使用find_element()定位用户名  
driver.find_element(By.ID, "userA").send_keys("admin")  
# 使用find_element()定位密码  
driver.find_element(By.CSS_SELECTOR, "#passwordA").send_keys("123456")  # 暂停 3秒  
sleep(3)  
# 退出浏览器驱动  
driver.quit()
driver.find_element()
  • 用于查找网页上的一个元素,返回一个 WebElement 对象

  • 需要传入两个参数:

    1. 定位方式By 提供的枚举常量)

    2. 定位值(对应的选择器)

By 定位方式

By 是 Selenium 提供的一个类,封装了各种元素定位方式。常用有:

  • By.ID("id值") → 通过元素的 id 属性定位

  • By.NAME("name值") → 通过 name 属性定位

  • By.CLASS_NAME("class值") → 通过 class 属性定位

  • By.TAG_NAME("tag值") → 通过标签名定位(如 "input", "button")

  • By.LINK_TEXT("文本") → 通过完整文本定位, 比如这种
    ![[Pasted image 20250819093103.png]]

  • By.PARTIAL_LINK_TEXT("部分文本") → 通过链接的部分文本定位

  • By.CSS_SELECTOR("css选择器") → 通过 CSS 选择器定位

  • By.XPATH("xpath表达式") → 通过 XPath 表达式定位(最万能)

link_textpartial_link_text 的区别
方法含义匹配方式
link_text按超链接的完整文本定位完全匹配,文本必须完全一样
partial_link_text按超链接文本的部分定位模糊匹配,只要包含指定子串即可

⚠️ 都只能用于 <a> 标签(超链接)

.send_keys()
  • 作用:模拟键盘输入

  • 参数:字符串或者特殊键(如回车键 Keys.ENTER

element.send_keys("hello")          # 输入字符串
element.send_keys(Keys.ENTER)       # 模拟回车
element.send_keys("123", Keys.TAB)  # 输入 123 后按下 TAB
XPath基本语法

假设有 HTML:

<div id="loginBox"><input id="userA" type="text" placeholder="用户名"><input id="passwordA" type="password" placeholder="密码"><button>登录</button>
</div>

(1) 按标签定位

driver.find_element(By.XPATH, "//input")  # 找第一个 input 元素
  • // 表示 从任意位置开始查找

  • input 是标签名

(2) 按属性定位

driver.find_element(By.XPATH, "//input[@id='userA']").send_keys("admin")
driver.find_element(By.XPATH, "//input[@type='password']").send_keys("123456")
  • [@属性名='值'] → 根据属性过滤

  • 可以定位 id、name、class、placeholder 等属性

(3) 按文本定位

driver.find_element(By.XPATH, "//button[text()='登录']").click()
  • text() 用于匹配标签的可见文本

(4) 模糊匹配 / contains

driver.find_element(By.XPATH, "//input[contains(@id, 'user')]").send_keys("admin")
driver.find_element(By.XPATH, "//button[contains(text(), '登')]").click()
  • contains(@属性, '值') → 属性包含某字符串

  • contains(text(), '值') → 文本包含某字符串

CSS Selector 基本语法

假设 HTML:

<div id="loginBox"><input id="userA" type="text" class="input-text" placeholder="用户名"><input id="passwordA" type="password" class="input-text" placeholder="密码"><button class="btn login-btn">登录</button>
</div>

(1) 按 id 定位

driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("admin")
  • #userA → 选择 id 为 userA 的元素

(2) 按 class 定位

driver.find_element(By.CSS_SELECTOR, ".login-btn").click()
  • .login-btn → 选择 class 包含 login-btn 的元素

(3) 按标签+class

driver.find_element(By.CSS_SELECTOR, "button.login-btn").click()
  • button.login-btn → 限制标签为 <button> 且 class 包含 login-btn

(4) 按属性定位

driver.find_element(By.CSS_SELECTOR, "input[placeholder='用户名']").send_keys("admin")
driver.find_element(By.CSS_SELECTOR, "input[type='password']").send_keys("123456")
  • [属性名='值'] → 匹配属性值

  • 也可以模糊匹配:

input[placeholder*='用']   # 属性值包含“用”
input[type^='pass']       # 属性值以“pass”开头
input[type$='word']       # 属性值以“word”结尾
浏览器操作方法
方法功能描述
maximize_window()最大化浏览器窗口
set_window_size(width, height)设置窗口宽高(像素)
set_window_position(x, y)设置窗口在屏幕的坐标位置
back()浏览器后退(模拟点击后退按钮)
forward()浏览器前进(模拟点击前进按钮)
refresh()刷新页面(模拟 F5 按键)
close()关闭当前窗口
quit()关闭浏览器驱动(结束所有窗口、释放资源)
title获取页面标题(属性,调用无括号,如 driver.title
current_url获取当前页面 URL(属性,调用无括号,如 driver.current_url
元素基础操作
方法功能描述
click()单击元素(模拟鼠标左键点击)
send_keys(value)向输入框等元素模拟输入文本
clear()清除输入框已填文本
元素信息获取方法
方法功能描述
size获取元素尺寸(宽高,属性,调用无括号,如 element.size
text获取元素文本内容(属性,调用无括号,如 element.text
get_attribute("xxx")获取元素指定属性值(xxx 为属性名,如 get_attribute("id")
is_displayed()判断元素是否可见(返回布尔值)
is_enabled()判断元素是否可用(如按钮是否可点击,返回布尔值)
is_selected()判断元素是否被选中(复选框、单选框专用,返回布尔值 )
常用鼠标操作

使用 ActionChains 后必须调用 .perform() 执行

# 导包
from selenium.webdriver import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://www.baidu.com")element = driver.find_element(By.ID, "kw")  # 搜索框
#注册
actions = ActionChains(driver)
方法作用示例
click()单击元素actions.click(element).perform()
double_click()双击元素actions.double_click(element).perform()
context_click()右击元素actions.context_click(element).perform()
move_to_element()鼠标悬停到元素actions.move_to_element(element).perform()
click_and_hold()鼠标按下不放actions.click_and_hold(element).perform()
release()鼠标释放actions.release(element).perform()
drag_and_drop(source, target)拖拽元素actions.drag_and_drop(source, target).perform()
drag_and_drop_by_offset(source, x, y)按偏移拖拽actions.drag_and_drop_by_offset(source, 100, 0).perform()
键盘操作
from selenium.webdriver.common.keys import Keyselement = driver.find_element(By.ID, "kw")# 输入文字 + 回车
element.send_keys("Selenium", Keys.ENTER)# 组合操作
actions = ActionChains(driver)
actions.key_down(Keys.SHIFT).send_keys("selenium").key_up(Keys.SHIFT).perform()  # 大写输入
描述
Keys.ENTER回车
Keys.TABTab 键
Keys.ESCAPEEsc
Keys.BACKSPACE删除
Keys.CONTROLCtrl
Keys.ALTAlt
Keys.SHIFTShift
Keys.ARROW_UP/DOWN/LEFT/RIGHT上下左右方向键
Keys.DELETE删除键
Keys.COPYCtrl+C(复制)
Keys.PASTECtrl+V(粘贴)
元素等待

隐式等待(全局等待)

from selenium import webdriverdriver = webdriver.Chrome()
driver.implicitly_wait(10)  # 设置全局等待时间 10 秒driver.get("https://www.baidu.com")
driver.find_element("id", "kw").send_keys("ChatGPT")

显式等待

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")# 显式等待:最多等待 10 秒,直到元素出现
search_box = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "kw"))
)
search_box.send_keys("ChatGPT")

显式与隐式区别:

  1. 作用域:隐式为全局元素,显式等待为单个元素有效

  2. 使用方法:隐式等待直接通过驱动对象调用,而显式等待方法封装在 WebDriverWait 类中

  3. 达到最大超时时长后抛出的异常不同:隐式为 NoSuchElementException,显式等待为 TimeoutException

下拉框

Select 类用于操作 select 标签

#实例化对象:
select = Select (element)  
element: <select>标签对应的元素,通过元素定位方式获取,  
例如:driver.find_element_by_id ("selectA")

方法:

  1. select_by_index (index) --> 根据 option 索引来定位,从 0 开始
  2. select_by_value (value) --> 根据 option 属性 value 值来定位
  3. select_by_visible_text (text) --> 根据 option 显示文本来定位

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

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

相关文章

知微传感3D相机上位机DkamViewer使用:给相机升级固件

写在前面 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有&#xff1a; 1、便利他人应用相机&#xff0c;本系列文章包含公司所出售相机的SDK的使用例程及详细注释&#xff1b;2、促进行业发展及交流。 知微传感Dkam系列3D相机可以应用于定位分拣、焊接焊缝提取、…

CMake进阶: CMake Modules---简化CMake配置的利器

目录 1.简介 2.为什么需要 CMake Modules&#xff1f; 3.内置模块&#xff1a;开箱即用的工具 3.1.依赖查找模块&#xff08;FindXXX.cmake&#xff09; 3.2.功能检测模块&#xff08;CheckXXX.cmake&#xff09; 3.3.通用工具模块&#xff08;如 FetchContent.cmake、CT…

【Docker】Ubuntu上安装Docker(网络版)

【Docker】Ubuntu上安装Docker注意&#xff1a;一、环境准备1. 系统要求2. 卸载旧版本二、安装步骤1.配置仓库源2.安装 Docker引擎3.验证安装情况三、解决报错1、检查网络连接2、检查Docker服务状态3、换源4.重载生效、重启服务、查看是否配置成功5.验证解决情况四、权限与配置…

Socket 编程 TCP

TCP 网络程序 和刚才 UDP 类似. 实现一个简单的英译汉的功能。TCP是面向字节流的可靠传输&#xff0c;如同前文的管道流&#xff0c;只要是流&#xff0c;它的操作就是文件的写出与读入。TCP socket API 详解下面介绍程序中用到的 socket API,这些函数都在 sys/socket.h 中。so…

使用AWS S3 + Lambda + MediaConvert 实现上传视频文件并自动转码

前言 最近团队在做短视频平台的技术调研&#xff0c;其中有一个环节便是音视频开发&#xff0c;即对用户上传的视频进行自适应转码。自适应的原理其实就是预先将视频转换为几个常用的分辨率&#xff0c;app端根据用户手机分辨率拉取相应分辨率的视频。 目前尝试了两种方案&…

QT之QWaitCondition降低cpu占用率,从忙等待到高效同步

在多线程编程中&#xff0c;线程间的同步是一个核心问题。在处理线程等待时&#xff0c;经常会写出高CPU占用率的代码&#xff0c;其中最典型的就是使用忙等待&#xff08;busy waiting&#xff09;。本文将详细介绍如何使用Qt框架中的QWaitCondition类来优雅地解决这一问题&am…

pcl求平面点云的边界凸包点

基本流程1&#xff0c;读入点云&#xff0c;并去除无效点2&#xff0c;拟合平面3&#xff0c;去除离平面距离较远的点4&#xff0c;对点云进行平面投影5&#xff0c;进行convex_hull运算初学者&#xff0c;暂时不知道能用来干嘛。练手还是非常不错的&#xff01;#define _CRT_S…

Windows系统上使用GIT

首先破除一下畏惧心理&#xff1a;在Windows上使用git和在linux系统中的使用方法是一样的&#xff0c;只是安装方式没那么便捷&#xff0c;毕竟linux中安装git只需要一行命令 GIT下载地址 如果你的电脑的CPU是64位的&#xff0c;就点击&#xff1a; Git-2.50.1-64-bit.exe 如果…

《设计模式之禅》笔记摘录 - 17.模板方法模式

模板方法模式的定义模板方法模式(Template Method Pattern)是如此简单&#xff0c;以致让你感觉你已经能够掌握其精髓了。其定义如下&#xff1a;Define the skeleton of an algorithm in an operation, deferring some steps to subclasses.Template Method lets subclasses r…

SpreadJS 协同服务器 MongoDB 数据库适配支持

为了支持 SpreadJS 协同编辑场景&#xff0c;协同服务器需要持久化存储文档、操作、快照及里程碑数据。本文介绍了 MongoDB 数据库适配器的实现方法&#xff0c;包括集合初始化、适配器接口实现以及里程碑存储支持。 一、MongoDB 集合初始化 协同编辑服务需要以下集合&#x…

Ubuntu 主机名:精通配置与管理

主机名&#xff08;hostname&#xff09;是Linux系统中用于标识网络上特定设备的名称&#xff0c;它在网络通信、服务配置&#xff08;如 Kubernetes 集群、数据库&#xff09;以及日志记录中扮演着至关重要的角色。对于初学者来说&#xff0c;配置主机名似乎很简单&#xff0c…

C/C++ 协程:Stackful 手动控制的工程必然性

&#x1f680; C/C 协程&#xff1a;Stackful 手动控制的工程必然性 引用&#xff1a; C/C 如何正确的切换协同程序&#xff1f;&#xff08;基于协程的并行架构&#xff09; #mermaid-svg-SXgplRf3WRYc8A7l {font-family:"trebuchet ms",verdana,arial,sans-serif;…

新手向:使用STM32通过RS485通信接口控制步进电机

新手向&#xff1a;使用STM32通过RS485通信接口控制步进电机 准备工作 本文使用的STM32芯片是STM32F407ZGTx&#xff0c;使用的电机是57步进电机&#xff0c;驱动器是用的是时代超群的RS485总线一体化步进电机驱动器&#xff08;42 型&#xff1a;ZD-M42P-485&#xff09;。使…

设计模式笔记_行为型_命令模式

1.命令模式介绍命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求或操作封装为对象&#xff0c;使得可以用不同的请求对客户端进行参数化。命令模式的核心思想是将方法调用、请求或操作封装到一个独立的命令对象中&#xff0c;从而使得客…

详解MySQL中的多表查询:多表查询分类讲解、七种JOIN操作的实现

精选专栏链接 &#x1f517; MySQL技术笔记专栏Redis技术笔记专栏大模型搭建专栏Python学习笔记专栏深度学习算法专栏 欢迎订阅&#xff0c;点赞&#xff0b;关注&#xff0c;每日精进1%&#xff0c;与百万开发者共攀技术珠峰 更多内容持续更新中&#xff01;希望能给大家带来…

vue3+elemeent-plus, el-tooltip的样式修改不生效

修改后的样式&#xff0c;直接贴图&#xff0c;经过删除出现悬浮1、在书写代码的时候切记effect“light”&#xff0c;如果你需要的是深色的样式:disabled"!multiple" 是否禁用<el-tooltip effect"light" placement"top" content"请先选…

网页作品惊艳亮相!这个浪浪山小妖怪网站太治愈了!

大家好呀&#xff01;今天要给大家分享一个超级治愈的网页作品——浪浪山小妖怪主题网站&#xff01;这个纯原生开发的项目不仅颜值在线&#xff0c;功能也很能打哦&#xff5e;至于灵感来源的话&#xff0c;要从一部动画说起。最近迷上了治愈系动画&#xff0c;就想做一个温暖…

搭建最新--若依分布式spring cloudv3.6.6 前后端分离项目--步骤与记录常见的坑

首先 什么拉取代码&#xff0c;安装数据库&#xff0c;安装redis&#xff0c;安装jdk这些我就不说了 导入数据库 &#xff1a;数据库是分库表的 &#xff0c;不要建错了 【一定要注意&#xff0c;不然nacos读取不到配置文件】这个是给nacos用的这个是给项目配置或项目用的2. 服…

分布式唯一 ID 生成方案

在复杂分布式系统中&#xff0c;往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中&#xff0c;数据日渐增长&#xff0c;对数据分库分表后需要有一个唯一 ID 来标识一条数据或消息&#xff0c;数据库的自增 ID 显然不能…

飞算JavaAI赋能高吞吐服务器模拟:从0到百万级QPS的“流量洪峰”征服之旅

引言&#xff1a;当“流量洪峰”来袭&#xff0c;如何用低代码驯服高并发&#xff1f; 在数字化时代&#xff0c;从电商平台的“双11”大促到社交网络的突发热点事件&#xff0c;再到金融系统的实时交易高峰&#xff0c;服务器时刻面临着**高吞吐量&#xff08;High Throughput…