首页 > 其他分享 >等待机制

等待机制

时间:2022-12-23 13:33:27浏览次数:21  
标签:webdriver selenium driver element import 机制 等待

为什么需要等待

 

当进行自动化测试的时候:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("听雨危楼-cnblogs")
driver.find_element_by_id("su").click()
# import time
# time.sleep(3)
driver.find_element_by_link_text("听雨危楼 - 博客园").click()
driver.quit()

上述代码如果不睡几秒的话,很可能会报如下报错:

selenium.common.exceptions.NoSuchElementException

没有找到标签元素,当然,可能原因是找错了标签,但很可能是这个标签由于网速等原因迟迟没有加载出来,你就直接获取这个标签,很明显是报错,现有的简单粗暴的解决办法就是​​time.sleep(3)​​,睡几秒,也就是设置线程等待,等这个标签加载出来之后,再去使用。这么着虽然简单,但是相对死板,因为我们不知道这个标签什么时候加载出来,就大概写死睡个几秒,这可以,但如果这个标签在极短的时间内就加载出来了,而你还在睡.......

所以,我们可以使用selenium提供的两种等待机制:

  • 显式等待
  • 隐式等待

先来看显式等待机制。

显式等待机制

 

上面程序解决报错使用了time模块完成,现在,我们使用selenium的等待机制来完成:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("听雨危楼-cnblogs")
driver.find_element_by_id("su").click()
# driver.find_element_by_link_text("听雨危楼 - 博客园").click()
# 没错,就是下面这行代码
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located((By.LINK_TEXT, '听雨危楼 - 博客园'))).click()
driver.quit()

​selenium​​​提供了 ​​WebDriverWait​​类实现等待机制。该类接收4个参数来指定等待机制。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Chrome()
WebDriverWait(driver=driver, timeout=10, poll_frequency=0.5, ignored_exceptions=None)

各参数:

  • driver,浏览器驱动
  • timeout,最长超时时间,单位(秒)
  • poll_frequency,轮询检测时间,也就是每隔多少时间检测一次,默认是0.5秒
  • ignored_exceptions,超时后的异常信息,默认抛出​​NoSuchElementException​

​WebDriverWait​​类提供了两个方法来完成等待机制:

  • until(self, method, message=''),method为需要提供的驱动程序,直到返回True,用的较多。
  • until_not(self, method, message=''),method为需要提供的驱动程序,直到返回False

上面用到的method驱动程序为​​expected_conditions​​​重命名后的​​EC​​​,并调用其​​presence_of_element_located​​​方法判断指定元素是否存在。
​​​expected_conditions​​模块提供了各种判断:

  • ​presence_of_element_located​​判断某个元素是否被加到了dom树里,并不代表该元素一定可见
  • ​presence_of_elements_located​​ 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True

显式等待的另一种写法,首先实例化一个显式等待对象,这样可以在各个地方灵活的调用:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10, 0.5) # 首先实例化一个定制好等待机制的等待对象
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("听雨危楼-cnblogs")
driver.find_element_by_id("su").click()
# WebDriverWait(driver=driver, timeout=10, poll_frequency=0.5, ignored_exceptions=None).until(EC.presence_of_element_located((By.LINK_TEXT, '听雨危楼 - 博客园'))).click()
wait.until(EC.presence_of_element_located((By.LINK_TEXT, '听雨危楼 - 博客园'))).click()
driver.quit()

一般的,推荐上述这种方式,比较灵活嘛。

隐式等待机制

 

与显式等待不同的是,隐式等待我们可以直接通过浏览器驱动对象调用,并且用法也相对简单:

from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(time_to_wait=10) # 只需要一个等待超时时间参数
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("听雨危楼-cnblogs")
driver.find_element_by_id("su").click()
driver.find_element_by_link_text('听雨危楼 - 博客园').click()
driver.quit()

