zoukankan      html  css  js  c++  java
  • selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())---基于python

    我们在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中(appium通用)常用的等待分为显示等待WebDriverWait()隐式等待implicitly_wait()强制等待sleep()三种,下面我们就分别介绍一下这三种等待的区别

    在前面的博文中简单介绍了《强制等待和隐士等待的区别和理解,本文再详细的结合案例进行理解。

    • sleep(): 强制等待,设置固定休眠时间。 python time 包提供了休眠方法 sleep() , 导入 time 包后就可以使用 sleep(),进行脚本的执行过程进行休眠。
    • implicitly_wait():隐石等待,也叫智能等待,是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。
    • WebDriverWait():显示等待,同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException

    下面通过一个实例来加深理解:

    #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()

    关于强制等待和隐式等待在上面注释中已做了说明

    下面主要介绍一下WebDriverWait() 显示等待,语法格式如下:

     

    WebDriverWait(self,driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until(self,method,message=)
    或者
    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",大家可以定义忽略的异常信息
    WebDriverWait一般由until或until_not配合使用
    until(method,message=")调用该方法提供的驱动程序做为一个参数,直到返回值不为False
    until_not(method,message=")调用该方法提供的驱动程序做为一个参数,直到返回值为False

    实例:
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.common.exceptions import NoAlertPresentException,TimeoutException,NoSuchElementException
    driver=webdriver.Firefox()
    driver.get("http:www.baidu.com")
    WebDriverWait(driver,10,1,NoSuchElementException).until(lambda driver:driver.find_element_by_name("d_status"))
     

     知识扩展:(截取出处为:http://blog.csdn.net/imzoer/article/details/8667176)

    lambda只是一个表达式,函数体比def简单很多。

    lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

    lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。

    如下例子:

    定义了一个lambda表达式,求三个数的和。

    再看一个例子:

    用lambda表达式求n的阶乘。

    ------------------------------

    lambda表达式也可以用在def函数中。

    看例子:

    这里定义了一个action函数,返回了一个lambda表达式。其中lambda表达式获取到了上层def作用域的变量名x的值。

    a是action函数的返回值,a(22),即是调用了action返回的lambda表达式。

    这里也可以把def直接写成lambda形式。如下

  • 相关阅读:
    学生管理系统(3:添加查询界面)
    Django模块笔记【六】
    Django模块笔记【五】
    Django模块笔记【四】
    Django模块笔记【三】
    Django模块笔记【二】
    Django模块笔记【一】
    网络编程基础【CSS编程】
    Django入门笔记【六】
    Django入门笔记【五】
  • 原文地址:https://www.cnblogs.com/VseYoung/p/selenium_wait_3_python.html
Copyright © 2011-2022 走看看