selenium等待定位标签加载完再执行

遇到的问题描述

我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作。  否则页面上的元素不存在,会抛出异常。  

比如:

一个动态网页使用了ajax的异步加载,我们需要等待元素加载完成后, 才能操作这个元素

(事实上,现在我们遇到的所有想要爬取的网站都或多或少的使用了各种各样的动态技术加载局部元素来提升访问效率)

selenium 中提供了非常简单,智能的方法,来判断元素是否存在.

最直接的方法就是

强制等待:sleep():

import time
sleep(5)  #等待5秒

缺点不言而喻,对程序不友好,影响脚本运行效率,占用服务器资源


隐式等待:implicitly_wait()

driver.implicitly_wait(10) #隐式等待10秒

由webdriver提供的方法,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用,它不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成,才会执行下一个语句。如果超出了设置时间的则抛出异常。

缺点:当页面某些js无法加载,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一句。某些情况下会影响脚本执行速度。

测试代码

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import osurl = "file:///E:/code/py_project/untitled/testHtml.html"def fun_1(URL):browner = webdriver.Chrome()browner.get(URL)browner.find_element_by_id("testBtn").click()browner.implicitly_wait(10)  # 隐式等待10秒WebElement = browner.find_element_by_class_name("red_box")my_js = 'arguments[0].style.width = "200px";arguments[0].style.height = "200px"'browner.execute_script(my_js, WebElement)os.system("pause")fun_1(url)

显式等待:WebDriverWait(driver, timeout, poll_frequency, ignored_exceptions)

  • driver:浏览器驱动
  • timeout:最长超时时间,默认以秒为单位
  • poll_frequency:检测的间隔步长,默认为0.5s
  • ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

与until()或者until_not()方法结合使用

WebDriverWait(driver,10).until(method,message="")
调用该方法提供的驱动程序作为参数,直到返回值为TrueWebDriverWait(driver,10).until_not(method,message="")
调用该方法提供的驱动程序作为参数,直到返回值为False

在设置时间(10s)内,等待后面的条件发生。如果超过设置时间未发生,则抛出异常。在等待期间,每隔一定时间(默认0.5秒),调用until或until_not里的方法,直到它返回True或False. 

测试代码:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import osurl = "file:///E:/code/py_project/untitled/testHtml.html"def fun_1(URL):browner = webdriver.Chrome()browner.get(URL)browner.find_element_by_id("testBtn").click()# 设置隐式等待# browner.implicitly_wait(10)  # 隐式等待10秒# 设置显示等待 - 1wait = WebDriverWait(browner, 10, 0.5)# 使用匿名函数wait.until(lambda diver: browner.find_element_by_class_name('red_box'))# 等到这个元素加载完毕再操作就不会报错WebElement = browner.find_element_by_class_name("red_box")my_js = 'arguments[0].style.width = "200px";arguments[0].style.height = "200px"'browner.execute_script(my_js, WebElement)os.system("pause")fun_1(url)

WebDriverWait与expected_conditions结合使用

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Bywait = WebDriverWait(driver,10,0.5)
element =waite.until(EC.presence_of_element_located((By.ID,"kw"),message="")

测试代码:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import osurl = "file:///E:/code/py_project/untitled/testHtml.html"def fun_1(URL):browner = webdriver.Chrome()browner.get(URL)browner.find_element_by_id("testBtn").click()wait = WebDriverWait(browner, 10, 0.5)wait.until(EC.presence_of_element_located((By.CLASS_NAME, "red_box")))# 等到这个元素加载完毕再操作就不会报错WebElement = browner.find_element_by_class_name("red_box")my_js = 'arguments[0].style.width = "200px";arguments[0].style.height = "200px"'browner.execute_script(my_js, WebElement)os.system("pause")fun_1(url)

expected_conditions类提供的预期条件判断的方法 

方法说明
title_is判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
title_contains判断当前页面的 title 是否包含预期字符串,返回布尔值
presence_of_element_located判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见
visibility_of_element_located判断元素是否可见(可见代表元素非隐藏,并且元素宽和高都不等于 0)
visibility_of同上一方法,只是上一方法参数为locator,这个方法参数是 定位后的元素
presence_of_all_elements_located判断是否至少有 1 个元素存在于 dom 树中。举例:如果页面上有 n 个元素的 class 都是’wp’,那么只要有 1 个元素存在,这个方法就返回 True
text_to_be_present_in_element判断某个元素中的 text 是否 包含 了预期的字符串
text_to_be_present_in_element_value判断某个元素中的 value 属性是否包含 了预期的字符串
frame_to_be_available_and_switch_to_it判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False
invisibility_of_element_located判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable判断某个元素中是否可见并且可点击
staleness_of等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False
element_to_be_selected判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator
alert_is_present判断页面上是否存在 alert

显示等待,自定义等待条件

#设置等待
wait = WebDriverWait(driver,10,0.5)
#使用匿名函数
wait.until(lambda diver:driver.find_element_by_id('kw'))

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] body{height:100%}和html,body{height:100%}有什么区别?为什么html要设置height:100%呢,html不就是整个窗口吗?

[css] body{height:100%}和html,body{height:100%}有什么区别?为什么html要设置height:100%呢,html不就是整个窗口吗? html是body的父级,在缺少了父级的宽高之后,如果给body设置一个渐变色背景的话将不会正常显示。个…

数据类型的操作

时间数据类型 1.mongo中存储时间大多为ISOData 2.获取当前时间   1. 使用new Date() 自动生成当前时间   2. 使用 ISODate() 生成当前时间   3. 获取计算机时间生成时间格式字符串 Date() 3.ISODate()   功能: 生成mongodb时间存储类型   参数&#xff1a…