​implicitly_wait​​​等待时间单位为秒,如上例所示,我们指定了10秒。需要注意的是,隐式与显式等待有明显的区别,隐式等待应用于全局,每当使用​​driver​​​驱动找某个元素时,隐式等待机制就会被触发(导致测试速度变慢),如果元素存在,则继续执行,否则,它将以轮询的方式判断元素是否定位成功,直至等待超时,抛出错误​​NoSuchElementException​​。而显式等待则只是指定某(些)个元素是否存在时执行。

休眠机制

 

最后,使用Python提供的休眠机制(也就是time模块啦),这没啥可说的,睡就完了,想在哪等就在哪等.......

import time

time.sleep(1)

在等待机制的选择上,我们可以在三种等待机制中灵活选择:

  • 普通(静态页面较多)网页,休眠机制和显式等待机制可以相互搭配,提高效率。
  • 动态页面较多的时候,隐式等待就排上用场了。当然,懒人法则就用隐式等待。一劳永逸.....




为什么需要等待

 

当进行自动化测试的时候:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("听雨危楼-cnblogs")
driver.find_element_by_id("su").click()
# import time
# time.sleep(3)
driver.find_element_by_link_text("听雨危楼 - 博客园").click()
driver.quit()

上述代码如果不睡几秒的话,很可能会报如下报错:

selenium.common.exceptions.NoSuchElementException

没有找到标签元素,当然,可能原因是找错了标签,但很可能是这个标签由于网速等原因迟迟没有加载出来,你就直接获取这个标签,很明显是报错,现有的简单粗暴的解决办法就是​​time.sleep(3)​​,睡几秒,也就是设置线程等待,等这个标签加载出来之后,再去使用。这么着虽然简单,但是相对死板,因为我们不知道这个标签什么时候加载出来,就大概写死睡个几秒,这可以,但如果这个标签在极短的时间内就加载出来了,而你还在睡.......

所以,我们可以使用selenium提供的两种等待机制:

  • 显式等待
  • 隐式等待

先来看显式等待机制。

显式等待机制

 

上面程序解决报错使用了time模块完成,现在,我们使用selenium的等待机制来完成:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("听雨危楼-cnblogs")
driver.find_element_by_id("su").click()
# driver.find_element_by_link_text("听雨危楼 - 博客园").click()
# 没错,就是下面这行代码
WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located((By.LINK_TEXT, '听雨危楼 - 博客园'))).click()
driver.quit()

​selenium​​​提供了 ​​WebDriverWait​​类实现等待机制。该类接收4个参数来指定等待机制。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Chrome()
WebDriverWait(driver=driver, timeout=10, poll_frequency=0.5, ignored_exceptions=None)

各参数:

  • driver,浏览器驱动
  • timeout,最长超时时间,单位(秒)
  • poll_frequency,轮询检测时间,也就是每隔多少时间检测一次,默认是0.5秒
  • ignored_exceptions,超时后的异常信息,默认抛出​​NoSuchElementException​

​WebDriverWait​​类提供了两个方法来完成等待机制:

  • until(self, method, message=''),method为需要提供的驱动程序,直到返回True,用的较多。
  • until_not(self, method, message=''),method为需要提供的驱动程序,直到返回False

上面用到的method驱动程序为​​expected_conditions​​​重命名后的​​EC​​​,并调用其​​presence_of_element_located​​​方法判断指定元素是否存在。
​​​expected_conditions​​模块提供了各种判断:

  • ​presence_of_element_located​​判断某个元素是否被加到了dom树里,并不代表该元素一定可见
  • ​presence_of_elements_located​​ 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True

显式等待的另一种写法,首先实例化一个显式等待对象,这样可以在各个地方灵活的调用:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10, 0.5) # 首先实例化一个定制好等待机制的等待对象
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("听雨危楼-cnblogs")
driver.find_element_by_id("su").click()
# WebDriverWait(driver=driver, timeout=10, poll_frequency=0.5, ignored_exceptions=None).until(EC.presence_of_element_located((By.LINK_TEXT, '听雨危楼 - 博客园'))).click()
wait.until(EC.presence_of_element_located((By.LINK_TEXT, '听雨危楼 - 博客园'))).click()
driver.quit()

