首页 > 其他分享 >webdriver 的三种等待方式(强制等待、隐式等待、显示等待)

webdriver 的三种等待方式(强制等待、隐式等待、显示等待)

时间:2023-08-14 19:13:31浏览次数:40  
标签:webdriver 10 driver until 等待 隐式

在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,对于元素的定位是有一定的超时时间,大致应该在1-3秒的样子,如果这个时间内仍然定位不到元素,就会抛出异常,中止脚本执行。我们可以通过在脚本中设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种:

一、强制等待

强制等待是利用python语言自带的time库中的sleep()方法:

from time import sleep
sleep(10)

sleep()顾明思义就是睡觉的意思,就是脚本一旦执行到条语句sleep(10)就睡10s,再执行后面的语句,他是一个强制等待的方式,使得整个脚本暂停。但是这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用,特殊情况下,时间设置最好不超过1秒,一般0.5秒。

二、隐式等待

隐式等待相比强制等待更智能,顾明思义,在脚本中我们一般看不到等待语句,但是它会在每个页面加载的时候自动等待;隐式等待只需要声明一次,一般在打开浏览器后进行声明。声明之后对整个drvier的生命周期都有效,后面不用重复声明。

driver = webdriver.Chrome()
driver.implicitly_wait(10)

implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完),implicitly_wait(10),超时时间10s,10秒内一旦加载完成,就执行下一条语句;如果10秒内页面都没有加载完,就超时抛出异常。隐式等待在自动化测试中的运用,看代码:

from selenium import webdriver
import unittest
 
class TestBase(unittest.TestCase):
  def setUp(self):
    self.driver=webdriver.Chrome() #驱动浏览器
    self.driver.implicitly_wait(10) #设置隐式等待
    self.driver.maximize_window() #最大化浏览器
  def test(self): 
    print('这是一个测试用例')
  def tearDown(self):
    self.driver.quit()
if __name__=='__main__':
  unittest.main()

但是隐式等待依然存在一个问题,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步。所以,这里webdriver提供了一种更加智能的等待方式:显示等待

三、显示等待

显示等待与隐式等待相对,显示等待必须在每个需要等待的元素前面进行声明。

#引入WebDriverWait
from selenium.webdriver.support.ui import WebDriverWait
#引入expected_conditions类,并重命名为EC
from selenium.webdriver.support expected_conditions as EC
#引入By类
from selenium.webdriver.common.by import By
# Python小白学习交流群:711312441
#设置等待
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.ID,'KW')))

显示等待需要用到两个类:

WebDriverWait和expected_conditions两个类。

1、WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver:浏览器驱动

timeout:最长超时时间,默认以秒为单位

poll_frequency:检测的间隔步长,默认为0.5s

ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

WebDriverWait()中的until()和until_not()方法:

  • until

method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常

  • until_not

与until相反,until是当某元素出现或什么条件成立则继续执行,
until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。

2、expected_conditions类

各种类,达到某种条件,返回True和False

常用条件:

条件 说明
presence_of_element_located 判断某个元素是否被加到了DOM树里,并不代表该元素一定可见
visibility_of_element_located 判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0

关于显示等待,也可以自己写条件:

#设置等待
wait = WebDriverWait(driver,10,0.5)
#使用匿名函数
wait.until(lambda diver:driver.find_element_by_id('kw'))

显示等待是一种智能程度较高的等待方式,可以有效的增强脚本的健壮性,以下条件适用:

当打开一个新页面,执行第一个元素操作的时候
当某一步操作会引发页面的加载,并且加载的内容包含了下一步需要操作的元素。一句话,就是当某个元素有加载过程的时候,就需要加上显示等待。

标签:webdriver,10,driver,until,等待,隐式
From: https://www.cnblogs.com/djdjdj123/p/17629488.html

相关文章

  • 长时间等待代理隧道响应的有效解决办法
    作为一名专业爬虫代理,我深知在使用代理时可能会遇到代理隧道长时间等待响应的情况。这种情况极大地妨碍了爬虫程序的效率和稳定性。在本文中,我将分享一些有效的解决办法,帮助你解决长时间等待代理隧道响应的问题,并提升你的爬虫程序效果。问题分析:为什么会出现长时间等待代理隧道响应......
  • jQuery隐式迭代
      ......
  • Qt 隐式共享
    Qt中的许多c++类使用隐式数据共享来最大化资源使用并最小化复制。隐式共享类作为参数传递时既安全又高效,因为只传递指向数据的指针,并且只有当函数写入数据时才会复制数据,即写时复制。 概述共享类由指向包含引用计数和数据的共享数据块的指针组成。 当创建共享对象时,它将引......
  • 无锁和无等待的定义和例子
    在查阅google之后,我发现没有一处对并发算法或是数据结构规定的演进条件(progresscondition,注:参考[1],译者认为翻译为演进状态更为合适)做合理的解释。甚至在”TheArtofMultiprocessorProgramming“中也只有围绕书本的一小段定义,大部分定义是单行的句子,因而造成了我们普通人含义模......
  • 显示锁,隐式锁 (管程、monitor 、操作系统)
    无锁时并发出问题importjava.util.*;/***无锁*@authorwitas**/publicclassBank{publicstaticvoidmain(String[]args){finalintNACCOUNTS=100;finaldoubleINITIAL_BALANCE=1000;finaldouble......
  • ios自动化-Xcode、WebDriverAgent环境部署
    环境准备:Mac电脑一台(更新到最新的macOS,此文档使用的为macOS12.3.1,Intel芯片)Xcode最新稳定版(此文档使用的为13.4.1)IOS设备(此文档使用了10.3.3-15.1均有,且都安装WebDriverAgent成功)保证自己电脑有大于25G的可用内存空间,Xcode很大!Xcode下载https://developer.apple.com/xcode/r......
  • 封装获取chrome和ie的webdriver
    importtimefromseleniumimportwebdriverfromselenium.webdriver.chrome.serviceimportServiceasChromeServicefromwebdriver_manager.chromeimportChromeDriverManagerfromselenium.webdriver.ie.serviceimportServiceasIEServicefromwebdriver_manag......
  • webdriver 自动化测试
    Selenium是最流行的自动化测试工具,提供一整套的解决方案,其中webdriverremote方式比较灵活,浏览器可以指定本地或远程。部署也简单,在浏览器端运行java服务,客户端测试用例可以用Java、Ruby、PHP、Python编写。 测试服务器: 下载地址:http://selenium.googlecode.com/files/seleni......
  • mysql 查看当前正在被锁定的事务和等待锁的事务信息
    SELECTr.trx_idAS'事务ID',r.trx_stateAS'事务状态',r.trx_startedAS'事务开始时间',r.trx_wait_startedAS'等待开始时间',l.lock_tableAS'表',l.lock_indexAS'索引',l.lock_modeAS......
  • android隐式启动Activity的例子
    android隐式启动Activity的例子【原创】android2.2测试通过android隐匿启动Activity的例子,同样适用于Service,BroadcastReceiver<activityandroid:name=".MyActivityTwo"android:label="ThisMyActivityTwo"><!--这样进行匹配:Intentintent=newIntent(Intent.ACT......