当前位置: 首页 > news >正文

00004、python+selenium 的三种时间等待方式

目的:使用selenium或者appium时,等待下个定位的元素出现,特别是web端加载的过程,为了提高脚本的稳定性,需要在脚本中增加等待时间

常见的三种等待:sleep()【强制等待】;implicitly_wait()【隐性等待】;webDriverWait()【显性等待】

  1. 【强制等待】sleep():固定休眠时间设置;执行到此时不管什么就固定的等待三秒之后再接着执行后面的操作
    • pythontime包提供了休眠方法sleep() ,导入time包后就可以使用sleep(),进行脚本的执行过程进行休眠;以秒为单位
    • JavaThread类里提供了休眠方法sleep,导入包后就能使用;以毫秒为单位
  2. 【隐性等待】implicitly_wait()又叫智能等待,是webdirver提供的一个超时等待。若在规定时间内完成加载加载完成,则执行下一步,否则一直等到时间截止;如超出了设置时间的则抛出异常;隐性等待对整个driver的周期都起作用,是针对执行脚本的所有对象
    python:driver.implicitly_wait(10) # 隐性等待,最长等10秒
    JAVA :driver.manage().timeouts().implicitlyWait(
    10, TimeUnit.SECONDS)
  3. 【显性等待】webDriverWait()在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementExceptionJava的使用方法
    python的使用方式
    from selenium.webdriver.support.ui import WebDriverWait  #导入 WebDriverWait 包
    WebDriverWait(driver, 10).until(lambda driver : driver.find_element_by_id("kw"))
    方式的应用&对应字段的解释:1)、WebDriverWait(self,driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until(self,method,message=)
    (2)、WebDriverWait(self,driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until_not(self,method,message=)
     self:函数本身,在实际使用的时候不需要输入
     driver:webdriver的驱动程序,如(IE、FireFox、chrome、safari等)
     timeout:超时时间,等待的最长时间(同时要考虑隐性等待时间)默认以秒为单位
     poll_frequency:休眠时间(步长)的间隔,默认为0.5秒,即检测元素是否存在的频率
     ignored_exceptions: 超时后的异常信息,默认情况下抛 “NoSuchElementException",大家可以定义忽略的异常信息
     method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
    message: 如果超时,抛出TimeoutException,将message传入异常
     until(method,message=")调用该方法提供的驱动程序做为一个参数,是当某元素出现或什么条件成立则继续执行;直到返回值不为False
     until_not(method,message=")与until相反;调用该方法提供的驱动程序做为一个参数,直到返回值为False
    总结:
    WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
    Java的使用方法
    WebDriverWaitwait=new WebDriverWait(driver, 10);
    WebElement wl= wait.until(new ExpectedCondition<WebElement>() {  
                @Override
                publicWebElement apply(WebDriver d) {  
                    returnd.findElement(By.cssSelector(".red_box"));  
                }
            })
  4. 下面通过一个实例来加深理解
    #coding=utf-8
    from selenium import webdriver
    #导入 WebDriverWait 包
    from selenium.webdriver.support.ui import WebDriverWait
    #导入 time 包
    from sleep import  sleep
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    #WebDriverWait()方法使用
    element=WebDriverWait(driver, 10).until(lambda driver : driver.find_element_by_id("kw"))        #
    element.send_keys("selenium")
    #添加智能等待
    driver.implicitly_wait(30)     #implicitly_wait()方法比sleep()更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待
    driver.find_element_by_id("su").click()
    #添加固定休眠时间
    sleep(5)        #sleep()方法以秒为单位,假如休眠时间小时 1 秒,可以用小数表示
    driver.quit()

转载于:https://www.cnblogs.com/zhang-12759/p/8612975.html

相关文章:

  • SQL SERVER存储过程一
  • HTML中nbsp; ensp; emsp; thinsp;等6种空白空格的区别
  • P1280 尼克的任务
  • 动态代理和AOP
  • php 实现SFTP上传文件
  • WordCount项目总结
  • 2017校招真题在线编程- 网易 合唱团
  • BZOJ 1260: [CQOI2007]涂色paint【区间DP】
  • Java浅克隆和深克隆
  • C#注册OCX控件
  • Hibernate 一对一关联映射,mappedBy参数解析
  • range.FormulaR1C1属性
  • java学习--基础知识进阶第十天--笔记
  • 七、数据库技术的发展及新技术
  • C语言实现过滤ASCII在0~127范围内的字符,并去除重复的字符
  • ➹使用webpack配置多页面应用(MPA)
  • 10个最佳ES6特性 ES7与ES8的特性
  • Elasticsearch 参考指南(升级前重新索引)
  • flutter的key在widget list的作用以及必要性
  • idea + plantuml 画流程图
  • java 多线程基础, 我觉得还是有必要看看的
  • javascript从右向左截取指定位数字符的3种方法
  • Laravel Telescope:优雅的应用调试工具
  • OSS Web直传 (文件图片)
  • Terraform入门 - 1. 安装Terraform
  • Theano - 导数
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue小说阅读器(仿追书神器)
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 工程优化暨babel升级小记
  • 猴子数据域名防封接口降低小说被封的风险
  • NLPIR智能语义技术让大数据挖掘更简单
  • 整理一些计算机基础知识!
  • #vue3 实现前端下载excel文件模板功能
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $jQuery 重写Alert样式方法
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (AngularJS)Angular 控制器之间通信初探
  • (二)hibernate配置管理
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)ssm码农论坛 毕业设计 231126
  • (五)网络优化与超参数选择--九五小庞
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET项目中存在多个web.config文件时的加载顺序
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [C#]扩展方法
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)
  • [HNOI2010]BUS 公交线路