找回密码
 立即注册
首页 业界区 科技 selenium之三种等待方式

selenium之三种等待方式

创蟀征 2025-6-7 10:42:35
等待方式

在使用selenium进行自动化的时候,可能会发生一下问题;就是你代码想要使用的元素因为网络原因还没有加载出来,这个时候,因为找不到对应的元素,代码就会报错;所以我们要在代码中使用等待的方式,来解决这个问题;
selenium等待分为以下三种

  • 死等,sleep
  • 隐式等待,implicitly_wait
  • 显示等待,WebdriverWait
废话不多说,让我们实践以下,看看他们究竟有什么区别
死等

可以看到,浏览器打开网址后,点击了按钮;之后等了5s后,输入了内容
如果不使用sleep(),代码就会因为找不到输入框而报错
但是呢,这种方式有个弊端;那就是你不知道要等多久;可能到达了你设置的时间,还是没有显示出来;另外也会导致脚本运行时间变得很长;因此有了下面的隐式等待、显示等待
  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.chrome.service import Service
  4. from selenium.webdriver.common.by import By
  5. serve_path = r'D:\Code_Study\driver\chromedriver-win64\chromedriver.exe'
  6. service = Service(serve_path)
  7. browser = webdriver.Chrome(service=service)
  8. # 访问网站
  9. browser.get(f'https://www.selenium.dev/selenium/web/dynamic.html')
  10. # 死等sleep,需要引入time模块
  11. # 顾名思义,就是什么也不做,干等着
  12. # 首先,点击按钮;点击后会有一个输入框弹出来;我们去输入内容
  13. element = browser.find_element(By.ID, "reveal")
  14. element.click()
  15. # 暂停5s,找到输入框,输入内容
  16. time.sleep(5)
  17. element = browser.find_element(By.ID, "revealed")
  18. element.send_keys('hahaha')
  19. browser.quit()
复制代码
隐式等待

是selenium的一种自动等待元素的内置方法,它是一个全局设置,适用于整个会话中的每次调用。默认0;
需要注意的是,一旦找到了元素,就会继续执行代码;打个比方就是你设置了10s,实际3s就出来了;那么剩下的7s就不算在整个运行时间了
可以看到下面的代码,我在访问网站的时候,就设置了隐式等待5s;这样的话就是点击按钮前、和输入之前都会进行等待
但是实际效果,就是很快就点开了,所以并没有等待5s;所以最后一行加了sleep(),可以直观的看出来确实是输入了内容
  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.service import Service
  3. from selenium.webdriver.common.by import By
  4. serve_path = r'D:\Code_Study\driver\chromedriver-win64\chromedriver.exe'
  5. service = Service(serve_path)
  6. browser = webdriver.Chrome(service=service)
  7. # 访问网站
  8. browser.get(f'https://www.selenium.dev/selenium/web/dynamic.html')
  9. # 隐式等待implicitly_wait
  10. browser.implicitly_wait(5)
  11. # 首先,点击按钮;点击后会有一个输入框弹出来;我们去输入内容
  12. element = browser.find_element(By.ID, "reveal")
  13. element.click()
  14. element = browser.find_element(By.ID, "revealed")
  15. element.send_keys('hahaha')
  16. time.sleep(10)
复制代码
显示等待

也叫明确等待,是添加到代码中的循环;在退出循环并继续执行下一个命令之前,会轮询代码,从而确定条件是否为真,如果在指定的超时值之前没有满足条件,代码就会超时错误;
下面就让我们一探究竟,WebDriverWait主要有以下两个方法

  • until,等待直到条件成立;返回True、None

    • 适用于等待某个元素出现、可见、可点击

  • until_not,等待直到条件不成立,返回False、None

    • 适用于等待某个元素消失、属性变化、弹窗关闭等

  1. # 首先引入,WebDriverWait需要配合EC使用
  2. from selenium.webdriver.support.wait import WebDriverWait
  3. from selenium.webdriver.support import expected_conditions as EC
  4. element = browser.find_element(By.ID, "reveal")
  5. element.click()
  6. # 初始化WebDriverWait 搭配EC等待条件
  7. input_str = WebDriverWait(browser, timeout=10).until(
  8.     EC.visibility_of_element_located((By.ID, 'revealed')))
  9. input_str.send_keys('hahaha')
  10. time.sleep(5)
  11. browser.quit()
复制代码
常见EC条件

我放下面了, 就不一一显示了,感兴趣的可以自己尝试
  1. title_is----判断title,是否出现
  2. title_contains----判断title,是否包含某些字符
  3. presence_of_element_located----判断某个元素是否被加到了dom树里,并不代表该元素一定可见
  4. visibility_of_element_located----判断某个元素是否被添加到了dom里并且可见,宽和高都大于0
  5. visibility_of----判断元素是否可见,如果可见就返回这个元素
  6. presence_of_all_elements_located----判断是否至少有1个元素,存在于dom树中
  7. visibility_of_any_elements_located----判断是否至少有一个元素再页面中可见
  8. text_to_be_present_in_element----判断指定的元素中是否包含了预期的字符串
  9. text_to_be_present_in_element_value----判断指定元素的属性值中是否包含了预期的字符串
  10. frame_to_be_available_and_switch_to_it----判断该frame是否可以switch进去
  11. invisibility_of_element_located----判断某个元素是否存在于dom或者不可见
  12. element_to_be_clickable----判断某个元素中给是否可见并且是enable的 ,代表可点击
  13. staleness_of----等待某个元素从dom树中移除
  14. element_to_be_selected----判断某个元素是否被选中了,一般用在下拉列表
  15. element_selection_state_to_be----判断某个元素的选中状态是否符合预期
  16. element_located_selection_state_to_be----判断某个元素的选中状态是否符合预期
  17. alert_is_present----判断页面上是否存在alert
复制代码
那么既然有了隐式等待,为什么还需要显示等待呢;这就要看它们两个的区别了
WebDriverWait+ECimplicitly_wait类型显示等待(针对特定条件)隐式等待(全局等待)灵活性可以自定义等待条件只能设置固定超时时间推荐使用推荐,更精准,避免不必要的等待不推荐,不够灵活,可能影响性能
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册