python+selenium的三种等待

在使用过程中主要用到的有3种等待,强制等待、隐式等待和显式等待。以等车的说明下三总等待的区别。

1、强制等待。

import time

time.sleep(5)

车子等待5s后准时启动,不管是否有人员上车。

2、隐式等待。

from selenium import webdriver

driver = webdriver.Chrome()
#隐式等待
driver.implicitly_wait(30)
driver.get('http://www.baidu.com/')
#定位
driver.find_element_by_id('kw')
#关闭浏览器
driver.quit()

在找id='kww'所需的时间:usertime,30s内找到则继续下一步,当找了30s后仍没有找到,则抛出异常报错。

隐式等待是设置该WebDriver的实例的生命周期(全局等待)。分为1、页面加载超时等待 ;2、页面元素加载超时;3、异步脚本超时。如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。可使用在反扒机制比较强的网址,否则ip容易被封。

3、显式等待

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

driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
locator = (By.LINK_TEXT, '新闻') #定位
#显式等待
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))
driver.close()

找“新闻”链接,在20s的等待期间,每隔0.5s,查看“新闻”是否上车,当上车则继续下一步,若20s后仍没有找到则抛出异常报错。

显式等待是针对于某个特定的元素设置的等待时间,如果在规定的时间范围内,没有找到元素,则会抛出异常,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作。

显式等待由于要判断是否符合条件,所以会复杂些,简单介绍下。

WebDriverWait:

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

from selenium.webdriver.support.wait import WebDriverWait导入模块

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

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

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

在10s等待期间,每隔一定时间(默认0.5秒),调用until或until_not里的方法,直到它返回True或False.

与expected_conditions结合使用

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

方法说明
element_to_be_clickable判断某个元素中是否可见并且可点击,返回的是元素element本身
text_to_be_present_in_element判断某个元素中的 text 是否 包含 了预期的字符串,返回布尔
visibility_of_element_located判断元素是否可见(可见代表元素非隐藏,并且元素宽和高都不等于 0),返回的是元素element本身
visibility_of同上一方法,只是上一方法参数为locator,这个方法参数是 定位后的元素
presence_of_element_located判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见
invisibility_of_element_located判断某个元素中是否不存在于dom树或不可见
title_is判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
title_contains判断当前页面的 title 是否包含预期字符串,返回布尔值
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
element_to_be_selected判断某个元素是否被选中了,一般用在下拉列表
…………

疑问

1、until_not的使用,及expected_conditions类中各种方法的使用(后续更新)

#当title不是“百度一下,你就知道”时可执行下一步
WebDriverWait(driver, 20, 0.5).until_not(EC.title_is( '百度一下,你就知道'))

2、隐式等待:当屏蔽语句,输出1和输出2 的内容是一样的,未等待点击按键后信息加载就输出了信息。

from selenium import webdriver
#启动浏览器
driver = webdriver.Chrome()
#隐形等待
driver.implicitly_wait(300)
#输入网址
driver.get('http://www.baidu.com/')
#输出1
print(driver.title)
#定位输入框输入查询内容“信息”
driver.find_element_by_id("kw").send_keys("信息")
#定位百度一下按键,点击按键
driver.find_element_by_id("su").click()
#屏蔽语句的影响
#driver.find_element_by_id('content_left')
#输出2
print(driver.title)

#关闭浏览器
driver.quit()

3、隐式等待 和显式等待 对比

"""
隐式等待例子,每一次定位都会有隐式等待时间,成功后继续下一步
"""
from selenium import webdriver
#启动浏览器
driver = webdriver.Chrome()
#隐形等待
driver.implicitly_wait(300)
#输入网址
driver.get('http://www.baidu.com/')

print(driver.title)
#定位输入框输入查询内容“信息”
driver.find_element_by_id("kw").send_keys("信息")
#定位百度一下按键,点击按键
driver.find_element_by_id("su").click()
driver.find_element_by_id('content_left')

print(driver.title)

#关闭浏览器
driver.quit()
"""
显式等待例子,特定地方设置显式等待。
"""
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
#启动浏览器
driver = webdriver.Chrome()
#输入网址
driver.get('http://www.baidu.com/')
print(driver.title)
#定位输入框输入查询内容“信息”
driver.find_element_by_id("kw").send_keys("信息")
#定位百度一下按键,点击按键
driver.find_element_by_id("su").click()
#显式等待
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(( By.ID,'content_left')))

print(driver.title)

#关闭浏览器
driver.quit()

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值