一般的,推荐上述这种方式,比较灵活嘛。

隐式等待机制

 

与显式等待不同的是,隐式等待我们可以直接通过浏览器驱动对象调用,并且用法也相对简单:

from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(time_to_wait=10) # 只需要一个等待超时时间参数
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("听雨危楼-cnblogs")
driver.find_element_by_id("su").click()
driver.find_element_by_link_text('听雨危楼 - 博客园').click()
driver.quit()

​implicitly_wait​​​等待时间单位为秒,如上例所示,我们指定了10秒。需要注意的是,隐式与显式等待有明显的区别,隐式等待应用于全局,每当使用​​driver​​​驱动找某个元素时,隐式等待机制就会被触发(导致测试速度变慢),如果元素存在,则继续执行,否则,它将以轮询的方式判断元素是否定位成功,直至等待超时,抛出错误​​NoSuchElementException​​。而显式等待则只是指定某(些)个元素是否存在时执行。

休眠机制

 

最后,使用Python提供的休眠机制(也就是time模块啦),这没啥可说的,睡就完了,想在哪等就在哪等.......

import time

time.sleep(1)

在等待机制的选择上,我们可以在三种等待机制中灵活选择:

  • 普通(静态页面较多)网页,休眠机制和显式等待机制可以相互搭配,提高效率。
  • 动态页面较多的时候,隐式等待就排上用场了。当然,懒人法则就用隐式等待。一劳永逸.....

标签:webdriver,selenium,driver,element,import,机制,等待
From: https://blog.51cto.com/u_15920572/5965404

相关文章

  • Java 的垃圾回收机制的题目
    Java语言中垃圾回收的优点和原理,并考虑2种回收机制。  答案:Java语言中一个显著的特点就是引入了垃圾回收机制,使C++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序......
  • MySQL锁机制
    1.表级锁&行级锁数据库中的锁通常分为两种:表级锁:对整张表加锁。开销小,加锁快,不会出现死锁。但是锁的粒度大,发生锁冲突的概率高,并发度低。行级锁:对某行记录加锁。开销大......
  • 中文语法纠错全国大赛获奖分享:基于多轮机制的中文语法纠错
    中文语法纠错任务旨在对文本中存在的拼写、语法等错误进行自动检测和纠正,是自然语言处理领域一项重要的任务。同时该任务在公文、新闻和教育等领域都有着落地的应用价值。但......
  • yarn运行机制
    yarn运行机制    yarn通过管理集群资源使用的资源管理器和运行在集群节点上启动、监控容器的节点管理器两类长期运行的守护进程提供核心服务。提到的容器是用于执行......
  • Vue、angular等框架实现双向绑定的原理,核心机制是使用了Object.defineProperty
    <divid="name"></div>varobj={};Object.defineProperty(obj,"name",{set:newVal=>(document.querySelector("#name").innerHTML=newVal)});obj.name="修改后,内......
  • workqueue机制
    软硬件协同设计是未来发展的主流,软硬件的界限越来越模糊,软硬件的设计思想是相通的,实现方法是各异的,实现的结果上当然也存在较大差别,因此,很有必要做好软硬件的协同设计。什......
  • 【源码透视】SpringBoot的SPI机制
    一、从java类加载机制说起java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器BootstrapCla......
  • KingbaseES V8R6 空闲事务会话超时自动终止机制
    背景如果会话在事务中停留的时间过长,则允许自动终止空闲会话。可以由配置参数idle_in_transaction_session_timeout事务处于空闲状态的时长,它有助于防止被遗忘的交易事务......
  • 【源码透视】SpringBoot的SPI机制
    一、从java类加载机制说起java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器BootstrapCl......
  • .NET Core如何通过认证机制访问Kafka?
    大家好,我是Edison。最近有一个ASP.NETCore使用认证机制访问Kafka的需求,加之我们又使用了CAP这个开源项目使用的Kafka,于是网上寻找了一番发现对应资料太少,于是调查了一番,......