三大等待和三大切换

news2025/4/19 20:55:53

三大等待

1、三大等待:等待的方式有三种:强制等待,隐性等待,显性等待。

  • 1、强制等待:time.sleep(2),秒

    • 优点:使用简单
    • 缺点:等待时间把握不准,容易造成时间浪费或者等待时间不足,不灵活
  • 2、智能等待–在指定时间内(最长时间12,15s),什么时候成立,什么时候不等了

    • 2.1、隐形等待:driver.implicitly_wait(“超时时长-秒”)
      条件:等待一个元素被找到。 找元素都是从html当中去找。find_element,在html当中是存在的。
      特征:在一个浏览器会话当中只需要被调用一次,所有的find_element都可以应用。
      如果超时时长以内没有找着元素,就会抛异常:NosuchElementException的找不到元素的异常。
      优点:全局应用,它适用于WebDriver会话期间中所有查找的Web元素(通过findelement方法)
      缺点:它只支持单一条件:元素存在;只能等待元素存在,不能适用条件
      更复杂的情况,如:元素可点击、元素可见
    • 2.2、显性等待:
      注意:条件的参数必须要是元组或者列表的类型的:(元素定位的方法,元素定位表达式)
      WebDriverWait(driver, 超时时间, 轮询周期默认0.5).until(条件) 直到条件成立 ---- 用这个
      WebDriverWait(driver, 超时时间, 轮询周期默认0.5).until_not(条件) 直到条件不成立 -用的少
      局部生效,哪里需要等待哪里就要调用,生效只有一次。
      如果超时时长以内没有找着元素,就会抛异常: TimeoutException,超时异常
      优点:可以设置更加丰富的特定条件
      缺点:仅对指定的元素生效,代码略复杂 【但是后面框架封装之后 封装一次 后面调用】
      presence_of_element_located(元组/列表) :给定的元素存在
      visibility_of_element_located(元组/列表) :给定的元素可见
      element_to_be_clickable(元组/列表) : 给定的元素可点击

2、元素存在/可见/可用的区别: 元素存在< 可见< 可用

  • 元素的存在: 能find_element就可以了。如果存在但不可见,是可以获取元素属性的,但是不能够对元素进行操作。
    元素的可见: 在存在的基础上,元素在页面上大小>0,即在页面上显示出来了 肉眼可见。
    比如百度页面上的设置按钮,鼠标悬浮上去才会显示菜单,那么默认情况下 这个元素是存在但不可见的:
    style=‘display:None’; 不可见,这个元素是存在但是不可见。
    style=‘display:block’ 元素展示出来了,存在并且可见。
    元素的可用:在可见的基础上,能够使用其原始功能,比如可点击,可输入等
    比如按钮可点击即可用,不可点击即不可用。输入框可输入即可用,不可输入即不可用。下拉列表可以选可用

3、find_element和 find_elements

  • find_element — 在页面当中找到匹配的第一个元素。返回的WebElement对象 【就算元素定位的表达式不唯一,也会返回找到第一个元素】
    如果元素表达式能唯一尽量唯一,如果实在没有办法找到唯一的,你也可以使用这个不唯一方法 找到第一个元素。
  • find_elements — 在页面当中,找到匹配的所有元素。返回的列表。列表当中每个成员都是WebElement对象 --万不得已的时候可以用,基本上很少用。

4、WebElement类当中定义常用的方法:

  • send_keys() — 输入 (Keys类定义了键盘上除了26个字母和0-9数字外其它的按键。)
  • click() — 点击操作
    text — 获取元素的文本内容(页面操作之后某些元素的文本发生变化 或者 拿到这个文本用来做断言)
  • get_attribute() — 获取元素的属性值
  • clear() — 清除内容
  • is_displayed() – 元素是否显示 结果为布尔值,可以用来做断言

2、三大切换

元素报错找不到可能的原因有哪些?【F12里可找到这个元素 但是代码执行报错】
1)页面需要加一些等待
2)窗口切换
3)iframe子页面
4)页面有弹框

  • 1、窗口切换
  • 当我们点击了 a 标签元素(超链接)时,会触发打开链接页面的事件,有两种
    情形:
    1、在当前窗口加载新页面内容
    2、新建一个窗口加载新页面内容,这种情况在 a 标签有
    target=“_blank” 时触发。
    当发生第2种情况时,我们需要切换窗口。在新的窗口里定位元素。
    在这里插入图片描述

