zoukankan      html  css  js  c++  java
  • selenium之显式等待和隐式等待、休眠

      为什么要等待:需要的元素尚未加载出来(原因可能有:网速慢、网站内容过多),代码已经运行到元素位置,此时会报错;为避免这种错误,需要使用到等待,等待元素加载出来再执行元素

    1、显式等待

      显式等待是针对于某个特定的元素设置的等待时间

      格式:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

      示例:WebDriverWait(driver,10,0.2).until(ec.presence_of_element_located((By.CSS_SELECTOR,'.box-conteny')))

        解释:WebDriverWait(driver,10,0.2)意思是:使用浏览器driver显式等待,10秒内,每0.2秒进行一次后面的元素定位,若发现可以定位元素,则跳过,执行下一行代码;若元素未加载出来,无法定位,一直等待,等到10秒过后还无法定位则报错(会卡在这里,不通过不会执行下一行代码);presence_of_element_located()方法作用是判断后面的元素是否存在

      

    # 显式等待
    # 导入WebDriver
    from selenium import webdriver
    # 导入by
    from selenium.webdriver.common.by import By
    # 导入等待类WebDriver
    from selenium.webdriver.support.ui import WebDriverWait
    # 导入预期条件设置类expected_conditions 命名为ec
    from selenium.webdriver.support import expected_conditions as ec
    import time
    # 创建一个浏览器
    driver = webdriver.Firefox()
    driver.maximize_window()
    # 访问网址
    driver.get('https://dev.zebrapp.com/Manager/#/')
    
    # 设置显式等待预置条件
    # WebDriverWait(driver,10,0.2):使用浏览器driver显式等待,10秒内,每0.2秒进行一次后面的元素定位,若发现可以定位元素,则跳过,执行下一行代码;
    若元素未加载出来,无法定位,一直等待,等到10秒过后还无法定位则报错(会卡在这里,不通过不会执行下一行代码)
    # until意思是直到,直到后面的条件满足为止,即10秒内可以定位则跳过,10秒内定位不了则报错 WebDriverWait(driver,10,0.2).until(ec.presence_of_element_located((By.CSS_SELECTOR,'.box-content'))) # 下拉滚动条 for i in range(5): js = 'window.scrollTo(0,%s)' % (i*100) driver.execute_script(js) time.sleep(0.5) driver.quit()

      显示等待稍微复杂

    2、隐式等待

      使用implicitly_wait()方法实现隐式等待,设置的是全局等待(对页面的所有元素有效);若设置了隐式等待,运行到元素定位时定位不到元素,会在时间内多处尝试定位,超过时间则报错;设定的时间非固定,不影响脚本运行,不针对某个特定的元素进行等待;脚本执行到元素定位,可以定位则继续执行;定位不了则以轮询的方式不多判断元素 是否定位到,在时间内定位到则继续执行;时间内定位不到,则报错

      格式: driver.implicitly_wait(10)

      

    from selenium import webdriver
    # 创建一个浏览器对象,设置为最大化屏幕
    driver =  webdriver.Firefox()
    driver.maximize_window()
    # 访问淘宝
    driver.get('https://www.taobao.com/')
    # 下拉滚动条
    for i in range(100):
        js = 'window.scrollTo(0,%s)' % (i*100)
        driver.execute_script(js)
    # 隐式等待(10秒):隐式并不针对某个元素进行等待,脚本运行到元素定位时,元素若已经加载出来,可以定位,则不等待,继续运行;
    若元素未加载出来,还不能定位,则等待10秒,10秒内加载出来则继续运行,加载不出来则报错
    driver.implicitly_wait(10) # 定位元素(此元素需要下拉滚动条,否则不加载出来;若验证隐式等待的效果,可以注释下拉操作运行代码) driver.find_element_by_css_selector('.hotsale-hd > em:nth-child(1)') # 关闭浏览器 driver.quit()

    3、休眠

      time.sleep(2),休眠2秒;此方式需要导入time模块,属于强制代码休眠

    # 导入模块
    from selenium import webdriver
    import time
    # 创建浏览器,设置为最大化
    driver = webdriver.Firefox()
    driver.maximize_window()
    # 访问百度
    driver.get('http://www.baidu.com')
    # 强制休眠2秒
    time.sleep(2)
    # 定位百度输入框
    driver.find_element_by_id('kw')

      显式等待针对的是某个 特定的元素,需要设置查询元素是否能被定位到频率等;隐式等待设置的是全局,对整个网页所有元素有效;休眠则强制代码休眠时间,显式和隐式 不休眠,只是等待

  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/will-wu/p/13491358.html
Copyright © 2011-2022 走看看