三大等待和三大切换

三大等待

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_handlesprint(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/":breakelse:
# 取值切换新的窗口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.mzph.cn/web/76240.shtml

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

相关文章

使用Lombok @Builder 收参报错提示没有无参构造方法的原因与解决办法

使用Lombok Builder 收参报错提示没有无参构造方法的原因与解决办法 类上加了Builder之后接口接收前端传来的参数报错&#xff1a;(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 1.解决办法…

SAP 查找JOB进程ID

如何查找后台JOB的进程ID SM37勾选对于JOB

通过C# 将Excel表格转换为图片(JPG/ PNG)

Excel 表格可能会因为不同设备、不同软件版本或字体缺失等问题&#xff0c;导致格式错乱或数据显示异常。转换为图片后&#xff0c;能确保数据的排版、格式和外观始终保持一致&#xff0c;无论在何种设备或平台上查看&#xff0c;都能呈现出固定的样式&#xff0c;避免了因环境…

Langchain构建RAG对话应用

本文&#xff1a;关注 检索器与上下文的子链、父链&#xff1b;即检索器也需要上下文内容。 RAG是一种增强LLM知识的方法&#xff0c;通过引入额外的数据来实现。 实现思路&#xff1a;加载—》分割—》存储—》检索—》生成。 初始化 import os import bs4 from langchain.c…

关于模拟噪声分析的11个误区

目录 1. 降低电路中的电阻值总是能改善噪声性能 2. 所有噪声源的噪声频谱密度可以相加&#xff0c;带宽可以在最后计算时加以考虑 3. 手工计算时必须包括每一个噪声源 4. 应挑选噪声为ADC 1/10的ADC驱动器 5. 直流耦合电路中必须始终考虑1/f噪声 6. 因为1/f噪声随着频率降…

vue,uniapp解决h5跨域问题

如果有这样的跨域问题&#xff0c;解决办法&#xff1a; ✅ 第一步&#xff1a;在项目根目录下创建 vue.config.js 和 package.json 同级目录。 // vue.config.js module.exports {devServer: {proxy: {/api: {target: https://app.yycjkb.cn, // 你的后端接口地址changeOrig…

SQL通用语法和注释,SQL语句分类(DDL,DML,DQL,DCL)及案例

目录 SQL通用语法和注释 SQL语句分类&#xff08;DDL&#xff0c;DML&#xff0c;DQL&#xff0c;DCL&#xff0c;TPL&#xff0c;CCL&#xff09; DDL&#xff08;数据定义语言&#xff09; 数据库操作 查询&#xff08;SHOW、SELECT&#xff09; 创建&#xff08;CREAT…

Linux:线程概念与控制

✨✨所属专栏&#xff1a;Linux✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ Linux&#xff1a;线程概念于控制 var code “d7e241ae-ed4d-475f-aa3d-8d78f873fdca” 概念 在一个程序里的一个执行路线就叫做线程thread。更准确一点&#xff1a;线程是“一个进程内部的控制序列” …

人脸识别联合行为检测的办公管理新模式

基于人脸识别与行为检测的办公智能化解决方案 一、背景 在传统办公场景中&#xff0c;员工考勤管理、工位使用情况统计、安全监控等环节存在诸多痛点。例如&#xff0c;传统考勤方式如指纹打卡、刷卡等存在代打卡现象&#xff0c;考勤数据不准确&#xff1b;对于员工是否在工…

ceph weight 和 reweight 的区别

ceph osd df ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS0 nvme 6.98630 0.95508 7.0 TiB 5.0 TiB 4.9 TiB 13 GiB 33 GiB 2.0 TiB 71.10 0.96 83 up1 nvme 6.98630

WInform当今技术特性分析

Windows Forms (WinForms) 技术特性分析 引言 Windows Forms (WinForms) 作为微软最早推出的基于.NET的图形用户界面开发框架&#xff0c;已经存在了20多年。在如今充满了各种现代UI框架的软件开发生态系统中&#xff0c;WinForms仍然保持着其独特的地位。本文将深入分析WinF…

Spark rdd算子解析与实践

一、RDD基础回顾 RDD&#xff08;Resilient Distributed Dataset&#xff09; 是Spark的核心抽象&#xff0c;代表一个不可变、分区的分布式数据集合。其核心特性包括&#xff1a; 容错性&#xff1a;通过血缘&#xff08;Lineage&#xff09;记录数据生成过程&#xff0c;支…

sqlite3的API以及命令行

sqlite是目前最流行的嵌入式数据库。 所谓嵌入式&#xff0c;就是足够简单&#xff0c;可以嵌入到我们自己开发的应用程序之中。 在Linux系统中&#xff0c;sqlite的使用只需要使用它的API&#xff0c;连接它的动态连接库&#xff0c;甚至都不用连接&#xff0c;sqlite的实现…

Allure测试报告按测试终端和测试类型智能分类查看

以下是实现Allure测试报告按测试终端和测试类型智能分类的完整方案: 一、测试框架分层设计 # 项目结构 project/ ├── api_tests/ # API测试 │ └── test_order.py ├── app_tests/ # 移动端测试 │ ├── android/ │ └── ios/ ├── pc_te…

Spine-Leaf 与 传统三层架构:全面对比与解析

本文将详细介绍Spine-Leaf架构&#xff0c;深入对比传统三层架构&#xff08;Core、Aggre、Access&#xff09;&#xff0c;并探讨其与Full-mesh网络和软件定义网络&#xff08;SDN&#xff09;的关联。通过通俗易懂的示例和数据中心网络分析&#xff0c;我将帮助您理解Spine-L…

图像预处理-图像噪点消除

一.基本介绍 噪声&#xff1a;指图像中的一些干扰因素&#xff0c;也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。 滤波器&#xff1a;也可以叫做卷积核 - 低通滤波器是模糊&#xff0c;高通滤波器是锐化 - 低通滤波器就…

安卓手机如何改ip地址教程

对于安卓手机用户而言&#xff0c;ip修改用在电商、跨境电商、游戏搬砖、社交软件这些需要开多个账号的项目。因为多个设备或账号又不能在同一ip网络下&#xff0c;所以修改手机的IP地址防检测成为一个必要的操作。以下是在安卓手机上更改IP地址的多种方法及详细步骤&#xff0…

对象池模式在uniapp鸿蒙APP中的深度应用

文章目录 对象池模式在uniapp鸿蒙APP中的深度应用指南一、对象池模式核心概念1.1 什么是对象池模式&#xff1f;1.2 为什么在鸿蒙APP中需要对象池&#xff1f;1.3 性能对比数据 二、uniapp中的对象池完整实现2.1 基础对象池实现2.1.1 核心代码结构2.1.2 在Vue组件中的应用 2.2 …

本地部署大模型实现扫描版PDF文件OCR识别!

在使用大模型处理书籍 PDF 时&#xff0c;有时你会遇到扫描版 PDF&#xff0c;也就是说每一页其实是图像形式。这时&#xff0c;大模型需要先从图片中提取文本&#xff0c;而这就需要借助 OCR&#xff08;光学字符识别&#xff09;技术。 像 Gemini 2.5 这样的强大模型&#x…

《Operating System Concepts》阅读笔记:p700-p732

《Operating System Concepts》学习第 60 天&#xff0c;p700-p732 总结&#xff0c;总计 33 页。 一、技术总结 1.Virtual machine manager (VMM) The computer function that manages the virtual machine; also called a hypervisor. VMM 也称为 hypervisor。 2.types …