09 selenium中的等待机制

106 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

「selenium实战专栏」将记录selenium实战(Python版)过程,以及各类问题的解决方案。

大致规划如下:

  • 利用Element UI组件库联系对各种元素的操作
  • 利用一个真实网站进行部分页面UI自动化实战

使用版本如下:

  • Python 3.10.6
  • selenium 4.0.5

本章来介绍selenium开发过程中用到的最多的几种等待方式,因为页面的加载是需要时间的,所以为了脚本的稳定性,通常都需要设置等待时间。目前主要有三种等待方式,强制等待、隐式等待和显式等待。

强制等待

首先是python提供的内置方法time.sleep(n),n为具体的等待时间,单位:秒。

这种等待方式比较“粗暴”,固定了具体的等待时间,如果页面加载很快,就会浪费等待时间,如果页面加载的很慢,同样会再次导致超时。不够灵活,一般不建议使用。

隐式等待

driver.implicitly_wait(n),n为具体的等待时间,单位:秒。通过上一章的方式运行脚本,查看控制台日志,可以看到其底层逻辑。

W3C WebDriver官网上我们可以了解到timeouts作用。

我们可以很清楚的看到W3C WebDriver协议中timeouts其实有三种。分别是Script timeoutPage load timeoutImplicit wait timeout。一个是脚本运行的操作时间,一个页面加载超时时间,一个元素定位超时时间,可以看到这些超时时间都是针对整个Session的。一般只需要设置一次,就是在页面加载之后。

显式等待

显式等待通常是和具体的条件配合使用的,比如下面这段代码:

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, 'example-showcase1')))

运行脚本,查看控制台日志。

可以从日志中很清楚的看到,隐式等待W3C WebDriver本身提供的协议支持。但是并没有提供用于显式等待的协议,这是selenium提供的功能,查看until的源代码,如下。

主要逻辑就是不断的通过请求http://chromdriver-server:port/session/{sessionId}/elements/查找元素,直到满足条件或者达到超时时间。

条件都在expected_conditions中进行定义的,感兴趣的可以自己查看源代码,这里主要说明上面代码中用到的visibility_of_all_elements_located

从上面的源代码可以看出,它就是提供了一个方法,用于上面循环时去调用。主要的逻辑就是查找元素,判断是否所有的元素都处于可见状态。