webdriver三种等待方法
import time
time.sleep()
sleep()顾明思义就是睡觉的意思,就是脚本一旦执行到条语句sleep(10)就睡10s,再执行后面的语句,他是一个强制等待的方式,使得整个脚本暂停。但是这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用,特殊情况下,时间设置最好不超过1秒,一般0.5秒
driver.implicitly_wait(10)
implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完),implicitly_wait(10),超时时间10s,10秒内一旦加载完成,就执行下一条语句;如果10秒内页面都没有加载完,就超时抛出异常,针对的是页面内全部的元素,必须是全部的元素都加载到dom中才会执行下一条语句。缺点就是如果你只是定位某一个元素,这个元素很快就加载好了,但是页面内有部分元素是通过ajax请求生成的元素,那么就会一直要等待他们也加载完成才行。
显示等待的方法 WebDriverWait
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.ID,'KW')))
这个是显示等待,可以针对某个元素定位,不浪费任何时间。
下面咱们举个小栗子:
#coding=utf-8 import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.bilibili.com/video/av24004208/") driver.implicitly_wait(20) #隐式设置20秒,应该可以让全部的元素加载到dom中 num = len(driver.find_elements_by_xpath('//*[@class="list-box"]/li')) for i in range(num): try: path = '//*[@class="list-box"]/li['+str(i+1)+']' driver.find_element_by_xpath(path).click() time.sleep(2) except Exception as e: print(e) finally: pass
此例子可以实现,B站中,循环点击列表中的每一个按钮
import time
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://www.bilibili.com/video/av24004208/") try: element = WebDriverWait(driver, 10,0.2).until( EC.presence_of_element_located((By.XPATH, '//*[@class="list-box"]/li/a[@title="p1"]')) ) element.click() time.sleep(5) except Exception as e: print(e) finally: pass
此例子可以实现,点击某个按钮