为何需要等待元素呢?
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( )