selenium库的使用(七):隐性等待和显性等待

如果浏览器页面没有加载出定位元素,则引发元素不可见异常,添加等待时间能很好的解决这个问题:强制等待(time.sleep) 、selenium提供的 隐性等待显性等待

参考文档

参考文档

强制等待

1
2
3
4
import time

# 等待2s
time.sleep(2)

隐性等待

指定一个最长等待时间,期间定位元素如果被加载出来,则返回定位元素,执行下一步操作需等待页面被全部加载完毕或等到时间截至;规定时间内未找到则引发超时异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import time
from selenium import webdriver

driver = webdriver.Chrome()

# 隐性等待,只需设置一次
driver.implicitly_wait(20)
# 访问页面
driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')

# 定位元素
单击 = driver.find_element_by_id('d')
# 页面加载完毕时执行下一步
单击.click()

time.sleep(5)

# 退出驱动并关闭浏览器
driver.quit()

显性等待

指定一个最长等待时间,期间定位元素如果被加载出来,则返回定位元素,立即执行下一步操作,不必等待页面被全部加载;规定时间内未找到则引发超时异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import time
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.gaoyuanqi.cn/python-html-1/#more')

# 显性等待,最长10秒,每隔0.1秒查询一次(默认0秒)
wait = WebDriverWait(driver, 10 , 0.1)

# 等待 单击按钮 加载出来
单击 = wait.until(EC.presence_of_element_located((By.ID, 'd')))
# 加载出来时立即执行下一步
单击.click()

time.sleep((5))

# 退出驱动并关闭浏览器
driver.quit()
  • WebDriverWait :显性等待类,它有两个方法:

    until() :规定时间内定位元素 被加载出来时立即执行下一步
    until_not :规定时间内定位元素 没有 被加载出来时立即执行下一步

  • presence_of_element_located() 是等待条件之一

等待条件

标题

页面标题与期望标题是否一致

如果标题一致则返回True,否则返回false

1
EC.title_is(title)

title :一个期望标题,必须是完全匹配的

页面标题是否包含大小写敏感的子字符串的期望标题

如果包含则返回True,否则返回false

1
EC.title_contains(title)

title :一个期望的标题片段

url

当前url是否包含大小写敏感的子字符串的期望url

如果包含则返回True,否则返回false

1
EC.url_contains(url)

url :一个期望的url片段

当前url与期望url的正则表达式匹配

如果url匹配则返回True,否则返回false

1
EC.url_matches(pattern)

pattern :一个期望的正则表达式模式,必须是完全匹配的

当前url与期望url是否一致

如果url一致则返回True,否则返回false

1
EC.url_to_be(url)

url :一个期望url,必须是完全匹配的

当前url与期望url是否不相同

如果url不相同则返回True,否则返回false

1
EC.url_changes(url)

url :一个期望url,不能是完全匹配的

文本

给定文本是否存在于指定元素中

如果存在则返回True,否则返回False

1
EC.text_to_be_present_in_element(locator, text_)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')
text_ :一个期望文字

给定文本是否存在于元素的定位器中

即元素里面的属性值是否存在
如果存在则返回True,否则返回False

1
EC.text_to_be_present_in_element_value(locator, text_)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')
text_ :一个期望文字

元素

元素是否可见并启用

以便可点击
如果可见并且启用就返回WebElement

1
EC.element_to_be_clickable(locator)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')

元素是否存在于页面的DOM中

即元素是否加载出,这个元素不一定可见
当元素被定位就返回WebElement

1
EC.presence_of_element_located(locator)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')

是否至少有一个元素存在

即是否至少有一个元素加载出来
当加载出的元素被定位,返回它们的列表,以WebElement为项

1
EC.presence_of_all_elements_located(locator)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')

元素是否存在于页面的DOM中并且可见

即一个元素是否加载出并且可见,可见性意味着该元素不仅显示,而且高度和宽度大于0
当元素被定位且可见就返回WebElement

1
EC.visibility_of_element_located(locator)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')

一个在页面DOM中的元素是否可见

即已经加载出的一个元素是否可见,可见性意味着该元素不仅显示,而且高度和宽度大于0
当元素可见就返回(相同的)WebElement

1
EC.visibility_of(element)

element :WebElement对象,如 driver.find_element_by_id('d')driver.find_element(By.ID,'d')

所有元素是否存在于页面的DOM中并且可见

即所有元素是否加载出并且可见,可见性意味着该元素不仅显示,而且高度和宽度大于0
当所有元素被定位并且可见,返回它们的列表,以WebElement为项

1
EC.visibility_of_all_elements_located(locator)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')

是否至少有一个元素可见

当可见的元素被定位,返回它们的列表,以WebElement为项

1
EC.visibility_of_any_elements_located(locator)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')

元素是否被选中

比如用于单选框或复选框或下拉列表
如果被选中则返回True,否则返回False

1
2
EC.element_located_to_be_selected(locator)
EC.element_to_be_selected(element)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')
element :WebElement对象,如 driver.find_element_by_id('d')driver.find_element(By.ID,'d')

元素的选中状态是否符合预期

如果符合预期则返回True,否则返回False

1
2
EC.element_located_selection_state_to_be(locator, is_selected)
EC.element_selection_state_to_be(element, is_selected)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')
element :WebElement对象,如 driver.find_element_by_id('d')driver.find_element(By.ID,'d')
is_selected :一个布尔值,即 True(被选中) 或 False(没有选中)

元素是否在DOM中不可见或不存在

如果元素不可见或不存在就返回WebElement

1
2
EC.invisibility_of_element_located(locator)
EC.invisibility_of_element(element)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')
element :一个定位符(文本)或WebElement对象,如driver.find_element_by_id('d')driver.find_element(By.ID,'d')

元素是否不在DOM上

可判断页面是否刷新
如果元素不在DOM上则返回True,否则返回False

1
EC.staleness_of(element)

element :WebElement对象,如driver.find_element_by_id('d')driver.find_element(By.ID,'d')

窗口

期望窗口数为某一数值

如果符合期望则返回True,否则返回False

1
EC.number_of_windows_to_be(num_windows)

num_windows :一个预期的窗口数量

是否新增窗口

如果新增窗口则返回True,否则返回False

1
EC.new_window_is_opened(current_handles)

current_handles :当前的窗口句柄,如 driver.window_handles

是否出现弹窗

如果出现弹窗则返回Alert,否则返回False

1
EC.alert_is_present()

iframe

给定的iframe是否可以切换

如果该iframe是可用的则返回True并且将给定的驱动切换到指定的iframe,否则返回False

1
EC.frame_to_be_available_and_switch_to_it(locator)

locator :用于查找元素的定位器,如定位元组 (By.ID,'d')