Python selenium 三种等待方式详解

一、显式等待(WebDriverWait)

显示等待是等某个元素加载后再执行后续代码,超过设置的时间,然后抛出TimeOutException

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("https://www.youtube.com/")
try:
	# 超时时间为2秒,每0.2秒检查1次,直到元素出现
    element = WebDriverWait(driver, 2,0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@id='logo-icon-container']")))
finally:
    print("请求超时")
    driver.quit()
1、WebDriverWait
  • __ init __
 - driver  WebDriver实例 (Ie, Firefox, Chrome or Remote)
 - timeout  超时前的秒数,	等待的最长的时间(同时要考虑隐式等待)
 - poll_frequency 调用until或until_not中的方法的间隔时间,默认为0.5秒
 - ignored_exceptions调用期间忽略异常类,默认只有NoSuchElementException
  • until
method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常
  • until_not
与until相反,until是当某元素出现或什么条件成立则继续执行,
 until_not是当某元素消失或什么条件不成立则继续执行,参数也相同,不再赘述。

那么 WebDriverWait的调用的方法如下

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

WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)

这里需要注意的是 until 和 until_not 中的method 参数一定是可以调用的,记这个对象一定有_call_()方法,否则会抛出异常:

TypeError: ‘xxx’ object is not callable

2、expected_conditions

expected_conditions模块中提供了很多可以提供判断的条件:

以下两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, ‘kw’)
顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行

presence_of_element_located  

presence_of_all_elements_located  

以下三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
第一个和第三个其实质是一样的

visibility_of_element_located     

invisibility_of_element_located  

visibility_of  

以下两个条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value

text_to_be_present_in_element 

text_to_be_present_in_element_value

以下条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement

frame_to_be_available_and_switch_to_it

以下条件判断是否有alert出现

alert_is_present

以下条件判断元素是否可点击,传入locator

element_to_be_clickable

以下四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
第三个传入WebElement对象以及状态,相等返回True,否则返回False
第四个传入locator以及状态,相等返回True,否则返回False

element_to_be_selected 

element_located_to_be_selected 

element_selection_state_to_be 

element_located_selection_state_to_be

最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了

staleness_of

二、隐式等待(implicitly_wait())

  • 优点:相比sleep() ,隐性更加智能,它会在你设置的时间内判断网页是否加载完成,如果完成了,就进行下一步;在设置的时间内没有加载完成,则会报超时加载;
  • 缺点:随着ajax技术的广泛应用,页面的元素往往都可以局部加载,也就是在整个页面没有加载完的时候,可能我们需要的元素已经加载完成了,那就么有必要再等待整个页面的加载
from selenium import webdriver

driver = webdriver.Chrome()  
driver.implicitly_wait(20) # 隐性等待,最长等30秒  
driver.get('https://www.baidu.com')
driver.quit()

注意:

1.隐性等待的设置时全局性的,在开头设置过之后,整个的程序运行过程中都会有效,都会等待页面加载完成;不需要每次设置一遍;
2.页面加载完成后新打开的弹窗是没有等待效果的

三、强制等待(sleep())

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
time.sleep(3) # 隐性等待,最长等30秒
print(driver.current_url)
driver.quit()

设置等待最简单的方法就是强制等待,其实就是time.sleep()方法,不管它什么情况,让程序暂停运行一定时间,时间过后继续运行;缺点时不智能,设置的时间太短,元素还没有加载出来,那照样会报错;设置的时间太长,则会浪费时间,不要小瞧每次几秒的时间,case多了,代码量大了,很多个几秒就会影响整体的运行速度了;所以尽量少用这个

你可能感兴趣的:(Selenium,+Python学习)