当前位置: 首页 > news >正文

从 0 到 1 搭建 Python 语言 Web UI自动化测试学习系列 10--基础知识 6--元素等待方式和内联框架

测试学习记录,仅供参考!

元素等待

元素等待是 web 自动化中比较重要的一个概念,在 selenium 中有三种等待方式,分别是 强制等待、显式等待、隐式等待;

为什么在做元素定位时需要用到等待呢?

假如说运行的脚本没有加任何等待, 在打开浏览器时受到 页面加载、一系列跟网速相关的、跟服务器响应时间相关的、跟硬件等等一系列的关系,导致页面还没有加载出来,代码脚本(python 执行很快的)却已经执行完了;这个时候若没有等待的话,就会报错提醒没有找到元素,所以需要用到等待相关的;

selenium 元素等待方式

1、在项目根目录下新建一个名称为 element_waits.py 的 Python 文件;

强制等待

2、强制性的让浏览器页面等待多少时间后才去找元素定位;可以直接使用 time.sleep(xx) 或者引入 time 时间模块调用 sleep 函数设置等待时间,一般默认单位是秒,设置多长时间,程序代码脚本在执行过程中就会等待多少时间;例如:设置 10 秒钟,而页面元素在第 5 秒钟的时候就以及加载出来了,后面的 5 秒钟时间其实就是冗余的等待时长;强制等待方式会导致程序代码脚本运行时间过长,不到万不得已尽可能少用,特殊情况下,时间设置最好不超过 2 秒,一般 1 秒、 0.5秒;在写框架的时候,最好少用强制等待,太费时间了,在企业级项目代码中,一般不推荐使用这种等待方式;

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep# 实例化浏览器
driver = webdriver.Edge()
# 网址
my_url = 'https://www.leafground.com/select.xhtml'
# 打开网页
driver.get(my_url)
# 窗口最大化
driver.maximize_window()# 强制等待
sleep(5)
ele = driver.find_element(By.ID, 'j_idt87:lang_label')
print(ele)# 等待3秒
sleep(3)
# 关闭实例化浏览器
driver.quit()

显示等待

3、显示等待就是在代码中明确指定了的等待时间,等待元素出来之后就马上进行下一步的操作;

简单来说就是“明确要等到某一个元素出现后,根据设置的等待时长一直等,在规定的时间内如果都没有找到的话就抛出一个异常”;

显示等待的作用域是单个元素;当你知道某一个元素定位加载有点慢的时候,可以去使用显示等待去找单个元素;

就是明确的要等到某个元素的出现,等不到就一直等,除非在规定的时间内都没有找到,那么就抛出异常;

调用 WebDriverWait 类,类里面 WebDriverWait(driver, 10) 第一个参数是浏览器驱动对象 driver,第二个参数是 设置的等待时长,然后再调用 until() 方法,方法里面调用刚刚导入的 EC 类 .点 调用 等待这个元素出现 方法 visibility_of_element_located() ,需注意这个方法里面跟的是元组;

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 引入显示等待 WebDriverWait 类
from selenium.webdriver.support.ui import WebDriverWait
# 引入显示等待异常 expected_conditions 库 --用 as 取个别名 EC
from selenium.webdriver.support import expected_conditions as EC# 实例化浏览器
driver = webdriver.Edge()
# 网址
my_url = 'https://www.leafground.com/select.xhtml'
# 打开网页
driver.get(my_url)
# 窗口最大化
driver.maximize_window()# 强制等待
# sleep(5)
# ele = driver.find_element(By.ID, 'j_idt87:lang_label')
# print(ele)# 显示等待--等待元素可见
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'j_idt87:lang_label')))
print(element)# 等待3秒
sleep(3)
# 关闭实例化浏览器
driver.quit()

隐式等待

4、 在创建浏览器驱动 driver 对象时,为浏览器对象创建一个等待时间;这个方法是得不到某个元素就等待一段时间,直到拿到某个元素就立即进行下一个操作;

隐式等待是在整个生命周期都会生效的一个时间;

隐式等待的作用域是全局的;

设置隐式等待时间可以作用整个项目中的元素等待,这样有优点也有缺点:

优点:可以保证元素在规定的时间内显示出来,避免了如果页面还没有完全加载定位元素失败的问题;

缺点:如果元素定位写错,会增加整个代码的执行时间;

所以使用的时候,一般建议设置隐式等待时间为3~6秒。如果设置全局的等待时间为3秒,那么有些网站页面中有一些特殊控件,比如注册对话框等等,至少要9秒才能加载出来。针对这种特殊元素 可以设置 显示等待。

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
# 引入显示等待 WebDriverWait 类
from selenium.webdriver.support.ui import WebDriverWait
# 引入显示等待异常 expected_conditions 库 --用 as 取个别名 EC
from selenium.webdriver.support import expected_conditions as EC# 实例化浏览器
driver = webdriver.Edge()
# 网址
my_url = 'https://www.leafground.com/select.xhtml'
# 打开网页
driver.get(my_url)
# 窗口最大化
driver.maximize_window()# 强制等待
# sleep(5)
# ele = driver.find_element(By.ID, 'j_idt87:lang_label')
# print(ele)# 显示等待--等待元素可见
# element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'j_idt87:lang_label')))
# print(element)# 隐式等待--设置隐式等待时间为10秒
driver.implicitly_wait(10)driver.find_element(By.ID, 'j_idt87:city_label')
driver.find_element(By.ID, 'j_idt87:lang_label')# 等待3秒
sleep(3)
# 关闭实例化浏览器
driver.quit()

显示等待和隐式等待的区别:

作用范围:

