selenium之三种等待方式
等待方式在使用selenium进行自动化的时候,可能会发生一下问题;就是你代码想要使用的元素因为网络原因还没有加载出来,这个时候,因为找不到对应的元素,代码就会报错;所以我们要在代码中使用等待的方式,来解决这个问题;
selenium等待分为以下三种
[*]死等,sleep
[*]隐式等待,implicitly_wait
[*]显示等待,WebdriverWait
废话不多说,让我们实践以下,看看他们究竟有什么区别
死等
可以看到,浏览器打开网址后,点击了按钮;之后等了5s后,输入了内容
如果不使用sleep(),代码就会因为找不到输入框而报错
但是呢,这种方式有个弊端;那就是你不知道要等多久;可能到达了你设置的时间,还是没有显示出来;另外也会导致脚本运行时间变得很长;因此有了下面的隐式等待、显示等待
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
serve_path = r'D:\Code_Study\driver\chromedriver-win64\chromedriver.exe'
service = Service(serve_path)
browser = webdriver.Chrome(service=service)
# 访问网站
browser.get(f'https://www.selenium.dev/selenium/web/dynamic.html')
# 死等sleep,需要引入time模块
# 顾名思义,就是什么也不做,干等着
# 首先,点击按钮;点击后会有一个输入框弹出来;我们去输入内容
element = browser.find_element(By.ID, "reveal")
element.click()
# 暂停5s,找到输入框,输入内容
time.sleep(5)
element = browser.find_element(By.ID, "revealed")
element.send_keys('hahaha')
browser.quit()隐式等待
是selenium的一种自动等待元素的内置方法,它是一个全局设置,适用于整个会话中的每次调用。默认0;
需要注意的是,一旦找到了元素,就会继续执行代码;打个比方就是你设置了10s,实际3s就出来了;那么剩下的7s就不算在整个运行时间了
可以看到下面的代码,我在访问网站的时候,就设置了隐式等待5s;这样的话就是点击按钮前、和输入之前都会进行等待
但是实际效果,就是很快就点开了,所以并没有等待5s;所以最后一行加了sleep(),可以直观的看出来确实是输入了内容
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
serve_path = r'D:\Code_Study\driver\chromedriver-win64\chromedriver.exe'
service = Service(serve_path)
browser = webdriver.Chrome(service=service)
# 访问网站
browser.get(f'https://www.selenium.dev/selenium/web/dynamic.html')
# 隐式等待implicitly_wait
browser.implicitly_wait(5)
# 首先,点击按钮;点击后会有一个输入框弹出来;我们去输入内容
element = browser.find_element(By.ID, "reveal")
element.click()
element = browser.find_element(By.ID, "revealed")
element.send_keys('hahaha')
time.sleep(10)显示等待
也叫明确等待,是添加到代码中的循环;在退出循环并继续执行下一个命令之前,会轮询代码,从而确定条件是否为真,如果在指定的超时值之前没有满足条件,代码就会超时错误;
下面就让我们一探究竟,WebDriverWait主要有以下两个方法
[*]until,等待直到条件成立;返回True、None
[*]适用于等待某个元素出现、可见、可点击
[*]until_not,等待直到条件不成立,返回False、None
[*]适用于等待某个元素消失、属性变化、弹窗关闭等
# 首先引入,WebDriverWait需要配合EC使用
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = browser.find_element(By.ID, "reveal")
element.click()
# 初始化WebDriverWait 搭配EC等待条件
input_str = WebDriverWait(browser, timeout=10).until(
EC.visibility_of_element_located((By.ID, 'revealed')))
input_str.send_keys('hahaha')
time.sleep(5)
browser.quit()常见EC条件
我放下面了, 就不一一显示了,感兴趣的可以自己尝试
title_is----判断title,是否出现
title_contains----判断title,是否包含某些字符
presence_of_element_located----判断某个元素是否被加到了dom树里,并不代表该元素一定可见
visibility_of_element_located----判断某个元素是否被添加到了dom里并且可见,宽和高都大于0
visibility_of----判断元素是否可见,如果可见就返回这个元素
presence_of_all_elements_located----判断是否至少有1个元素,存在于dom树中
visibility_of_any_elements_located----判断是否至少有一个元素再页面中可见
text_to_be_present_in_element----判断指定的元素中是否包含了预期的字符串
text_to_be_present_in_element_value----判断指定元素的属性值中是否包含了预期的字符串
frame_to_be_available_and_switch_to_it----判断该frame是否可以switch进去
invisibility_of_element_located----判断某个元素是否存在于dom或者不可见
element_to_be_clickable----判断某个元素中给是否可见并且是enable的 ,代表可点击
staleness_of----等待某个元素从dom树中移除
element_to_be_selected----判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be----判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be----判断某个元素的选中状态是否符合预期
alert_is_present----判断页面上是否存在alert那么既然有了隐式等待,为什么还需要显示等待呢;这就要看它们两个的区别了
WebDriverWait+ECimplicitly_wait类型显示等待(针对特定条件)隐式等待(全局等待)灵活性可以自定义等待条件只能设置固定超时时间推荐使用推荐,更精准,避免不必要的等待不推荐,不够灵活,可能影响性能
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]