学院网站建设用户需求分析报告,北京市招标网,wordpress主题会员功能,网站建设电话销售技巧注#xff1a;显示等待和隐式等待不可混用
强制等待
让当前正在执行的代码线程暂停运行。
示例#xff1a;在电商网站的商品搜索页面#xff0c;等待 5 秒之后#xff0c;点击搜索按钮#xff0c;如果页面加载速度很快#xff0c;在 2 秒内生成#xff0c;那么还需要…注显示等待和隐式等待不可混用
强制等待
让当前正在执行的代码线程暂停运行。
示例在电商网站的商品搜索页面等待 5 秒之后点击搜索按钮如果页面加载速度很快在 2 秒内生成那么还需要等待 3 秒直到累计等待 5 秒才会继续执行但如果按钮生成时间超过 5 秒代码继续执行时就可能找不到按钮此时会抛出 NoSuchElementException 异常。
import timetry:# 打开商品搜索页面driver.get(https://www.example.com/search)# 强制等待5秒time.sleep(5)# 查找搜索按钮并点击driver.find_element(By.ID,search_button_id).click()
except NoSuchElementException:print(按钮未找到请检查页面元素或等待时间是否合适。)
隐式等待
在 driver 初始化时设置了等待时间比如 5 秒在整个 driver 的生命周期内每次查找元素时它都会在设定的时间内不断地检查页面如果找到该元素则代码继续执行否则会抛出 NoSuchElementException 异常表示没有在规定时间找到该元素。
示例在电商网站的商品搜索页面输入关键词并点击搜索按钮如果在 5 秒内搜索框和搜索按钮成功加载并被找到代码就会顺利执行。但如果超过 5 秒还没找到就会抛出 NoSuchElementException 异常。
# 设置隐式等待5秒
driver.implicitly_wait(5)try:# 打开商品搜索页面driver.get(https://www.example.com/search)# 查找搜索框并输入关键词driver.find_element(By.ID,search_box_id).send_keys(手机)# 查找搜索按钮并点击driver.find_element(By.ID,search_button_id).click()
except NoSuchElementException:print(页面元素未在规定时间内找到请检查页面或等待时间设置。)
显示等待
在规定时间内不断地检查元素是否满足特定条件一旦满足就立即执行后续操作如果在规定时间没有满足特定条件会抛出 TimeoutException 异常。
预置条件
等待元素可见
示例设置最大等待时间为 10 秒直到指定元素在页面上可见。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.element_to_be_clickable((By.ID,element_id)))等待元素不可见
例设置最大等待时间为 10 秒直到指定元素在页面上不可见。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.invisibility_of_element_located((By.ID,element_id)))
等待元素可点击
例设置最大等待时间为 10 秒直到指定元素变为可点击状态。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.element_to_be_clickable((By.ID,element_id)))
等待文本可见
例设置最大等待时间为 10 秒直到指定元素的文本可见。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.text_to_be_present_in_element((By.ID,element_id),Expected_Text))
等待文本在元素里可见
例设置最大等待时间为 10 秒直到指定文本在元素的值中可见。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.text_to_be_present_in_element_value((By.ID,frame_id),Expected_Title))
等待元素存在
例设置最大等待时间为 10 秒直到指定元素存在 DOM文档对象模型 中。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.presence_of_element_located((By.ID,element_id)))
等待元素消失
例设置最大等待时间为 10 秒直到指定元素从 DOM文档对象模型 中移除。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.staleness_of(driver.find_element(By.ID,element_id)))
URL 包含
例设置最大等待时间为 10 秒直到当前 URL 包含某个特定字符串。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.url_contains(expected_substring))
标题包含
例设置最大等待时间为 10 秒直到当前页面标题包含某个字符串。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.title_contains(Expected Title)))
窗口可见
例设置最大等待时间为 10 秒直到新窗口出现并可见。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.new_window_is_opened(driver.window_handles))
等待切换iframe
例设置最大等待时间为 10 秒直到切换到某个 iframe 元素里。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import ByWebDriverWait(driver, timeout10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,frame_id)))
高级
document.readyState 是表示当前网页状态的属性共有三个状态
loading文档正在加载这个阶段 HTML 结构正在被解析外部资源如样式表、脚本、图片等可能还在下载过程中。interactive文档已经完成解析DOM文档对象模型已经构建完成但是像图片、样式表、脚本等外部资源可能还没有完全加载完成。此时用户已经可以与页面进行交互了例如点击已经存在的 HTML 元素。complete页面的所有资源包括 HTML 结构、脚本、样式表、图片等都已经加载完成整个页面处于完全可用的状态。
设置检查条件的频率
示例总超时时间为 10 秒每 2 秒检查一次页面的 document.readyState 是否为 complete直到页面加载完成。
from selenium.webdriver.support.wait import WebDriverWaitWebDriverWait(driver, timeout10, poll_frequency2).until(lambda d: d.execute_script(return document.readyState) complete)
自动忽略特定异常进行等待
示例在等待特定元素时如果出现 NoSuchElementException 异常会自动忽略该异常继续等待直到找到元素或者超时时间到达。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import NoSuchElementExceptionWebDriverWait(driver, timeout10, ignored_exceptions[NoSuchElementException]).until(lambda d: d.find_element(By.ID, element_id))
自定义超时提示信息
示例在等待页面加载时如果 10 秒内未加载完成会捕获 TimeoutException 异常并打印自定义的超时消息。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutExceptiontry:WebDriverWait(driver, timeout10.until(lambda d: d.execute_script(return document.readyState) complete)
except TimeoutException:print(页面加载超时请检查网络连接。)