python+selenium 浏览器无界面模式运行

以Chrome浏览器为例: 方法一: from selenium.webdriver import Chrome, ChromeOptionsopt ChromeOptions() # 创建Chrome参数对象 opt.headless True # 把Chrome设置成可视化无界面模式,windows/Linux 皆可 driv…

[css] 你所理解的css高级技巧有哪些?

[css] 你所理解的css高级技巧有哪些? 各种动画效果,能用css的都可以不去用js写的,对我来说就很高级个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣…

[css] 举例说明跟字体相关的属性有哪些

[css] 举例说明跟字体相关的属性有哪些 font-size:字体大小 font-weight:字体粗细 font-family:字体类型 color:字体颜色 等等个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很…

python 文件读写(追加、覆盖)

很明了的一个常用参数图标: 更像细的一个参数说明: 由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来…

职场篇:失败之后

前言 当我写下这个题目之后,我想到了一首歌词"长大以后,我只能奔跑,我多害怕 黑暗中跌倒 ",我不由得哼起这首歌,一种心痛孜然而生。 我也想到了一本小说《飞升之后》,讲述主人公飞升后&#xf…

h5页面调用cmd命令并隐藏cmd弹窗

/*** 通过js调用cmd命令利用ffmpeg实现录屏或者录像功能 ***/ var cmd new ActiveXObject("WScript.Shell");/*命令参数说明cmd.exe /c dir 是执行完dir命令后关闭命令窗口。cmd.exe /k dir 是执行完dir命令后不关闭命令窗口。cmd.exe /c start dir 会打开一个新窗…

[css] 字体的粗细的属性是用哪一个?它有哪些属性值?

[css] 字体的粗细的属性是用哪一个?它有哪些属性值? font-size指的应该是字体大小,字体粗细应该是font-weight,值有normal,bold,bolder,lighter,inherit,也可以自己定义100~900之间的某一个值个人简介 我是歌谣,欢迎…

前端知识点总结

1、DOM结构 —— 两个节点之间可能存在哪些关系以及如何在节点之间任意移动。(通俗易懂的来讲讲DOM、两个节点之间可能存在哪些关系以及如何在节点之间任意移动) DOM: Document Object Module, 文档对象模型。 节点的关系:父(parent)、子(child)和同胞(sibling)等节…

C# windows定时服务+服务邮箱发送

protected override void OnStart(string[] args){timer1 new System.Timers.Timer();// timer1 new System.Timers.Timer(24 * 60 * 60 * 1000);timer1.Interval 3000; //设置计时器事件间隔执行时间timer1.Elapsed new System.Timers.ElapsedEventHandler(timer1_Elapse…

[css] 用CSS实现一个轮播图

[css] 用CSS实现一个轮播图 使用CSS实现的话,可以使用 animat属性和overflow:hidden 属性来做。个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Python爬虫自学之第(①)篇——爬虫伪装和反“反爬”

有些网站是防爬虫的。其实事实是,凡是有一定规模的网站,大公司的网站,或是盈利性质比较强的网站,都是有高级的防爬措施的。总的来说有两种反爬策略,要么验证身份,把虫子踩死在门口;要么在网站植…

[css] 用CSS实现tab切换

[css] 用CSS实现tab切换 1.用label结合单选按钮radio接受切换tab的单击 2.用zindex层级来显示当前tab页对应的内容 3.用css兄弟选择器选中对应的tab页签和内容页,添加相应的样式个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易&#xff0…

【练习】实现一个parse方法(需要实现的效果见内容),方法总结

【本题来自牛客网,解题方法也借鉴于牛客网上讨论区中的多种答案,在此做一个总结】 parse方法需要实现的效果如下: var object {b: { c: 4 }, d: [{ e: 5 }, { e: 6 }] }; console.log( parse(object, ‘b.c’) 4 ) //true console.log( par…

[css] 移动端1px像素的问题及解决方案是什么?

[css] 移动端1px像素的问题及解决方案是什么&#xff1f; viewport结合rem解决像素比问题 比如在devicePixelRatio2设置meta <meta name"viewport" content"initial-scale0.5, maximum-scale0.5, minimum-scale0.5, user-scalableno">在devicePixel…

处理 JavaScript 异步操作的几种方法总结

引言 js的异步操作&#xff0c;已经是一个老生常谈的话题&#xff0c;关于这个话题的文章随便google一下都可以看到一大堆。处理js的异步操作&#xff0c;都有一些什么方法呢&#xff1f;仁者见仁智者见智 一、回调函数 传说中的“callback hell”就是来自回调函数。而回调函…

Spring 事务相关及@Transactional的使用建议

使用步骤&#xff1a; 步骤一、在spring配置文件中引入<tx:>命名空间<beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:tx"http://www.springframework.org/schema/…

谷歌浏览器安装Vue Devtools插件(国内的谷歌浏览器如何安装插件)

分享给大家一个谷歌插件网站&#xff0c;适合国内谷歌浏览器无法安装插件的问题&#xff0c;你懂的 点击这里下载Vue.js Devtools插件&#xff0c; 喜欢的可以收藏这个插件资源网站&#xff0c;分享给大家 第一步&#xff1a;下载后解压获得CRX文件&#xff0c;如下图 第二步…

MySQL操作权限整理

用户权限管理主要有以下作用&#xff1a; 1. 可以限制用户访问哪些库、哪些表 2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作 3. 可以限制用户登录的IP或域名 4. 可以限制用户自己的权限是否可以授权给别的用户 一、用户授权 mysql> grant a…