显示等待仅在特定条件和特定元素上生效,而隐式等待是全局性的,影响 webDriver 实例的每一个定位元素操作;

等待方式:

显示等待基于具体的条件等待,可以更加灵活的等待元素的可见性,而隐式等待是一个全局等待,简单的等到固定的时间,对所有的定位操作都生效;

语法和使用:

显示等待使用 WebDriverWait 和 expected_conditions 类来指定等待条件和超时时间,而隐式等待通过 implicitly_wait 方法设置等待时间;

异常处理:

显示等待使用 try/except 块(异常块)来捕捉 TimeoutException 异常(超时异常,在设置的时间范围内没有找到元素),可以在超时的时候自定义处理逻辑,而隐式等待会在每一个定位元素的时候自动等待指定的时间,不需要显示异常处理。

5、若在以后做框架设计的时候,因为知道某一个元素很慢的话,可以使用显示等待,所以显示等待是用的比较多的;

内联框架(内嵌框架)

掌握 frame、iframe 定位和切入切出;

简介

百度百科快速通道

iframe是 HTML 标签,用于在网页中创建内联框架,支持在当前文档内嵌入另一个独立 HTML 文档或浮动框架。其核心功能是实现页面内容的嵌套与分割,常见于广告加载、第三方插件集成等场景 。

该标签通过定义,需配合属性指定嵌入文档地址。若浏览器不支持,可在标签内添加备用文本以实现兼容。HTML5 新增了等属性以增强安全控制。微软 .NET Framework 的类提供了对标签的服务器端编程访问,例如通过属性设置嵌入路径。

在规范演进中,HTML4.1 Strict DTD 和 XHTML1.0 Strict DTD 未收录该标签。随着 HTML5 标准的推广,iframe 被重新纳入规范并扩展功能属性,成为现代网页开发中跨文档内容嵌入的主流解决方案。

<iframe> 标签规定一个内联框架。

一个内联框架被用来在当前 HTML 文档中嵌入另一个文档。

提示:HTML 与 XHTML 之间的差异:在HTML4.1 Strict DTD和XHTML1.0 Strict DTD中,不支持iframe元素。

示例:

6、 以测试网站 https://www.leafground.com/frame.xhtml 页面中的 内联框架 iframe 为例;

若页面元素在内联框架 iframe 里面,需要先使用 driver.switch_to.frame 切换到内联框架中,然后再去元素定位去操作内联框架中的元素,操作完了之后记得使用 driver.switch_to.default_content() 退出 内联框架 回到最外层;

7、在项目根目录下新建一个名称为 iframe_demo.py 的 Python 文件;

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep# 实例化浏览器
driver = webdriver.Edge()
# 网址
my_url = 'https://www.leafground.com/frame.xhtml'
# 打开网页
driver.get(my_url)
# 窗口最大化
driver.maximize_window()# 通过索引的方式切换到第一个iframe
driver.switch_to.frame(0)# 在定位iframe内嵌框架里面的元素
driver.find_element(By.XPATH, '//*[@id="Click"]').click()# 切换到父窗口(退出内嵌框架)
driver.switch_to.default_content()# 等待3秒
sleep(3)
# 关闭实例化浏览器
driver.quit()

8、在 web 页面中,有时候会使用 <iframe>(内联框架)标签来嵌套另一个 html 文档 ,<iframe> 允许在一个页面中嵌套另一个页面,这样可以实现页面的分隔、划分。

9、注意:<frame>在 HTML5 中已经被废弃,而<iframe>是 HTML 推荐使用的标签,更具有灵活性和兼容性。

未完待续。。。

http://www.dtcms.com/a/456658.html

相关文章:

  • 织梦网站如何做seo重庆市城市建设档案馆官方网站
  • 一文详解Go语言字符串
  • 通用:MySQL-LBCC并发锁机制
  • Elasticsearch:使用推理端点及语义搜索演示
  • 基于websocket的多用户网页五子棋(九)
  • Async++ 源码分析13--parallel_reduce.h
  • 分布式api调用时间优化和问题排查
  • LeetCode每日一题,20251008
  • h5网站建设的具体内容电子商务平台网站模板
  • hive sql优化基础
  • Linux小课堂: Linux 系统的多面性与 CentOS 下载指南
  • 详解redis,MySQL,mongodb以及各自使用场景
  • 开发网站设计公司建设通网站会员共享密码
  • Linux相关工具vim/gcc/g++/gdb/cgdb的使用详解
  • Verilog和FPGA的自学笔记2——点亮LED
  • uniapp创建ts项目tsconfig.json报错的问题
  • Linux性能调优之内核网络栈发包收包认知
  • 静态网站挂马u钙网logo设计影视剪辑
  • Rust 基础语法指南
  • C11 安全字符串转整数函数详解:atoi_s、atol_s、strtol_s 与 strtoimax_s
  • 从入门到实战:全面解析Protobuf的安装配置、语法规范与高级应用——手把手教你用Protobuf实现高效数据序列化与跨语言通信
  • SaaS版MES系统PC端后台功能清单与设计说明
  • 广州建立公司网站多少钱php网站培训机构企业做网站
  • 若依前后端分离版学习笔记(十九)——导入,导出实现流程及图片,文件组件
  • SSM后台投票网站系统9h37l(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 基于springboot高校汉服租赁系统的设计与实现(文末附源码)
  • 【AI大模型】WPS 接入DeepSeek 实战项目详解
  • 12306网站为什么做那么差网站的统计代码是什么意思
  • 第二章 预备知识(线性代数)
  • 建设网站服务器的方式有自营方式山楂树建站公司