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()