selenium等待
简介
在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等待的更多相关文章
- python selenium等待特定网页元素加载完毕
selenium等待特定元素加载完毕 is_disappeared = WebDriverWait(driver, 8, 0.5, ignored_exceptions=TimeoutExceptio ...
- selenium等待方式之显示等待
有时候,页面元素并未及时加载出来导致后面的步骤无法执行 这里就需要在加载前添加等待时间,让目标元素有足够的时间加载出来 第一种方法:使用time.sleep() 这种方法过于强制,无论元素是否加载出来 ...
- selenium等待机制
等待机制 因为你要查找的标签由于网速等原因迟迟没有加载出来,你就直接获取这个标签,很明显是报错,现有的简单粗暴的解决办法就是time.sleep(3),睡几秒,也就是设置线程等待,等这个标签加载出 ...
- selenium等待机制学习笔记
转载至: https://blog.csdn.net/huilan_same/article/details/52544521 1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(x ...
- selenium等待方式详解
这些方式仅供参考,实际使用体验并不好,最好对find_element()方法进行二次封装. # coding=utf-8 from time import sleep from selenium im ...
- selenium 等待页面加载完成
一.隐形加载等待: file:///C:/Users/leixiaoj/Desktop/test.html 该页面负责创建一个div <html> <head> <tit ...
- [Selenium]等待元素出现之后再消失,界面上的loading icon都属于这种类型,之前的方法总是卡死,换这种方法目前还好用的
等待元素出现之后再消失,界面上的loading icon都属于这种类型,之前的方法总是卡死,换这种方法目前还好用的 /** * Check if the element present with cu ...
- Selenium等待某个元素出现之隐式等待
找不到元素这个问题困扰了两天了,一直怀疑是页面div层次太多,定位不准确.于是就从table开始到最后一层精确定位,仍然找不元素.怎么办,在网上搜索答案,说是可以加个隐式试试,于是在执行前加了一句等待 ...
- 2.8 (显示、隐式、线程休眠) selenium 等待方式 ❀
http://blog.csdn.net/pf20050904/article/details/20052485 http://www.cnblogs.com/hellokitty1/p/629584 ...
随机推荐
- Consider using EXISTS instead of IN
redgate给出的提示 https://documentation.red-gate.com/codeanalysis/performance-rules/pe019 In theory, EXIS ...
- DVB-subtitle解析流程浅
DTV包含SUBTITLE和TTX. PMT中分别有不同的描述符对应,如下图的TTX descripter=0x56.语言ISO-639="fin" subtitle descri ...
- JSP-Runoob:JSP 服务器响应
ylbtech-JSP-Runoob:JSP 服务器响应 1.返回顶部 1. JSP 服务器响应 Response响应对象主要将JSP容器处理后的结果传回到客户端.可以通过response变量设置HT ...
- E20170626-gg
occupy vt. 占领; 使用,住在…; 使从事,使忙碌; 任职; stack n. 垛,干草堆; (一排) 烟囱; 层积; 整个的藏书架排列;
- codevs3162抄书问题(划分型dp)
3162 抄书问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每 ...
- Java中的管道流 PipedOutputStream和PipedInputStream
我们在学习IO流的时候可能会学字节流.字符流等,但是关于管道流的相信大部分视频或者教程都是一语带过,第一个是因为这个东西在实际开发中用的也不是很多,但是学习无止境,存在既有理.JDK中既然有个类那说明 ...
- Codeforces 455D 分块+链表
题意: 给定一个长度为 N 的序列两种操作1 l r 将[l,r]的数向右循环移位 2 l r 询问[l,r]内有多少个数等于 k其中 N,Q≤105,ai≤N 强制在线 思路: 1. 每块用一个链表 ...
- UE4 集成讯飞听写插件
搞了几天,有些坑记录一下. 3个方面的知识需要学习 1.制作UE4插件 2.引入第三方库 3.讯飞听写的api 一看是参考 https://blog.csdn.net/u012793104/artic ...
- MVC系列学习(一)-新语法
本篇内容: 1.自动属性 2.隐式类型 3.对象初始化器和集合初始化器 4.匿名类型 5.扩展方法 6.Lambda表达式 1.自动属性 使用: class Student { public stri ...
- hibernate annotation 生成uuid主键
JPA标准方式下,不可以生成uuid类型的主键,但是hibernate提供了一些方式生成uuid主键,具体如下: 1.主键生成器 @GeneratedValue(generator=" ...