zoukankan      html  css  js  c++  java
  • Python爬虫之设置selenium webdriver等待

    Python爬虫之设置selenium webdriver等待

    ajax技术出现使异步加载方式呈现数据的网站越来越多,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给定位元素的定位增加了困难。

    如果因为在加载某个元素时延迟而造成ElementNotVisibleException(不可见元素异常)的情况出现,那么就会降低自动化脚本的稳定性,设置元素等待可改善这种问题造成的不稳定。

    一、强制等待

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

    from selenium import webdriver
    from time import sleep
    
    def test():
        #打开浏览器
        driver = webdriver.Firefox()
        driver.get('http://www.baidu.com')
        sleep(5)
        driver.quit()

    sleep(5)会挂起这个脚本,五秒后再继续执行,但是这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用,特殊情况下,时间设置最好不超过1秒,一般0.5秒。

    二、隐式等待

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

    设置一定的时长等待页面上某元素加载完成,如果超出了设置的时长元素还没有被加载,则抛出NoSuchElementException异常,没有超过规定时间就继续往下执行,WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0:

    from selenium import webdriver
    
    def test():
        #打开浏览器
        driver = webdriver.Firefox()
        #隐式等待 设置等待时间为10秒
        driver.implicitly_wait(10)
        driver.get('http://www.baidu.com')

    注意:隐式等待中,如果元素在规定时间内加载出来,也得继续等待到规定的时间结束。

    三、显示等待

    显示等待:显示等待必须在每个需要等待的元素前面进行声明。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as ec
    
    def test():
        #打开浏览器
        driver = webdriver.Firefox()
        driver.get('http://www.baidu.com')
        #显示等待
        element = WebDriverWait(driver,5,0.5).until(ec.presence_of_all_elements_located((By.ID,"kw")))
        driver.find_element_by_id("kw").send_keys("selenium")

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

    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,message=”) 
    method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
    message: 如果超时,抛出TimeoutException,将message传入异常
    until_not(method,message=”) 
     与until相反,until是当某元素出现或什么条件成立则继续执行,
     until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。

    2、expected_conditions类

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

    常用条件:

                           条件                            说明
    presence_of_element_located      判断某个元素是否被加到了DOM树里,并不代表该元素一定可见
    visibility_of_element_located     判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0
  • 相关阅读:
    从a文件判断是否删除b文件中的行(sed示例)
    绝对路径的表示方式为什么是"/usr"而不是"//usr"
    判断ssh远程命令是否执行结束
    彻底搞懂shell的高级I/O重定向
    Resource Agent:LSB和OCF
    流程控制语句(MySQL/MariaDB )
    MySQL/MariaDB中游标的使用
    翻译:DECLARE HANDLER语句(已提交到MariaDB官方手册)
    从集合的无序性看待关系型数据库中的"序"
    MariaDB/MySQL存储过程和函数
  • 原文地址:https://www.cnblogs.com/-wenli/p/10913708.html
Copyright © 2011-2022 走看看