selenuium学习 显示等待和隐式等待

显示等待

显式等待是等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。
WebDriverWait 类是 WebDriver 提供的等待方法。在设置时间内,每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间仍检测不到指定元素,则抛出异常。具体格式如下:

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

参数的含义:
driver:浏览器驱动
timeout:指定的超时时间,单位为秒,若超过该时间找不到指定元素则抛出报错
poll_frequency: 检测时间间隔,每隔多少秒检测一次指定元素是否存在
ignored_exceptions:超时后抛出的异常信息,默认 NoSuchElementException异常

WebDriverWait()一般与 until()、 until_not()方法、ExpectedCondition等配合使用。
until(method, message=″)

  • 每隔一段时间,调用一次method方法,知道返回为True,如果超时,则抛出错误。抛出TimeoutException,将message位置传入异常。

until_not(method, message=″)

  • 每隔 调用一次method方法,知道返回为False,如果超时,则抛出错误。抛出TimeoutException,将message位置传入异常。

expected_conditions模块中的方法通常就是method。常用的有以下几种:

  • title_is(text) 判断网页title是否和text相同
  • title_contains(text) 判断网页title是否包含特定文本
  • presence_of_element_located(locator) 判断一个元素存在于页面DOM树中,存在则返回元素本身,不存在则报错。locator为一个(by, path)元祖,这个(by, path)的by是Selenium的一个类
  • presence_of_all_elements_located(locator) 判断定位的元素范围内,至少有一个元素存在于页面当中,存在则以list形式返回元素本身,不存在则报错.
  • visibility_of_element_located(locator) )判断特定元素是否存在于DOM树中并且可见,可见意为元素的高和宽都大于0,元素存在返回元素本身,否则返回False.
  • visibility_of(element) 同上面visibility_of_element_located(locator),不过参数从locator的元组变为元素。
  • invisibility_of_element_located(locator)判断元素是否隐藏。
  • text_to_be_present_in_element(locator,text)判断给定文本是否出现在特定元素中,若存在则返回True,不存在返回False。
  • text_to_be_present_in_element_value(locator,text) 判断某文本是否是存在于特定元素的value值中,存在则返回True,不存在则返回False,对于查看没有value值的元素,也会返回False。
  • frame_to_be_available_and_switch_to_it(locator) 判断某个frame是否可以切换过去,若可以则切换到该frame,否则返回False 。
  • element_to_be_clickable(locator)判断某元素是否可访问并且可启用,比如能够点击,若可以则返回元素本身,否则返回False。
  • staleness_of(element)判断某个元素是否不再附加于于DOM树中,不再附加的话返回True,依旧存在返回False。可以用于判断页面是否刷新了。
  • alert_is_present判断alert是否存在,若存在则切换到alert,若不存在则返回False。
  • element_to_be_selected(element) 判断某元素是否被选中。
  • element_located_to_be_selected(locator) 判断某元素是否被选,locator为一个(by, path)元祖。
  • element_selection_state_to_be (element, is_selected)判断某元素的选中状态是否与预期相同,相同则返回True,不同则返回False。
  • element_located_selection_state_to_be(locator, is_selected) 判断某元素是否与预期相同,相同则返回True,不同则返回False,locator为一个(by, path)元祖。
    例如:访问百度网页,等待页面切换元素加载出来
    在这里插入图片描述
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(r'.\..\webdrivers\driver_files\chromedriver.exe')
driver.get("http://www.baidu.com")
driver.find_element(By.ID,'kw').send_keys('哈哈哈哈哈')
driver.find_element(By.XPATH,'//*[@id="su"]').click()

page_div = WebDriverWait(driver, 5, 0.5).until( EC.visibility_of_element_located((By.CLASS_NAME, "page-inner_2jZi2")))
if page_div:
    print("在5秒内找到了div元素")
    print(page_div)

隐式等待

WebDriver 提供的 implicitly_wait()方法可用来实现隐式等待,implicitly_wait()的参数是时间,单位为秒。这里的时间并不会影响程序执行的速度,当脚本执行到某个元素定位时,如果元素存在,则继续执行;如果定位不到元素,则它将以轮询的方式不断地判断元素是否存在。如果在设置的等待时间里仍然定位不到指定元素,则会抛出异常。
例如:

from time import ctime
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(r'.\..\webdrivers\driver_files\chromedriver.exe')
#设置隐式等待为 10s
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
try:
   print(ctime())
   driver.find_element(By.ID,"kw22").send_keys('selenium')

except NoSuchElementException as e:
   print(e)
finally:
   print(ctime())
   driver.quit()`python
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值