切换的步骤:
1)执行打开新窗口的操作
2)获取现在所有的窗口句柄。
窗口列表 : wins = driver.window_handles ,结果是个列表,最新的
窗口在列表的最后。
新打开的窗口追加在窗口列表末尾。
通过索引进行选择: wins[-1]获取最新的窗口
3)切换到最新窗口:driver.switch_to.window(窗口列表[-1])
切换窗口-参数windowname(窗口的名字 也就是窗口句柄)
需要注意,窗口的句柄并不是固定的,而是由浏览器分配的,类似
于进程号: 窗口句柄是唯一,但是并不固定 ,所以不能直接写死进
行切换。
需要通过获取到所有句柄后的列表 取值

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver  = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
x_wait_click =(By.XPATH, '//a[contains(text(),"新闻")]')
WebDriverWait(driver, 5, 0.5).until(EC.element_to_be_clickable(x_wait_click)).click()
#打开新的tab页,打开新闻的页面
#第一步:获取所有的窗口的句柄

wins = driver.window_handles

print(wins[-1])
# 第二步:取值切换新的窗口
driver.switch_to.window(wins[-1])
#//input[@id="ww"]
ww = (By.XPATH,'//input[@id="ww"]')
WebDriverWait(driver,10,1).until(EC.visibility_of_element_located(ww)).send_keys("中国")

time.sleep(2)
driver.quit()
  • 2、多窗口切换:
