Python + Selenium(三)- 等待的三种方式与区别

文章目录

      • 等待的三种方式:
        • 强制等待
        • 隐式等待
        • 显式等待
          • 显式等待的条件
          • 显示等待的原理
          • 其他等待条件:
        • 三种等待方式总结:

等待的三种方式:

强制等待

import time 
# 强制等待2s
time.sleep(2)

隐式等待

# 如果获取不到元素,在后台等待30s,30s之后如果还没有获取到就报错
driver.implicitly_wait(30)

显式等待

# 显式等待:
# 第一步:创建一个等待计时器对象,0.5s看一次,最多等待30s
wait = WebDriverWait(driver, 30, 0.5)
# 第二步:元素的定位方式和定位表达式
locate = (By.XPATH, "//a[text()='新闻']")
# 第三步:设置等待的条件
condition = EC.visibility_of_element_located(locate)
# 第四步:开始等待                    
wait.until(condition)

# 将上面的写在一起
WebDriverWait(driver, 30, 0.5).until(
    EC.visibility_of_element_located(
        (By.XPATH, "//a[text()='新闻']")
    )
)
显式等待的条件
  • visibility_of_element_located :元素可见
  • element_to_be_clickable : 元素可点击
显示等待的原理
def wait_element_xpath(driver,locator,timeout,poll_frequecy=0.2):
	time_use = 0
	while time_use < timeout:
		try:
			e = driver.find_element_by_xpath(locator)
			if e.is_diaplay():
				return e
			else:
				raise error
		except:
			time.sleep(poll_frequecy)	
			timeout += poll_frequecy
其他等待条件:
等待条件 含义
title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 节点加载出,传入定位元组,如 (By.ID, ‘p’)
visibility_of_element_located 节点可见,传入定位元组
visibility_of 可见,传入节点对象
presence_of_all_elements_located 所有节点加载出
text_to_be_present_in_element 某个节点文本包含某文字
text_to_be_present_in_element_value 加载并切换
invisibility_of_element_located 节点不可见
element_to_be_clickable 节点可点击
staleness_of 判断一个节点是否仍在 DOM,可判断页面是否已经刷新
element_to_be_selected 节点可选择,传节点对象
element_located_to_be_selected 节点可选择,传入定位元组
element_selection_state_to_be 传入节点对象以及状态,相等返回 True,否则返回 False
element_located_selection_state_to_be 传入定位元组以及状态,相等返回 True,否则返回 False
alert_is_present 是否出现 Alert

三种等待方式总结:

  • 强制等待:傻瓜式等待,不智能
  • 隐式等待:全局通用,只需设置一次,很智能(等到了就走,不会浪费时间),不足之处:只能用来查找元素,等待元素是否能找到。
  • 显式等待:等待元素处于特定条件的时候使用,很智能(等到了就走,不会浪费时间)
  • 问题:工作中什么时候用隐式等待,什么时候用显式等待?
    • 隐式是通用的,创建好driver之后就设置好,如果隐式等待代码出错了,根据错误的条件,加上对应的显式等待。
  • 问题二:为什么要加等待?
    • 提高程度的稳定性(不会因为网络,页面加载元素慢,导致找不到元素,代码执行报错)

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