from selenium import webdriver # 显示等待-提供等待条件 from selenium.webdriver.support import expected_conditions as ec # 显示等待-显示等待类 from selenium.webdriver.support.ui import WebDriverWait # 显示等待 from selenium.webdriver.common.by import By driver = webdriver.Chrome() # 隐式等待,设置一个超时时间,在这个时间内,不断的寻找元素,超时找不到就抛出异常 # 隐形等待10秒 # driver.implicitly_wait(10) """ 一次声明,终生有效--对其后执行的每一行元素定位都有效 所以,通常在创建driver之后就声明了。 执行逻辑: 当前代码执行元素定位操作的时候,若找得到元素,则继续执行 若找不到元素,则等待0.5秒,然后再找一次,若还是找不到,则又等0.5秒再找 如此循环,知道找到元素,若找到元素,则继续执行代码 若达到超时时间,还是不能找到元素,则抛出timeout异常 隐式等待,需页面全部加载完成再执行,相对浪费时间(页面虽然加载完成了,但是不代表所有元素都出现了 """ driver.get("http://127.0.0.1:8088/login") driver.find_element_by_name("username").send_keys("libai") driver.find_element_by_name("password").send_keys("opmsopms123") driver.find_element_by_class_name("btn-login").click() # 如果代码中存在大量的强制等待,会导致脚本无意义的拉长执行时间 # time.sleep(3) # 可以用智能等待来解决这个问题 # 显示等待:设置一个超时时间和一个元素查找条件,在这个时间内,不断寻找元素,超时找不到就会报错 """ 不需要页面全部加载完成,相对节省时间 只对申明了显示等待的元素生效 """ # 代码量多,且括号多,容易出错,写显示等待代码的时候,多多注意检查 # 每隔1秒 检查一次,最多等待10秒(最大超时时间) ele = WebDriverWait(driver, 10, 1).until( # visibility_of_element_located()里面传一个参数,所以里面的参数需要再加一个() ec.visibility_of_element_located( ( By.CSS_SELECTOR, "body > section > div.left-side.sticky-left-side > div.left-side-inner > ul > li:nth-child(2)") ) ) # 显示等待这一大段,最终就会返回你想寻找的元素(若超时找不到,也会报timeout异常) """ 申明一个隐式等待,全局通用 对于一些加载特别缓慢的元素,设置显示等待,适当为其增加等待时间 当显示等待与隐式等待同时出现的时候,取时间更多的一个生效 """ ele.click()