Selenium常用实战功能指南

2023-05-16

文章目录

  • 自动化前言
  • 元素定位的几种方法
    • id定位
    • name定位
    • link_text定位
    • partial_link_text定位
    • xpath定位(重点)
    • css定位
    • 常见问题
  • 元素操作的常用方法
    • 基本方法
      • send_keys()
      • text
      • get_attribute()
      • maximize_window()
      • current_window_handle
      • current_url
      • is_selected()
      • is_enable()
      • is_displayed()
      • clear()
      • quit()
      • title
      • refresh()
      • back()
    • 特殊方法
      • ActionChains
      • Select操作
    • 调用js代码
    • frame操作
      • 进入frame
      • 退出frame
    • Cookie操作
    • 截图操作
    • 多窗口切换
  • 3类等待
    • 显示等待
    • 隐示等待
    • 强制等待
  • ChromeOptions常用配置

自动化前言

  1. 什么项目适合做自动化?
  • 软件需求变更不频繁
  • 项目周期长
  • 自动化脚本可重复利用
  1. 自动化测试的介入点:
  • 系统测试
  1. 自动化测试项目实施过程
  • 可行性分析,框架选择,需求分析,计划,测试用例设计,无人值守,提交报告,脚本维护。

元素定位的几种方法

id定位

from selenium.webdriver.common.by import BY

elem=driver.find_element(By.ID,"kw")

定位的元素例子:

<a id="kw">哈哈哈<a>

name定位

from selenium.webdriver.common.by import BY

elem=driver.find_element(By.NAME,"kw")

定位的元素例子:

<a name="kw">哈哈哈<a>

link_text定位

from selenium.webdriver.common.by import BY

elem=driver.find_element(By.LINK_TEXT,"新闻")

定位的元素例子:

<a herf="https://www.baidu.com">新闻<a>

partial_link_text定位

from selenium.webdriver.common.by import BY

elem=driver.find_element(By.PARTIAL_LINK_TEXT,"新")

定位的元素例子:
根据部分文本来定位

<a herf="https://www.baidu.com">新闻<a>

xpath定位(重点)

