Python3 selenium 设置元素等待的三种方法

news/2024/7/7 19:14:42

为什么要设置元素等待?
当你的网络慢的时候,打开网页慢,网页都没完全打开,代码已经在执行了,但是没找到你定位的元素,此时python会报错。
当你的浏览器或电脑反应慢,网页没完全打开,代码已经在执行了,但是没找到你定位的元素,此时python也会报错。
由于代码执行很快,而由于各方面的原因导致python代码报错,所以才要设置元素等待。是根据你的网速或电脑的情况而定来设置等待时间,没有一成不变的设置,这个需要注意。

1.sleep 强制等待
代码如下:

from selenium import webdriver
from time import sleep
dr = webdriver.Chrome()
sleep(2)        #设置等待2秒钟
dr.get('http://www.baidu.com')

优点:代码简洁,不啰嗦。
缺点:假如你设置sleep等待时间太短,元素没加载出来,程序照样报错。倘若你设置sleep等待时间设置太长,元素可能已经加载出来了,但是由于你设置过长,程序会一直等待你设置的时间过完才执行,这样会影响代码整体的运行效率。

2.implicitly_wait() 隐性等待
代码如下:

from selenium import webdriver
from time import sleep
dr = webdriver.Chrome()
dr.implicitly_wait(20)  #设置等待20秒钟
dr.get('http://www.baidu.com')
dr.find_element_by_id('kw').send_keys('shawn')
dr.find_element_by_id('su').click()

优点:
1.代码简洁。
2.在代码前部分加implicitly_wait() ,整个的程序运行过程中都会有效,都会等待元素加载完成,不需要像sleep一样每次要设置一遍。
3.在设置的时间内没有加载到整个页面,则会报NosuchElementError。如果元素在第20s被加载出来,自动执行下面的脚本,不会一直等待20s。

缺点:非要加载到整个页面才执行代码,这样影响代码的执行效率。一般情况下,我们想要的结果是只需加载到了我要定位的元素就执行代码,不需要等待整个页面的完全加载出来再执行代码。

3.WebDriverWait() 显示等待

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait       #WebDriverWait注意大小写
from selenium.webdriver.common.by import By
dr = webdriver.Chrome()
dr.get('http://www.baidu.com')
try:
    element = WebDriverWait(dr,10).until(EC.presence_of_element_located((By.ID,'kw')))
    element.send_keys('123')
    dr.find_element_by_id('su').click()
except Exception as message:
    print('元素定位报错%s'%message)
finally:
    pass

优点:代码执行效率快。无需等待整个页面加载完成,只需加载到你要定位的元素就可以执行代码。是最智能的设置元素等待的方式。

缺点:
1.要导入from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
必须要导入以上3个包,导包路径相当的复杂,啰嗦而且麻烦
2.写等待时间的代码也是复杂。步骤稍微有点多。
element=WebDriverWait(dr,10).until(EC.presence_of_element_located((By.ID,‘kw’)))
element.send_keys(‘123’)

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】


http://lihuaxi.xjx100.cn/news/1840436.html

相关文章

博捷芯打破半导体切割划片设备技术垄断,国产产业链实现高端突破

近日,国内半导体产业传来喜讯,博捷芯成功实现批量供货半导体切割划片设备,打破国外企业在该领域的长期技术垄断,为国产半导体产业链在高端切割划片设备领域实现重大突破。 自上世纪90年代以来,由于国外企业的技术封锁和…

在Linux中部署MeterSphere并且结合内网穿透实现远程访问本地管理页面——“cpolar内网穿透”

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

MySQL学习day03

一、SQL图形化界面工具 常用比较常用的图形化界面有sqlyog、mavicat、datagrip datagrip工具使用相当方便,功能比前面两种都要强大。 DataGrip工具的安装和使用请查看这篇文档:DataGrip 安装教程 DML-介绍 DML全称是Data Manipulation Language(数据…

UE4/UE5 雾

雾 UE4/UE5 雾平面雾材质效果图: 3D雾区材质效果图: UE4/UE5 雾 平面雾 做好将材质放在Plane上就行 材质 效果图: 3D雾区 做好将材质放在3D模型上就行 材质 效果图:

R语言阶段复习一

创建一个长度为7的字符向量,元素为"A", "B", "C", "D", "E", "F", "G",并命名为vec1。 创建一个因子,包含6个水果:"apple", "banana"…

【Linux】初识重定向(输入输出)

一切皆文件 这是Linux的设计理念,因为这个理念的存在我们可以使用统一的方法对待不同的东西,,这也是为什么嵌入式之类的会需要Linux,因为用LInux来操纵硬件真的很方便 另外我们下文也会都基于这个理念来命名, 比如&am…

【STM32】GPIO输入

1 GPIO输出 1.1 按键简介 按键:常见的输入设备,按下导通,松手断开 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动 1.2 传感器模块简介 传感器模块&#xff…

电量计驱动代码

外部电量计驱动代码,直接上代码了,懒,不做细节分析。。。。。 /** Fuelgauge battery driver** This package is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License version 2 as* published by the Free Soft…