PythonUI 元素等待
元素等待
CPU的运行速度远远大于网页的页面加载速度,会导致定位不到元素,所以要进行元素等待。
一、强制等待
time.sleep( ) 单位:秒
缺点:时间不好控制
需要等待的时候加time.sleep( ),等待n秒后进行下一步操作。无论条件成立与否,都要等待到时间后才能进行下一步操作
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com") e = driver.find_element_by_id("kw") e.send_keys("柠檬班") # 点击百度一下 driver.find_element_by_id("su").click() # 强制等待元素加载0.5秒 time.sleep(0.5) driver.find_element_by_link_text("lemon.ke.qq.com/").click()
二、隐形等待
给一个超时时间,如果在超时时间之内能够找到,就直接返回元素,如果超时了,就报错
--全局设置,设置一次就行
--设置超时时间
--只能用来等待元素
--找不到元素报错:NoSuchElement
import time from selenium import webdriver driver = webdriver.Chrome() # 隐式等待超时时间,全局设置。每次查找自动设置超时20秒 driver.implicitly_wait(20) driver.get("http://www.baidu.com") e = driver.find_element_by_id("kw") e.send_keys("柠檬班") # 点击百度一下 driver.find_element_by_id("su").click() driver.find_element_by_link_text("lemon.ke.qq.com/").click()
三、显性等待
--等待某个元素被点击
--等待某个元素可见
--等待某个窗口被打开
不是全局的,每次等待都要单独设置
找不到元素时报错:TimeoutException
显性等待几个重要的条件:
1.presence_of_element_located(locator) 元素是否出现
2.visibility_of_element_located(locator) 元素是否可见
3.element_to_be_clickable(locator) 元素是否可以被点击
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions driver = webdriver.Chrome() driver.get("http://www.baidu.com") e = driver.find_element_by_id("kw") e.send_keys("柠檬班") # 点击百度一下 driver.find_element_by_id("su").click() # 显性等待 # 第一步:设置定时器(每隔0.5秒查询一次,直到找到元素。poll_frequency可省略-默认是0.5) wait = WebDriverWait(driver,timeout=20,poll_frequency=0.5) # 第二步:设置满足的条件(可以是任意条件,需要返回True,如果是False进入下一轮询,直至超时) locator=('xpath','//*[text()="lemon.ke.qq.com/"]') elem = wait.until(expected_conditions.presence_of_element_located(locator=locator)) print(elem.text)
封装(等待元素被点击)
def wait_element_clikable(locator,driver,timeout = 20,poll = 0.5): """等待元素被点击""" wait = WebDriverWait(driver, timeout=timeout, poll_frequency=poll) elem = wait.until(expected_conditions.element_to_be_clickable(locator=locator)) return elem def wait_elemet_presence(locator,driver,timeout = 20,poll = 0.5): """等待元素出现""" wait = WebDriverWait(driver, timeout=timeout, poll_frequency=poll) elem = wait.until(expected_conditions.presence_of_element_located(locator=locator)) return elem def wait_elemet_visiable(locator,driver,timeout = 20,poll = 0.5): """等待元素可见""" wait = WebDriverWait(driver, timeout=timeout, poll_frequency=poll) elem = wait.until(expected_conditions.visibility_of_element_located(locator=locator)) return elem
等待方式的选择
--隐式等待:全局设置,等待查找元素(第一顺位)
--显性等待:等待元素可以被点击、可见等(第二顺位)
--强制等待:多个系统交互的地方
四、总结
1)元素等待
首先用find_element()进行查找,看看是不是要进行元素等待。(有些元素不需要动态加载的,是不用等待的),如果找不到,用隐性等待。隐性等待找不到,用显性等待;
显性等待找不到,要记得切换条件(presence、visible、clickable);还是找不到再用强制等待。
2.元素定位不到的原因有哪些?nosuchelement
①检查元素定位的方式是否正确
②没有加元素等待 (调试的时候直接用强制等待,效果比较明显)
③检查有没有在这个页面上:有没有在这个窗口上;是不是在一个iframe中