Python爬虫之设置selenium webdriver等待

系统 1576 0

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
            
          

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论