绝对路径:/开头的是相对路径,从第一个标签开始逐步往下找元素叫绝对路径
例子:/html/body/div[2]/div[3]/div/div/ul[2]/li[8]/li/a/div/span
相对路径://开头的是绝对路径,从某个元素开始逐步往下找元素叫相对路径

  • 相对路径+索引

    • //form/span[1]/input (form标签下第2个span标签下的input标签)
  • 相对路径+属性

    • input标签下autocomplete属性为off的标签(//input[@autocomplete=‘off’])
  • 相对路径+通配符

    • //*[@autocomplete=‘off’] (任意标签下autocomplete属性为off的标签)
    • //*[contains(@autocomplete,‘of’)] (任意标签下autocomplete属性包含of的标签)
  • 相对路径+部分属性定位

    • //*[contains(@autocomplete,‘of’)] (任意标签下autocomplete属性包含of的标签)
    • //*[starts-with(@autocomplete,‘of’)] (任意标签下autocomplete属性包含of的标签)
    • //*[substring(@autocomplete,‘of’)] (任意标签下autocomplete属性包含of的标签)
  • 相对路径+文本定位

    • //span[text()=‘文本内容’]

css定位

常见问题

  1. 如果元素定位不到,怎么分析
  • 元素没有加载完成
  • 元素在frame种
  • 元素不可用,不可读,不可见
  • 动态属性,动态div层

前提:需要定位的元素属性必须唯一。

元素操作的常用方法

基本方法

send_keys()

向文本框发送内容

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
elem.send_keys("Selenium")

text

获取标签之间文本值

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
print(elem.text)

get_attribute()

获取标签的属性值

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
elem.get_attribute("value")

maximize_window()

最大化窗口

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()

current_window_handle

返回当前窗口句柄

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
print(driver.current_window_handle)

current_url

返回当前窗口url

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
print(driver.current_url)

is_selected()

判断元素是否被选择

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
elem.is_selected()

is_enable()

判断元素是否可用

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
elem.is_enable()

is_displayed()

判断元素是否在页面中显示

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
elem.is_displayed()

clear()

清除输入框值

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
elem.send_keys("Selenium")
elem.clear()

quit()

关闭浏览器并杀掉chromedriver

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.quit()

title

获取页面title

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
print(driver.title)

refresh()

刷新页面

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.refresh()

back()

退后操作

from selenium import webdriver

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.back()

特殊方法

ActionChains

Selenium中将键盘鼠标操作封装在Action Chains中。
示例:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains


driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
ActionChains(driver).move_to_element(bg_config).perform()
  • click 模拟鼠标单击操作
  • click_and_hold 模拟鼠标单击并按住不放
  • double_click 模拟鼠标双击
  • context_click 模拟鼠标右击
  • drag_and_drop(source,target) 模拟鼠标拖拽
  • drag_and_drop(source, xoffset, yoffset) 将目标拖拽到目标位置
  • key_down(value) 模拟按住某个键,实现快捷操作
  • key_up(value) 模拟松开某个键,一般和key_down操作一起使用
  • move_to_element(to_element) 模拟将鼠标移到指定的某个页面元素
  • move_to_element_with_offset(to_element,x,y) 移动鼠标到指定坐标
  • perform() 将之前一系列Action-Chains执行
  • release() 释放按下的鼠标
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
elem.send_keys(Keys.BACK_SPACE)
ActionChains(driver).move_to_element(bg_config).perform()

Select操作

示例:

from selenium import webdriver
from selenium.webdriver.support.select import Select 


driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
Select(elem).select_by_index(1)
  • select_by_index(n) 根据下标选择

  • select_by_value(value) 根据值选择

  • select_by_visible_text(text) 根据text内容做选择

  • options 获取下拉列表所有选项

  • first_selected_options 返回所有被选中的选项

  • first_selected_option 返回第一个被选中的选项

from selenium import webdriver
from selenium.webdriver.support.select import Select 


driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
options=Select(elem).options
for elem in options:
	print(elem.text)

调用js代码

  • execute_script() 同步执行js
  • execute_async_script() 异步执行js

js实现浏览器滚动条操作

from selenium import webdriver
from selenium.webdriver.support.select import Select 


driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
js="window.scrollTo(100,300)"
driver.execute_script(js)

frame操作

进入frame

  • 根据id定位frame并进入frame,id=login_frame
from selenium import webdriver
from selenium.webdriver.support.select import Select 


driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.switch_to.frame(driver.find_element_by_id("login_frame"))
  • 根据frame的index进入
from selenium import webdriver
from selenium.webdriver.support.select import Select 


driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.switch_to.frame(0)

退出frame

driver.switch_to.default_content()

Cookie操作

  • add_cookie(cookie_dict) 在当前会话中添加cookie信息
  • delete_all_cookie() 删除所有cookie信息
  • delete_cookie(cookie_name) 删除单个名字为cookie_name的cookie信息
  • get_cookie(cookie_name) 返回名为cookie_name 的cookie信息
  • get_cookies() 返回当前会话的所有cookie信息
from selenium import webdriver
from selenium.webdriver.support.select import Select 


driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.add_cookie({"session":"12344322"})

截图操作

屏幕截图

from selenium import webdriver
from selenium.webdriver.support.select import Select 


driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.save_screenshot("q.png")

元素截图

from selenium import webdriver
from selenium.webdriver.support.select import Select 
from PIL import Image

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
elem=driver.find_element_by_id("kw")
left=elem.locationp['x']
top=elem.locationp['y']
right=left+elem.size['width']
bottom=top+elem.size['height']
im=Image.open("test.png")
im=im.crop((left,top,right,bottom))
im.save('t.png')

多窗口切换

from selenium import webdriver
from selenium.webdriver.support.select import Select 


driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 获取所有窗口句柄
handles=driver.window_handles
# 切换到新窗口
driver.switch_to.window(handles[1])

3类等待

在实际测试过程中,在操作某个元素之前都会有一个等待过程,有3种

显示等待

显示等待是针对特定的元素设置等待事件,在设置的时间内,默认每隔一段时间(默认0.5s)检测一次当前页面元素,在规定的时间内找到元素,则执行下一步,超时没有找到则抛异常。

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

#判断元素是否存在页面
presence_of_element_located(*locate):入参为一个元祖,需要传入元素类型和对应元素信息,底层自动调用
WebDriverWait(driver=driver,timeout=1).until(EC.presence_of_element_located((By.ID,"111")),message="test")
#判断元素不存在页面
WebDriverWait(driver=driver,timeout=1).until_not(EC.presence_of_element_located((By.ID,"111")),message="test")
#判断是否存在alert
WebDriverWait(driver=driver,timeout=1).until(EC.alert_is_present((By.ID,"alert")),message='None')
#判断标题是否等于预期值
WebDriverWait(driver=driver,timeout=1).until(EC.title_is(r"百度一下,你就知道"),message='None')
#判断标题是否包含预期值
WebDriverWait(driver=driver,timeout=1).until(EC.title_contains(r"百度一下,你就知道"),message='None')
#判断元素是否可见
WebDriverWait(driver=driver,timeout=1).until(EC.presence_of_all_elements_located((By.ID,"kw")),message='None')
#判断元素是否可点击
WebDriverWait(driver=driver,timeout=1).until(EC.element_to_be_clickable((By.ID,"kw")),message='None')

隐示等待

显示等待作用于整个driver,超过时间未加载完成就抛异常。

driver.implicitly_wait(5) ==单位s

强制等待

调用time库中的sleep,让脚本强制停止到达设置时间后执行后面的脚本,极大影响脚本效率,不推荐使用。

time.sleep(5) ==单位s

ChromeOptions常用配置

cnblogs.com/llx2022/articles/16253259.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium常用实战功能指南 的相关文章

  • Windows10 上安装 Anaconda 后命令提示符(cmd)下无法执行python命令解决方案

    安装Anaconda后一段时间内能够在命令提示符 xff08 cmd xff09 界面运行python会进入python的交互界面 xff01 可是一段时间后突然间后突然运行不通过报错如图一所示 然后我们找到路径 C Program Fil
  • python实现视频转文字

    最近在做视频转文本的工作 xff0c 遇到了不少问题 xff0c 记录一下 本博客包括以下内容 xff1a 1 如何将视频转换成音频 2 如何调用科大讯飞API实现音频转文字 首先 xff0c 视频转文本 xff0c 如果调用科大讯飞API
  • centos7安装gitlab-ce

    安装gitlab ce 首先安装依赖 xff1a yum install curl openssh server openssh clients postfix policycoreutils python启动所需服务 systemctl
  • vue使用element-plus创建项目

    vue cli创建项目 报错 找到windows powershell 管理员 xff0c 必须以管理员身份执行 xff0c 输入 set ExecutionPolicy RemoteSigned 选择创建方式 Default Uue 3
  • java zip文件解压(含有密码解压)

    maven需要加入以下依赖 xff1a lt dependency gt lt groupId gt net lingala zip4j lt groupId gt lt artifactId gt zip4j lt artifactId
  • pcl用PCLVisualizer可视化ply数据,显示界面卡死问题

    pcl用PCLVisualizer可视化ply数据 xff0c 显示界面卡死问题 在addPointCloud后面加一句viwer gt spin
  • 2020-11-08

    超级好用的免费PDF转word网站 超级PDF https xpdf net 一个超级好用的PDF处理网站 xff0c 功能强大 这个网站提供了丰富的PDF转换 xff0c 处理功能 xff0c 支持OCR识别 操作简单 xff0c 速度快
  • 2021-04-23

    看起来像传指针的传值的函数参数传递 span class token keyword void span span class token function func span span class token punctuation sp
  • 3D slicer编译过程中遇到的问题总结

    3D slicer编译过程中遇到的问题总结系列一 1 xff0c 有关python部分编译 1 gt 已启动生成 项目 python setuptools 配置 Debug x64 1 gt Creating directories for
  • Haskell大世界+思考

    文章目录 基石般灵活表现自由的抽象范式编程语言是什么 xff1f 推荐论文大佬建议MetaHaskell 实现类型系统语言抽象 模式问题解决方案 Haskell在工业界有哪些实际的应用 xff1f 关于fp的一些思考递归是循环的超集 同样是
  • Promox VE(PVE) 连接wifi配置

    pve一个管理虚拟机和容器的平台 xff0c 由于是开源免费的 xff0c 被很多小伙伴用来搭建自己的 34 all in one 34 主机 我也看过很多相关文章和教程 xff0c 看着大家玩的不亦乐乎 xff0c 再看着自己半退役的笔记
  • vscode的conda环境切换和快捷键终端切换文件所在路径

    最近miniconda太多环境 xff0c vs code编辑切换太麻烦 xff0c 于是整个快捷键 cmd 43 shift 43 p设置user settingup json 34 terminal integrated shell w
  • SonarLint黄线警告python:S125

    SonarLint黄线警告python S125 刚安装了SonarLint到我的vscode上 xff0c 发现有黄线警告说我的代码风格不好 黄线的原因是 xff1a 程序员不应该注释掉代码 xff0c 因为它使程序膨胀 xff0c 降低
  • mark点Z3学习资料整理

    文章目录 Anything is NothingLess is MoreSMTz3 classeslogic programming Reasoning符号推理策略strategiesFixed point关系代数datalog程序分析验证
  • windows和wsl设置代理

    wsl查看host ip用脚本试试查看具体当下宿主机和wsl自身不同的两个ip或者 分配固定ip 或者cmd用ipconfig看或者localhost 127 0 0 1 xff0c 然后区分socks5还是http协议 xff0c 然后查
  • 数学物理计算机的思考

    一些关于数学物理计算机的妄言 如果说冥冥之中有一种真理 自然世界的运作规律 61 真理 61 自然科学 xff0c 致敬牛顿的那本著名的几何书 xff0c 我会把它叫做 自然哲学 以下我说的每句话 xff0c 都蕴涵着我自己的生活经历 xf
  • 一个知乎提问引发的(思考)[https://www.zhihu.com/question/263431508/answer/574084280]

    表示很喜欢这个问题 xff0c 深有同感 xff01 这个问题也让我这种杂家谈谈想法吧 xff0c 看题主应该是骨骼精奇的奇才 xff0c 我假想读者是 小学生 xff0c 所以 xff0c 觉得我啰嗦的大大 xff0c 忍忍吧 xff0c
  • Johnson算法PlantSimulation解决两机器多作业排版问题

    生产系统仿真应用教程PlantSimulation 周金平Johnson算法代码写错了的源代码 xff1a is i j m n y integer do y 61 Jobs ydim m 61 1 n 61 y for i 61 1 to
  • 组成原理---补码加减法,原码一两位乘法,补码一两位乘法,754标准

    翻转课堂 xff0c 学生讲课 xff0c 笔记顺便贴上来吧 万一有人需要呢 这里754标准其实可以看https blog csdn net xingqingly article details 18981671 xff0c 我没有把尾数规
  • POSIX 网络API原理

    1 POSIX 网络API 网络编程常用的API xff1a 2 IO函数的内部过程分析 2 1 Socket socket作为网络编程的第一个函数 xff0c 主要作用是用于创建句柄和对应的TCB控制块 xff1b 建立起文件描述符和内部

随机推荐

  • 卷积神经网络(CNN)的平移不变性和旋转不变性。

    文章目录 不变性的介绍不变性的原理 不变性的介绍 不变性意味着即使目标的外观发生了某种变化 xff0c 但是你依然可以把它识别出来 旋转不变性和平移不变性 xff1a 通俗的讲 xff0c 我给你一张图片 xff0c 你识别出来这是只狗 x
  • ubuntu22.04版本APPimage启动报错问题解决

    文章目录 前言 xff1a 报错信息解决方法结果展示你以为就完了 xff1f 天真 xff01 结果展示2结语 前言 xff1a 因为个人比较喜欢提前使用一些较新的软件 系统之类的东西 xff0c 所有在ubuntu22刚发行就选择了升级
  • 音视频封装原理简介

    1 什么是数据化封住和解封装 xff1f 2 视频数据的封装 3 什么是音视频的封装格式 4 封装格式
  • wsl 配置 java 环境以及使用 vscode 调试

    wsl 配置 java 环境以及使用 vscode 调试 原文 xff1a https blog csdn net huiruwei1020 article details 107775782 按照原文我无法运行 xff0c 按照Stack
  • L13. hrtimer使用实例(高精度定时器)

    1 简介 随着内核不断更新演进 xff0c 内核对定时器的分辨率要求越来越高 硬件的高速发展也逐渐能够满足内核的这一要求 xff0c 因此内核针对硬件提供的便利 xff0c 开始设计了更高分辨率的定时器 xff08 hrtimer xff0
  • 鸿蒙操作系统下载

    简介 华为最近开源了自产的操作系统 Harmony 凑一波热闹 xff0c 下载源码看看 横看成岭侧成峰 xff0c 远近高低各不同 由于目前水平有限 xff0c 所以不对鸿蒙操作系统做出过多评价 xff0c 只是下载来学习一下 愿景是希望
  • 5. C++ 抽象类

    1 简介 抽象类往往用来表征对问题领域进行分析 设计中得出的抽象概念 xff0c 是对一系列看上去不同 xff0c 但是本质上相同的具体概念的抽象 通常在编程语句中用 abstract 修饰的类是抽象类 在C 43 43 中 xff0c 含
  • C++并发编程 - 互斥锁(lock_guard和unique_lock)

    C 43 43 并发编程 互斥锁 在多线程的编程中 xff0c 共享数据的修改限制是必不可少的环节 期望的是 当一个线程访问共享数据期间 xff0c 此数据不应该被其他线程修改 xff1b 当某个线程修改了共享数据 xff0c 应通知其他线
  • CMake搭建编译环境总结

    前言 交叉编译算是每个嵌入式开发者都会经历的一道坎吧 xff0c 通俗的描述就是搭建Arm板代码编译环境 xff0c 让代码能够在Arm板子上跑起来 常用到的编译工具为Makefile和CMake xff0c 本篇记录下CMake的常用技巧
  • C++ lambda表达式

    lambda表达式 目录 一 开篇二 lambda初识三 lambda基本用法四 lambda表达式捕获列表五 总结六 参考 一 开篇 lambda表达式是C 43 43 11引进的一个新特性 xff0c 其写法比较新颖 xff0c 经常被
  • 网络编程 - Linux socket编程

    前言 socket 套接字 是网络编程编程的一种技巧 通过socket不仅可以实现跨进程通信 xff0c 还可以实现跨主机的网络通信 使用这种技术 xff0c 就可以实现全国各地的通讯 例如 xff1a 深圳的一台电脑接收来自北京一台电脑发
  • 记一次STM32F3单片机无法下程序解决方法

    不知道什么操作导致keil5下载STM32F3的程序时报以下错误 xff1a JLink info DLL V4 90 compiled Jul 28 2014 10 35 20 Firmware J Link OB STM32F072 C
  • SpringBoot集成MyBatis-Plus代码生成器(V3.5.1)

    1 说明 MyBatis Plus在3 5 1版本之后 xff0c 改变了代码生成器的用法 xff0c 由于对历史版本的不兼容 xff0c 这次重新梳理一份新的用法 3 5 1版本之前的代码生成器请参考 xff1a SpringBoot集成
  • 插上串口设备导致鼠标乱飘

    今天再一次遇见这种怪事 xff0c 屏幕上鼠标到处乱飘不受控制 xff0c 之前也遇到过 xff0c 没仔细研究 最终在网上搜寻答案发现是插上串口设备导致的问题 xff0c 因为串口一直不停的发送数据 xff0c 会导致电脑将其误识别成鼠标
  • openstack(queens)部署Zun服务

    zun安装手册 Zun是Openstack中提供容器管理服务的组件 xff0c 本文使用的是centos7上的openstack xff08 queens xff09 环境 目录 zun安装手册 3 在controller节点上安装zun服
  • Supervisor 定期重启指定进程

    简介 supervisor 是用 Python 开发的一套通用的进程管理程序 xff0c 能将一个普通的命令行进程变为后台 daemon xff0c 并监控进程状态 xff0c 异常退出时能自动重启 它是通过 fork exec 的方式把这
  • linux 源码安装 xrdp

    前言 xrdp可以做两件事 xff0c 第一件事就是可以使得linux支持RDP协议 xff0c 使得linux桌面能够通过mstsc连接 xff0c 第二件事就是RDP代理 xff0c 我们能通过xrdp连接到其他人的RDP资源 前者 x
  • 编译openssl时发生错误

    编译openssl时发生错误 error OPENSSL ALGORITHM DEFINES no longer supported 原理参考 xff08 由于同时安装了openssl 1 1和openssl 1 0 xff09 版本 xf
  • Linux 非源码安装 xrdp

    基本环境说明 我的是Centos 7 mini 或者 Ubuntu最小化安装 xff0c 想通过mstsc连接到xrdp xff0c 再通过xrdp连接到 Centos 7 mini xff0c 不安装桌面 xff0c 只打开 xterm
  • Selenium常用实战功能指南

    文章目录 自动化前言元素定位的几种方法id定位name定位link text定位partial link text定位xpath定位 xff08 重点 xff09 css定位常见问题 元素操作的常用方法基本方法send keys textg