简介

在selenium操作浏览器的过程中,每一次请求url,selenium都会等待页面加载完成以后,

才会将操作权限在交给我们的程序。

但是,由于ajax和各种JS代码的异步加载问题,当一个页面被加载到浏览器时,

该页面内的元素可以在不同的时间点被加载,这就使得元素的定位变得十分困难,

当元素不再页面中时,使用会抛出ElementNotVisibleException异常,为了解决这个问题,

selenium提供了两种等待页面加载的方式,显示等待和隐式等待,

让我们可以等待元素加载完成后在进行操作。


显示等待: 显式等待指定某个条件,然后设置最长等待时间,程序每隔XX时间看一眼,如果条件成立,

      则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出超时异常(TimeoutException)。

隐性等待:设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,

     否则一直等到时间截止,然后执行下一步。


显示等待主要使用了WebDriverWait类与expected_conditions模块。

一般写法:WebDriverWait(driver, timeout, poll_frequency, igonred_exceptions).until(method, message)

WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement"))

Driver:传入WebDriver实例。

timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)

poll_frequency: 调用until中的方法的间隔时间,默认是0.5秒

ignored_exceptions: 忽略的异常,如果在调用until的过程中抛出这个元组中的异常,则不中断代码,继续等待.

Method:可执行方法

Message: 超时时返回的信息


显式等待

例子


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
​
driver = webdriver.Chrome()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()

在这个例子中,我们在查找一个元素的时候,不再使用find_element_by_*这样的方式来查找元素,

而是使用了WebDriverWait。

try代码块中的代码的意思是:在抛出元素不存在异常之前,最多等待10秒。在这10秒中,

WebDriverWait会默认每500ms运行一次until之中的内容,

而until中的EC.presence_of_element_located则是检查元素是否已经被加载,检查的元素则通过By.

ID这样的方式来进行查找。

就是说,在10秒内,默认每0.5秒检查一次元素是否存在,存在则将元素赋值给element这个变量。

如果超过10秒这个元素仍不存在,则抛出超时异常。

expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件,配合该类的方法,

就能够根据条件而进行灵活地等待了

例子:

from selenium.webdriver.support import expected_conditions as EC
​
wait = WebDriverWait(driver, 10)
# 等待直到元素可以被点击
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))
 

隐式等待

隐式等待指的是,在webdriver中进行find_element这一类查找操作时,如果找不到元素,则会默认的轮询等待一段时间。

这个值默认是0,可以通过以下方式进行设置:

from selenium import webdriver
​
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 单位是秒
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
 

selenium等待的更多相关文章

  1. python selenium等待特定网页元素加载完毕

    selenium等待特定元素加载完毕 is_disappeared = WebDriverWait(driver, 8, 0.5, ignored_exceptions=TimeoutExceptio ...

  2. selenium等待方式之显示等待

    有时候,页面元素并未及时加载出来导致后面的步骤无法执行 这里就需要在加载前添加等待时间,让目标元素有足够的时间加载出来 第一种方法:使用time.sleep() 这种方法过于强制,无论元素是否加载出来 ...

  3. selenium等待机制

    等待机制 ​ 因为你要查找的标签由于网速等原因迟迟没有加载出来,你就直接获取这个标签,很明显是报错,现有的简单粗暴的解决办法就是time.sleep(3),睡几秒,也就是设置线程等待,等这个标签加载出 ...

  4. selenium等待机制学习笔记

    转载至: https://blog.csdn.net/huilan_same/article/details/52544521 1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(x ...

  5. selenium等待方式详解

    这些方式仅供参考,实际使用体验并不好,最好对find_element()方法进行二次封装. # coding=utf-8 from time import sleep from selenium im ...

  6. selenium 等待页面加载完成

    一.隐形加载等待: file:///C:/Users/leixiaoj/Desktop/test.html 该页面负责创建一个div <html> <head> <tit ...

  7. [Selenium]等待元素出现之后再消失,界面上的loading icon都属于这种类型,之前的方法总是卡死,换这种方法目前还好用的

    等待元素出现之后再消失,界面上的loading icon都属于这种类型,之前的方法总是卡死,换这种方法目前还好用的 /** * Check if the element present with cu ...

  8. Selenium等待某个元素出现之隐式等待

    找不到元素这个问题困扰了两天了,一直怀疑是页面div层次太多,定位不准确.于是就从table开始到最后一层精确定位,仍然找不元素.怎么办,在网上搜索答案,说是可以加个隐式试试,于是在执行前加了一句等待 ...

  9. 2.8 (显示、隐式、线程休眠) selenium 等待方式 ❀

    http://blog.csdn.net/pf20050904/article/details/20052485 http://www.cnblogs.com/hellokitty1/p/629584 ...

随机推荐

  1. 神经网络的结构汇总——tflearn

    一些先进的网络结构: # https://github.com/tflearn/tflearn/blob/master/examples/images/highway_dnn.py # -*- cod ...

  2. E20170619-hm

    bucket   n. 水桶; open hash  [词典] [计] 开放散列,开混列; spirit   n. 精神,心灵; 情绪; 勇气; 精髓; flesh   n. 肉; 肉体; 果肉; 皮 ...

  3. php获得文件的属性

    PHP获取文件属性可以用到多种函数,来实现我们对文件各种不同信息的获取需求.在这里我们就简单的介绍了这些获取方式的实现方法. 详细解读PHP获取远程图片技巧 详细介绍PHP读取目录函数 如何运用相关函 ...

  4. Java中从控制台输入的三种方式

    我们最熟悉的从控制台读取一个字符或者一个字符串都知道用Scanner,那么除了Scanner还有没有其他的呢,答案是有的,我们来看看. System.in.read() System.in.read( ...

  5. RHEL6.5安装QT5.4,设置环境变量

    qt5.4.run在[/home/share]目录下 vim ~/.bashrcexport PATH=/opt/oracle/Qt5.4.1/Tools/QtCreator/bin:/opt/ora ...

  6. js 获取URL的值

    今天碰到要在一个页面获取另外一个页面url传过来的参数,一开始很本能的想到了用 split("?")这样一步步的分解出需要的参数. 后来想了一下,肯定会有更加简单的方法的!所以在网 ...

  7. ZOJ1969-Hard to Believe, but True!

    import re while True: x = raw_input() if(x == '0+0=0'): print 'True' break a,b,c = re.split('[+=]', ...

  8. 题解报告:hdu 1575 Tr A

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575 Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的 ...

  9. 二次封装OKHttp网络框架(1)

    1. 框架功能简介:暂时只有get.post两个请求 2. 请求的主要流程和区别: 2.1 get请求: (1)创建请求客户的 OkHttpClient对象 (2)创建请求构建器 Request.Bu ...

  10. 02--Java Socket编程--IO方式

    一.基础知识 1. TCP状态转换知识,可参考: http://www.cnblogs.com/qlee/archive/2011/07/12/2104089.html 2. 数据传输 3. TCP/ ...