一、前言
我们在定位元素的时候往往会碰到元素加载慢的情况,如果元素没有加载出来而进行点击操作的话,是无法点击的。我们前面一直用time.sleep()方法进行页面等待的,其中这种方法就是元素等待的一种,这节课我们主要讲一下所有元素等待的方式,这也是面试中常问的知识点。
二、学习目标
1.强制等待
2.隐性等待
3.显性等待
三、知识点
地址示例:http://sahitest.com/demo/waitFor.htm
1.【强制等待】
第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),不管是元素加没加载出来,都必须等xx时间。不过不建议总用这种等待方式,太死板,严重影响程序执行速度。
-
语法:
time.sleep(3)
-
代码示例:
# 导入webdriver import time from selenium import webdriver #获取驱动路径 driver_path = './chromedriver.exe' #创建一个浏览器对象 driver = webdriver.Chrome(executable_path=driver_path) #设置全屏 driver.maximize_window() #请求 driver.get('http://sahitest.com/demo/waitFor.htm') #点击Click me按钮 driver.find_element("xpath",".//input[@value='Click me']").click() #强制等待3秒 time.sleep(3) #获取输出文本 text = driver.find_element("id","id2").text print(text)
2.【隐性等待】
隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢。
-
语法:
driver.implicitly_wait(5)
-
代码示例:
# 导入webdriver import time from selenium import webdriver #获取驱动路径 driver_path = './chromedriver.exe' #创建一个浏览器对象 driver = webdriver.Chrome(executable_path=driver_path) #设置全屏 driver.maximize_window() #请求 driver.get('http://sahitest.com/demo/waitFor.htm') #点击Click me按钮 driver.find_element("xpath",".//input[@value='Click me']").click() #隐式等待 driver.implicitly_wait(5) #获取输出文本 text = driver.find_element("id","id2").text print(text)
3.【显性等待】
显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException异常。
-
语法:
WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located(locator))
-
代码示例:
# 导入webdriver from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC #获取驱动路径 driver_path = './chromedriver.exe' #创建一个浏览器对象 driver = webdriver.Chrome(executable_path=driver_path) #设置全屏 driver.maximize_window() #请求 driver.get('http://sahitest.com/demo/waitFor.htm') #点击Click me按钮 driver.find_element("xpath",".//input[@value='Click me']").click() #隐式等待 locator = ("id","id2") WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located(locator)) #获取输出文本 text = driver.find_element("id","id2").text print(text)