很多情况下写代码时不加等待时间容易出现定位不到元素的情况,可见等待时间的重要性,下面介绍一下selenium的三种等待方式
1.强制等待----sleep()
不管浏览器是否加载完了,程序都得等待所设置的时间,设置的时间一到,则继续执行下面的代码。
from selenium import webdriver
from time import sleep
dr=webdriver.Chrome()
dr.get("https://www.so.com")
sleep(2) #强制等待2秒再进行下一步
dr.find_element(By.ID,"input").send_keys("selenium")
2.隐性等待----implicitly_wait()
隐性等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。如果在设置的时间内元素依然没有被加载出来,那就会报错。隐性等待对整个driver的周期都起作用,所以只要设置一次即可,不必像sleep一样每一步设置一次。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
dr=webdriver.Chrome()
dr.implicitly_wait(20) #设置等待20s
dr.get("https://www.so.com")
3.显性等待----WebDriverWait
显性等待时间可以通过WebDriverWait 和util来决定,如果该元素在设置的等待时间以内出现就不再等待,然后执行下一步,如果在设置的时间内没有加载出则会报TimeoutException错误。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
dr=webdriver.Chrome()
dr.implicitly_wait(20) #设置等待20s
dr.get("https://www.so.com")
element = WebDriverWait(dr,30).until(lambda dr:dr.find_element(By.ID,"input")) #设置显性等待时间
element.send_keys("selenium自动化")
*上述例子用到了lambda函数,简单介绍一下lambda是一个匿名函数,不需要定义的函数,只做简单运算,并返回值,没有复杂的函数体。