'''
打开新的tab页,打开新闻的页面
第一步:获取所有的窗口的句柄


import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver  = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
news =(By.XPATH, '//a[contains(text(),"新闻")]')
map = (By.XPATH,'//a[contains(text(),"地图")]')
post_par = (By.XPATH,'//a[contains(text(),"贴吧")]')
WebDriverWait(driver, 5, 0.5).until(EC.element_to_be_clickable(news)).click()
WebDriverWait(driver, 5, 0.5).until(EC.element_to_be_clickable(map)).click()
WebDriverWait(driver, 5, 0.5).until(EC.element_to_be_clickable(post_par)).click()
#打开新的tab页,打开新闻的页面
#第一步:获取所有的窗口的句柄

wins = driver.window_handles
print(driver.current_url)
print(wins)
ww = (By.XPATH,'//input[@id="ww"]')
for i in wins:
    if driver.current_url =="https://news.baidu.com/":
        break
    else:
# 取值切换新的窗口
        driver.switch_to.window(i)
WebDriverWait(driver,10,0.5).until(EC.visibility_of_element_located(ww)).send_keys("中国")

time.sleep(2)
driver.quit()
  • 2、iframe切换

      1. iframe是什么?
      • iframe里面放的是另外一个html页面。页面嵌套
        driver.find_element的时候,只在当前所在的html当中找元素,不可以
        跨html的。所以,如果我们要操作iframe当中html里的元素,那么必须先切换到iframe当
        中的html当中去
    • 2.如何确认页面是否有iframe的步骤:

      • 第一个就是:明确元素定位正确且等待到位,依然找不到元素,那么有可能就是在iframe当中。
        第二个就是:在元素定位的时候,查看上方的绝对路径链接,如果其中有2个html,说明在iframe当中
    • 3、iframe切换的方法:driver.switch_to.frame(有2种方式)

      • 第一种:通过iframe元素的name或者id属性切换: 【QQ空间案例】
        driver.switch_to.frame(“login_frame”)
        注意: 如果id是变化的,也是不可以用于定位的,要换定位方法进
        行定位; 如何确认是变化的,有数字+刷新确认。| 没有id和name
        属性,也需要换方法定位并切换。
        第二种:识别你要操作的元素是不是在iframe当中 【126.com案例】
        在这里插入图片描述
    • 4、iframe退出

      • 退出iframe
        切到子页面里,有时候需要退回到主页面里定位,就需要退出iframe:
        driver.switch_to.default_content() — 跳出iframe,回到默认的html当
        中。如果有多层页面嵌套,一下回到最外层页面。
        driver.switch_to.parent_frame() : 回到父级页面中,只能一级一级的
        跳出
        注意:一个主页面可能会存在多个iframe子页面,要进去另外一个
        iframe,就需要先退出 再进去另外一个。
  • 3、弹框切换

    • 弹窗切换【alert(警告消息框),confirm(确认消息框),prompt(提示消息对话框) 】

    • 如果页面发生了弹窗,要点击弹窗元素,也要进行弹窗切换,不然定位不到元素。
      弹窗有三种不同类型:alert(警告消息框)、confirm(确认消息框)、prompt(提示消息对话框)
      通过switch_to.alert()切换到弹窗
      再使用accept、dismiss、send_keys、text方法进行操作
      1)alert弹框: 本质上是js的弹框 ,需要切换后将它关掉。 ==最常见 优先掌握
      弹框出现后,要点击确认,才会消失。操作:
      accept(): 点击确定
      text: 获取弹框文本
      2)confirm(确认消息框): 确认和取消两个选项,可以有如下操作:
      dismiss(): 点击取消
      accept(): 点击确定
      text: 获取弹框文本
      3)prompt(提示消息对话框),可以输入内容。 有如下四种操作:
      dismiss(): 点击取消
      accept(): 点击确定
      text: 获取框中的文本
      send_keys(): 输入文本
      注意: prompt输入文本,chrome浏览器不支持,Firefox支持,chrome浏览器的驱动bug

    • 4、如果元素定位不到,有哪些原因?【no suchelement 如何排查】

      • 1、检查我们的元素定位表达式是否写错,可以F12搜索验证
        2、检查是否是需要加等待: 智能等待+ 强制登录结合使用
        3、检查是否元素在iframe中,如果是的话就需要切换iframe
        4、检查元素是否在新的窗口中,如果是的话我们就需要切换窗口
        5、检查是否有弹框,需要点掉弹框再去定位;
        6、是否元素不可见,先移动鼠标或者其他操作让你可见后再操作 – 操作鼠标
        7、是否无法直接操作,可以通过js 点击 或者键鼠操作等。 – js点击 后面会讲

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

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

相关文章

告别定时任务!用Dagster监听器实现秒级数据响应自动化

在数据管道开发中&#xff0c;我们经常面临需要根据外部事件触发计算任务的场景。传统基于时间的调度方式存在资源浪费和时效性不足的问题。本文将通过Dagster的**传感器&#xff08;Sensor&#xff09;**功能&#xff0c;演示如何构建事件驱动的数据处理流程。 场景模拟&…

【Unity】打包TextMeshPro的字体

前言 在Unity中&#xff0c;TextMeshPro与常规 Text 组件相比提供了更高级的文本呈现功能&#xff0c;TextMesh Pro 可以处理各种语言&#xff0c;包括中文。我们可以轻松地在 Unity 项目中使用中文&#xff0c;而不必担心字体和布局问题。TextMeshPro需要的字体资源就需要我们…

51单片机实验五:A/D和D/A转换

一、实验环境与实验器材 环境&#xff1a;Keli&#xff0c;STC-ISP烧写软件,Proteus. 器材&#xff1a;TX-1C单片机&#xff08;STC89C52RC&#xff09;、电脑。 二、 实验内容及实验步骤 1.A/D转换 概念&#xff1a;模数转换是将连续的模拟信号转换为离散的数字信…

使用VHD虚拟磁盘安装双系统,避免磁盘分区

前言 很多时候&#xff0c;我们对现在的操作系统不满意,就想要自己安装一个双系统 但是安装双系统又涉及到硬盘分区,非常复杂,容易造成数据问题 虚拟机的话有经常用的不爽,这里其实有一个介于虚拟机和双系统之间的解决方法,就是使用虚拟硬盘文件安装系统. 相当于系统在机上…

Kafka消费者端重平衡流程

重平衡的完整流程需要消费者 端和协调者组件共同参与才能完成。我们先从消费者的视角来审视一下重平衡的流程。在消费者端&#xff0c;重平衡分为两个步骤&#xff1a;分别是加入组和等待领导者消费者&#xff08;Leader Consumer&#xff09;分配方案。这两个步骤分别对应两类…

Django之modelform使用

Django新增修改数据功能优化 目录 1.新增数据功能优化 2.修改数据功能优化 在我们做数据优化处理之前, 我们先回顾下传统的写法, 是如何实现增加修改的。 我们需要在templates里面新建前端的页面, 需要有新增还要删除, 比如说员工数据的新增, 那需要有很多个输入框, 那html…

云轴科技ZStack入选中国人工智能产业发展联盟《大模型应用交付供应商名录》

2025年4月8日至9日&#xff0c;中国人工智能产业发展联盟&#xff08;以下简称AIIA&#xff09;第十四次全体会议暨人工智能赋能新型工业化深度行&#xff08;南京站&#xff09;在南京召开。工业和信息化部科技司副司长杜广达&#xff0c;中国信息通信研究院院长、中国人工智能…

写论文时降AIGC和降重的一些注意事项

‘ 写一些研究成果&#xff0c;英文不是很好&#xff0c;用有道翻译过来句子很简单&#xff0c;句型很单一。那么你会考虑用ai吗&#xff1f; 如果语句太正式&#xff0c;高级&#xff0c;会被误判成aigc &#xff0c;慎重选择ai润色。 有的话就算没有用ai生成&#xff0c;但…

AI 编程工具—如何在 Cursor 中集成使用 MCP工具

AI 编程工具—如何在 Cursor 中集成使用 MCP工具 这里我们给出了常用的MCP 聚合工具,也就是我们可以在这些网站找MCP服务 这是一个MCP Server共享平台,用户可以在上面发布和下载MCP Server配置。在这里可以选择你需要的MCP 服务。 如果你不知道你的mcp 对应的server 名称也不…

《软件设计师》复习笔记(12.2)——成本管理、配置管理

目录 一、项目成本管理 1. 定义 2. 主要过程 3. 成本类型 4. 其他概念 真题示例&#xff1a; 二、软件配置管理 1. 定义 2. 主要活动 3. 配置项 4. 基线&#xff08;Baseline&#xff09; 5. 配置库类型 真题示例&#xff1a; 一、项目成本管理 1. 定义 在批准…

Spring 中的 @Cacheable 缓存注解

1 什么是缓存 第一个问题&#xff0c;首先要搞明白什么是缓存&#xff0c;缓存的意义是什么。 对于普通业务&#xff0c;如果要查询一个数据&#xff0c;一般直接select数据库进行查找。但是在高流量的情况下&#xff0c;直接查找数据库就会成为性能的瓶颈。因为数据库查找的…

settimeout和setinterval区别

1. setTimeout&#xff1a;单次延迟执行 语法&#xff1a; const timeoutId setTimeout(callback, delay, arg1, arg2, ...); 核心功能&#xff1a;在指定的 delay&#xff08;毫秒&#xff09;后&#xff0c;执行一次 callback 函数。 参数&#xff1a; callback&#x…

Kaamel隐私与安全分析报告:Microsoft Recall功能评估与风险控制

本报告对Microsoft最新推出的Recall功能进行了全面隐私与安全分析。Recall是Windows 11 Copilot电脑的专属AI功能&#xff0c;允许用户以自然语言搜索曾在电脑上查看过的内容。该功能在初次发布时因严重隐私和安全问题而备受争议&#xff0c;后经微软全面重新设计。我们的分析表…

Thymeleaf简介

在Java中&#xff0c;模板引擎可以帮助生成文本输出。常见的模板引擎包括FreeMarker、Velocity和Thymeleaf等 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎。 Thymeleaf 和 JSP比较&#xff1a; Thymeleaf目前所作的工作和JSP有相似之处&#xff0c;Thyme…

o3和o4-mini的升级有哪些亮点?

ChatGPT是基于OpenAI GPT系列的高性能对话生成AI&#xff0c;经过多代迭代不断提升自然语言理解和生成能力。 在过去的一年中&#xff0c;OpenAI先后发布了GPT-4、GPT‑4.1及多种mini版本&#xff0c;为不同使用场景提供灵活选择。​ 随着用户需求向更高效、更精准的推理和视觉…

MATLAB 控制系统设计与仿真 - 36

鲁棒工具箱定义了个新的对象类ureal,可以定义在某个区间内可变的变量。 函数的调用格式为&#xff1a; p ureal(name,nominalvalue) % name为变量名,nominalValue为标称值&#xff0c;默认变化值为/-1 p ureal(name,nominalvalue,PlusMinus,plusminus) p ureal(name,nomin…

Spring数据访问全解析:ORM整合与JDBC高效实践

目录 一、Spring ORM集成深度剖析 &#x1f31f; ORM模块架构设计 核心集成特性&#xff1a; 整合MyBatis示例配置&#xff1a; 二、Spring JDBC高效实践指南 &#x1f31f; 传统JDBC vs Spring JDBC对比 &#x1f31f; JdbcTemplate核心操作示例 批量操作优化&#xf…

【HCIA】使用Access port实现简易的VLAN间通信

前言 当我们拥有一台三层交换机与两个vlan&#xff0c;我们可以使用简易的Vlanif配置实现VLAN间通信。 文章目录 前言1. 拓扑图2. 配置交换机3. 配置PC1与PC2的网络4. port link-type后记修改记录 1. 拓扑图 2. 配置交换机 <Huawei>system-view [Huawei]undo info-cent…

6.VTK 颜色

文章目录 概念RGB示例HSV示例 概念 RGB颜色系统&#xff1a;通过红(R)、绿(G)、蓝(B)三个颜色分量的组合来定义颜色。每个分量的取值范围是0到1&#xff0c;其中(0, 0, 0)代表黑色&#xff0c;而(1, 1, 1)代表白色。可以使用vtkProperty::SetColor(r, g, b)方法为Actor设置颜色…

shiro使用

shiro是apache提供的一种安全框架。他可以将登录&#xff0c;权限这一方面简单化。 使用shiro需要引入 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.9.0</version></depend…