相关文章推荐
玩滑板的凉面  ·  Selenium ...·  1 周前    · 
考研的丝瓜  ·  JavaScript ...·  10 月前    · 
不拘小节的毛巾  ·  javascript - Limit ...·  1 年前    · 
潇洒的蚂蚁  ·  android - ...·  1 年前    · 

一、前言


selenium中有三种时间等待:

  • 强制等待: sleep
  • 隐式等待: implicitly_wait
  • 显示等待: WebDriverWait

其中,这三种方法各有优缺点: image.png


二、强制等待


让程序暂停运行一定的时间,等待时间达到要求的时间后继续运行。

使用前,需要先导入time模块:

import time

在前面的文章中,已经多次使用过,这里就不做演示了。

需要注意的是,对于定位不到元素的时候,从耗时方面来讲, 隐式等待 强制等待 没什么区别。


三、隐式等待


implicitly_wait() 默认参数的单位为秒,默认值为0。

如果在最大超时时间内找到元素了,会开始执行下一操作,未找到元素,则会抛出 NoSuchElementException 异常。

以百度为例:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
# 访问百度
driver.get('https://baidu.com')
start = time.time()
# 设置最大等待时间为3秒
driver.implicitly_wait(3)
    # 使用id定位一个不存在的元素
    driver.find_element(By.ID, 'yyds')
except Exception as exception:
    # 打印异常
    print(exception)
    # 打印程序运行时间
    print(f'耗时:{time.time()-start}')
# 关闭所有页面
driver.quit()

099eb95220b1434aa665cda2a8ea1103.gif


四、显示等待


需要导入模块:

from selenium.webdriver.support.ui import WebDriverWait

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)


driver: 传入WebDriver实例;

timeout:指最大超时时间,默认单位为秒;

poll_frequency:调用until或until_not方法,每隔一定时间不断尝试是否能找到页面元素,默认间隔是0.5s,可自行调整间隔时间。

ignored_exceptions:超时后的异常信息,默认情况下NoSuchElementException 异常。

WebDriverWait一般和until()和until_not()配合使用:


until() 当某元素出现 或 某条件成立则继续执行

until_not 当某元素消失 或 某条件不成立则继续执

until或until_not中的method参数一定要是可以调用的对象,我们可以用selenium提供的expected_conditions,提供一些场景的判断。

但使用 expected_conditions ,需先导入:

from selenium.webdriver.support import expected_conditions as EC

常用的 expected_conditions 方法如下: image.png

以百度为例:

  • 定位一个存在的元素:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
# 访问百度
driver.get('https://www.baidu.com')
# 设置显式等待,超时时长最大为5s,每隔1s查找元素一次
# 根据id定位到元素位置
element = WebDriverWait(driver, 5, 1).until(
    EC.presence_of_element_located(('id', 'kw')))
# 在定位到的地方,输入CSDN
element.send_keys('CSDN')

d0e0cce747884a0f97ad6ea38c58ee46.gif

  • 定位一个不存在的元素
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
# 访问百度
driver.get('https://www.baidu.com')
# 设置显式等待,超时时长最大为5s,每隔1s查找元素一次
# 根据id定位到元素位置
element = WebDriverWait(driver, 5, 1).until(
    EC.presence_of_element_located((By.ID, 'csdn')), message='超时了哟。。。')

得到提示:

selenium.common.exceptions.TimeoutException: Message: 超时了哟。。。

五、参考文章


Selenium自动化测试-设置元素等待

Selenium 如何定位 JavaScript 动态生成的页面元素
Selenium 是一个自动化测试工具,可以用来模拟浏览器的操作,如点击、输入、滚动等。但是有时候,我们需要定位的页面元素并不是一开始就存在的,而是由 JavaScript 动态生成的。这时候,如果我们直接用 Selenium 的 find_element 方法去定位元素,可能会出现找不到元素的错误,因为页面还没有加载完成。为了解决这个问题,我们需要使用一些特定的定位技巧,让 Selenium 等待元素出现后再进行操作。
Selenium Web驱动程序和Java元素在(x,y)点处不可单击其他元素将获得点击?
Selenium Web驱动程序和Java元素在(x,y)点处不可单击其他元素将获得点击?
Selenium之操作浏览器、元素等待、窗体切换和弹窗处理
最常用的几个方法: clear() 清除文本,send_keys(*values) 模拟按键输入,click() 单击元素, submit() 用于提交表单,有时候可以与click()方法互换使用。