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

Python爬虫之设置selenium webdriver等待的更多相关文章

  1. python爬虫动态html selenium.webdriver

    python爬虫:利用selenium.webdriver获取渲染之后的页面代码! 1 首先要下载浏览器驱动: 常用的是chromedriver 和phantomjs chromedirver下载地址 ...

  2. [Python爬虫] 之七:selenium webdriver定位不到元素的五种原因及解决办法(转载)

    转载:http://www.51testing.com/html/87/300987-831171.html 1.动态id定位不到元素for example:        //WebElement ...

  3. 【自动化测试&爬虫系列】Selenium Webdriver

    文章来源:公众号-智能化IT系统. 一. Selenium Webdriver技术介绍 1. 简介 selenium Webdriver是一套针对不同浏览器而开发的web应用自动化测试代码库.使用这套 ...

  4. python爬虫笔记----4.Selenium库(自动化库)

    4.Selenium库 (自动化测试工具,支持多种浏览器,爬虫主要解决js渲染的问题) pip install selenium 基本使用 from selenium import webdriver ...

  5. [Python爬虫] 之一 : Selenium+Phantomjs动态获取网站数据信息

    本人刚才开始学习爬虫,从网上查询资料,写了一个利用Selenium+Phantomjs动态获取网站数据信息的例子,当然首先要安装Selenium+Phantomjs,具体的看 http://www.c ...

  6. PYTHON 爬虫笔记七:Selenium库基础用法

    知识点一:Selenium库详解及其基本使用 什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium ...

  7. 吴裕雄--天生自然PYTHON爬虫:使用Selenium爬取大型电商网站数据

    用python爬取动态网页时,普通的requests,urllib2无法实现.例如有些网站点击下一页时,会加载新的内容,但是网页的URL却没有改变(没有传入页码相关的参数),requests.urll ...

  8. python爬虫之初始Selenium

    1.初始 Selenium[1]  是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Moz ...

  9. Python爬虫——Scrapy整合Selenium案例分析(BOSS直聘)

    概述 本文主要介绍scrapy架构图.组建.工作流程,以及结合selenium boss直聘爬虫案例分析 架构图 组件 Scrapy 引擎(Engine) 引擎负责控制数据流在系统中所有组件中流动,并 ...

随机推荐

  1. javah生成带有包名的头文件

    无包名情况 多数的demo都是基于这种条件,假设在目录jni/下有一个包含native方法的文件Hello.class.进入jni/目录,直接执行javah Hello,就可以在jni/目录下生成文件 ...

  2. ES设置字段搜索权重——Query-Time Boosting

    Query-Time Boosting In Prioritizing Clauses, we explained how you could use the boost parameter at s ...

  3. workerman介绍

    WorkerMan的特性 1.纯PHP开发 使用WorkerMan开发的应用程序不依赖php-fpm.apache.nginx这些容器就可以独立运行. 这使得PHP开发者开发.部署.调试应用程序非常方 ...

  4. .DS_Store 文件是什么?Mac下面如何禁止.DS_Store生成

    .DS_Store是Mac OS保存文件夹的自定义属性的隐藏文件,如文件的图标位置或背景色,相当于Windows的desktop.ini. 1,禁止.DS_store生成:打开 “终端” ,复制黏贴下 ...

  5. ambari 维护模式及reset API 操作

    Ambari 的维护模式(Maintenance Mode)介绍 Ambari 提供的 Maintenance Mode,是为了让用户在调试或者维护 Service 的时候,抑制不必要的告警(Aler ...

  6. MySQL交叉表处理_20160923

    交叉表处理,在二维表中例如下面表 想把年月字段放到列字段,在sql中可以使用sum(if(条件,求和字段,null)) 函数来进行行列的转置 1.首先是上篇的年月字段在一列 SELECT city A ...

  7. UOJ_21_【UR #1】缩进优化_数学

    UOJ_21_[UR #1]缩进优化_数学 题面:http://uoj.ac/problem/21 最小化$\sum\limits{i=1}^{n}a[i]/x+a[i]\;mod\;x$ =$\su ...

  8. Maven项目实战(1)

    一.maven的好处? 同样的项目使用maven工程来实现,它的项目源码很小: 1.依赖管理 就是对jar 包管理的过程 2.项目的一键构建 (编译-----测试----- 运行 --打包------ ...

  9. QT时钟绘制

    Demo的效果 资源占用还能接受 运行久一点内存就下去了 下面是Demo的代码 #include "mainwindow.h" #include "ui_mainwind ...

  10. poi 导出excel 生成等比例图片

    poi 导出的带等比例图片方法 /** * * <p>Description: 将一物一码列表导出到excel</p> * @param response * @param l ...