Python Selenium等待的三种方式

分享知识  传递快乐

 

Selenium 设置元素等待的三种方式:

  • 强制等待:time.sleep()
  • 隐式等待:implicitly_wait()
  • 显式等待:WebDriverWait()

 

1、强制等待

强制等待虽然简单明了,但如果设置sleep等待时间过短,元素还没加载出来,程序会报错;如果sleep设置等待时间过长,元素早就加载出来了,程序还在等待,浪费是时间,所以不建议使用。(注:脚本调试过程时使用还是挺方便的)

代码1:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
# 设置等待5秒钟
time.sleep(5)
driver.get('https://cn.bing.com/')

 

2、隐式等待

隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。如果某些元素不是立即可用的,隐式等待是告诉 WebDriver 去等待一定的时间后去查找元素。默认等待时间是0秒,一旦设置该值,隐式等待是设置该 WebDriver 的实例的生命周期。

代码2:

from selenium import webdriver

driver = webdriver.Chrome()
# 隐式等待:直接等待10秒钟下往下执行
driver.implicitly_wait(10) 
driver.get("url")
# 执行定位元素操作
element = driver.find_element_by_id("标签ID")

在代码前部分加 implicitly_wait(10),整个的程序运行过程中都会有效(作用于全局,直接在初始化 driver 的后加,后面的代码都会受影响),都会等待元素加载完成。如果在设置的时间内没有加载到整个页面,则会报 NosuchElementError 异常。如果元素在第10s被加载出来,自动执行下面的脚本,不会一直等待10s。这样的隐式等待会有个坑,有些页面的JS是放在body的最后进行加载,实际这是页面上的元素都已经加载完毕,我们却还在等待全部页面加载结束。

 

3、显式等待

显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码。简单的说就是在指定时间内,一直等待某个条件成立,条件成立后立即执行定位元素的操作;如果超过这个时间条件仍然没有成立,则会抛出异常!显式等待需要使用  selenium.webdriver.support.excepted_conditions 期望条件和 selenium.webdriver.support.ui.WebDriverWait 类来配合完成。

代码3:

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

driver = webdriver.Chrome()
driver.get("url")

locator = (By.ID, "你的标签ID")
WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located(locator))
driver.find_element_by_id("你的标签ID").click()
# 或
element = WebDriverWait(driver, 10).until(expected_conditions.presence_of_element_located((By.ID, "你的标签ID")))
element.click()

显式等待想对执行效率快一些,无需等待整个页面加载完成,只需加载到你要定位的元素就可以执行。但不过就是麻烦,写的代码太多。

 

 

 

 

 

 

—————————
如有不足请留言指正
相互学习,共同进步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章