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

此例子可以实现,点击某个按钮

posted @ 2020-11-09 17:03  天天眠眠  阅读(210)  评论(0编辑  收藏  举报