文章目录
前言:为什么需要等待
由于代码的执行速度 远远大于 浏览器的渲染速度,导致元素定位不到。
常见的情况:①有frame ②ajax请求局部刷新,元素才生成
1.强制等待
顾名思义,强制等待,时间到了然后才能执行,就是线程阻塞。
导入time模块
import time
弊端
大量使用强制等待,降低脚本执行速度
一个例子
效果:打开浏览器,请求百度官网,然后等待5秒,关闭浏览器
# 导入time模块,使用它的sleep()方法
import time
# 从selenium导入webdriver模块
from selenium import webdriver
# 创建一个chrome驱动
driver = webdriver.Chrome()
# get请求
driver.get("http://www.baidu.com")
# 强制等待5秒,单位是秒
time.sleep(5)
# 关闭浏览器
driver.quit()
2.隐式等待
全局生效,如果超过规定的时间,元素还未加载完成,就往后执行。
如果在规定时间内加载完成了,就立即往后执行,不需要继续等待。
针对元素是否生成
弊端
它只是等待元素是否生成,很多时候不是元素等待是否生成,而是等待元素的属性或者内容的改变,那么这个等待就无法捕获到这个变化。
一个例子
# 从selenium导入webdriver模块
from selenium import webdriver
# 创建一个chrome驱动
driver = webdriver.Chrome()
# get请求
driver.get("http://www.baidu.com")
# 隐式等待5秒(全局生效:如果超过5秒还未加载完成,就往后执行)
driver.implicitly_wait(5)
# 关闭浏览器
driver.quit()
3.显式等待
可针对每一个元素单独设置,等待条件更加灵活。
导入WebDriverWait模块
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
常用的EC方法
text_to_be_present_in_element() //判断某元素的text内容是否包含预期字符
一个例子
总等待时间5秒,当id=msg的元素的内容包含了“出错了”。
超过时间了往后执行了
# unitl()等待,里面放入等待条件
WebDriverWait(driver,5).until
(EC.text_to_be_present_in_element(("id","msg"),"出错了"))
# 打印id="msg"元素的内容
print(driver.find_element("id","msg").text)
智能等待(隐式等待Plus)
用于 ajax请求,开始没有这个元素,后续请求才会出现
例如:鼠标悬浮出现下拉框,很多时候下拉框是通过ajax请求得到的。
针对元素的是否生成
导入模块
import unittest
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.wait import WebDriverWait
一个例子
import unittest
from selenium import webdriver
# 找不到元素的异常
from selenium.common.exceptions import NoSuchElementException
# 等待的包
from selenium.webdriver.support.wait import WebDriverWait
"""
智能封装等待找元素的方法:
常用于某些元素开始是没有显示的,后续才显示
但是之前找元素就会没有找到
"""
class MyTest(unittest.TestCase):
# 初始化操作
def setUp(self) ->None:
self.driver = webdriver.Chrome()
self.url="http://localhost:8080/mms/login.html"
# 销毁方法
def tearDown(self):
# 关闭浏览器
self.driver.quit()
def find_element(self,locator):
try:
# 总等待时间5秒,每隔默认0.5秒
# lambda表达式
element = WebDriverWait(self.driver,5).until(lambda x: x.find_element(*locator))
return element
except NoSuchElementException as e:
print("错误信息:{}".format(e.args(0)))
def test1(self):
self.driver.get(self.url)
self.find_element(("id","username")).send_keys("admir")
self.find_element(("id","password")).send_keys("123")
self.find_element(("xpath","//input[@value='Login']")).click()
self.find_element(("xpath","//*[@id='accordion']/div[1]/div[1]/div[1]")).click()
self.find_element(("xpath","//*[@id='SC']/a[1]/span")).click()
if __name__ == '__main__':
unittest.main()