• 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')

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

  • 相关阅读:
    明就要发布一加8pro了,发几张关于7的图片供大家回忆下
    【移动端开发】移动端开发项目架构
    【前端开发】three.js入门
    【前端依赖】live-server静态文件本热更新静态服务安装及使用教程
    【vue开发】泛型总结
    【vue前端开发】微信扫码登录
    【正则表达式】梳理
    【mock数据服务】大项目中mock的使用方法和注意事项
    【vue开发】v-bind="$attrs" v-on="$listeners" 多层组件监听
    【vue开发】render的用法,全局引入/组件简化代码
  • 原文地址:https://www.cnblogs.com/will-wu/p/13491358.html
Copyright © 2020-2023  润新知