等待的作用:为了提升自动化成功率
原因:存在网络不稳当可能存在刷新很慢导致找不到元素
第一种:强制等待
import time
time.sleep(3) # 等待3秒
运行到该代码强制停3秒,不能进行判断
第二种隐式等待
# coding = utf-8
from selenium import webdriver
# 驱动文件路径
driverfile_path = r‘D:\chromedriver.exe‘
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r‘https://www.baidu.com/‘)
driver.implicitly_wait(30) # 作用的是driver
# 隐式等待30秒 ;全局等待30(在没有发现该元素的时候等待30秒,在30秒之内发现直接运行,在30内没有继续运行后续代码)
# 必须等待业务全部加载完成才能进行后续操作,或者超时才能继续操作
第三种:显示等待
from selenium.webdriver.support.wait import WebDriverWait
配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx检查一次,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
# coding = utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
# 驱动文件路径
driverfile_path = r‘D:\chromedriver.exe‘
# 启动浏览器
driver = webdriver.Chrome(executable_path=driverfile_path)
# 打开百度首页
driver.get(r‘https://www.baidu.com/‘)
driver.find_element_by_css_selector("#kw").send_keys("selenium")
driver.find_element_by_css_selector("#su").click()
# (driver,30,0.2)超时时间为30秒,每0.2秒检查1次,直到class="tt"的元素出现,否则抛出异常
text = WebDriverWait(driver,30,0.2).until(lambda x:x.find_element_by_css_selector(".tt")).text
# 退出
driver.quit()
# 问题;一次只对一个元素生效
# 当多个等待一起被应用的时候;按照那个等待的时间长就是用那个时间(隐式等待和显示等待同时使用)
# 坑:
1.元素找不到(iframe和句柄的切换,元素定位不熟练,元素会出现动态的情况,等待添加是否合理)
2.代码成功率不高(带宽的问题)
3.不清楚什么时候用什么技术