为何需要等待元素呢?
1、 某些元素或者操作,只有在加载完成后才能够正确定位到。
2、 若是元素还没有加载出来,就执行查询该元素的代码,就会出现错误:no such element
1、元素等待方式一:sleep()强制等待
【语法实现】
time.sleep(5)
单位是s,线程直接进入休眠,这几秒内啥事也不用干
from time import sleep
sleep(5)
【优点】
【缺点】
- 休眠时间不好把握:
-
- 如果设置休眠时间过短,休眠结束元素还没有加载出来,会导致程序报错;
-
- 如果设置休眠时间过长,元素已经加载出来程序还在继续等待,会造成时间浪费,影响代码的整体运行效率。
2、元素等待方式二:隐式等待implicitly_wait()
driver.implicitly_wait(5)
- 默认是0s等待,设置之后的值是最大超时时间,等待时间为整个页面全部加载完成的时间
优点
- 作用于全局:在初始化driver后面加,后面的代码都会受到影响
- 设置的时间为
整个页面
的最大加载时长,非必须等待时长(如果在设置的最大超时时间之前整个页面已经加载完成,就会立即执行下面的脚本)
缺点
- 在设置的最大超时时间结束后仍然没有加载到整个页面,就会报错:no such element
3、元素等待方式三:显式等待WebDriverWait()
- 等待
指定元素
,等到就可以返回元素对象;在超时时间到达之后仍未等到,那么就抛出异常:TimeoutException。
- 简而言之,就是直到元素出现就去操作,如果超时就抛出异常。
- WebDriverWait()的结果返回定位到的元素
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
element = WebDriverWait(自定义浏览器驱动名称, 最大超时时间, 检测的时间间隔).until(定位元素的方法, 错误信息)
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
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element(By.ID, 'kw').send_keys("python自动化")
driver.find_element(By.CSS_SELECTOR, '#su').click()
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "办公")), '没有找到元素')
element.click()
sleep(5)
driver.quit()
3.1 导入excepted_conditions 模块
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
- 判断一个元素是否存在。如:如何判断alert弹窗出来了;如何判断冬天的元素等
3.1.1 title_is()
- 判断当前页面的title是否
完全等于(==)预期字符串
,返回结果为布尔类型
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
result = EC.title_is('百度一下,你就知道')(driver)
print(result)
3.1.2 title_contains()
- 判断当前页面的标题是否
包含预期字符串
,返回结果为布尔类型
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
result2 = EC.title_contains('知道')(driver)
print(result2)
3.1.3 presence_of_element_located()方法
def presence_of_element_located(locator: Any) -> (driver: {find_element}) -> Any
An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible.
locator - used to find the element returns the WebElement once it is located
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(自定义浏览器驱动名称, 最大超时时间, 检测的时间间隔).until(EC.presence_of_element_located((By.属性名, '属性值'), 错误信息)
- 一种 WebDriverWait 方法,用于等待某个元素出现在页面上。它可以通过在页面上查找元素来判断页面是否加载完成。
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
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element(By.ID, 'kw').send_keys("python自动化")
driver.find_element(By.CSS_SELECTOR, '#su').click()
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "办公")), '没有找到元素')
element.click()
sleep(5)
driver.quit()