等待元素可见之后再去操作,如果你的操作,带来了页面的变化,那么接下来要操作新的元素,必须要等待新的元素可见之后再操作
1、强制等待
sleep(等待的秒数):等到了规定的时间才会进行其他操作
from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click() # 页面发生了变化 time.sleep(3) # 强制等待 driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click() time.sleep(2) # 强制等待
2、隐性等待
driver.implicitly_wait(秒) 隐性等待、
一次会话当中,在启动会话(webdrvier.Chromt())到结束会话(driver.quit())只需要调用一次
只适用于场景:1、等待元素存在(DOM页面里面)、2、等待命令执行完成(),
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(30) # 隐性等待时间 driver.get("http://www.baidu.com") driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click() # 页面发生了变化 # 隐性等待,全局设置一次隐形等待,那么整个会话(从打开浏览器到最后结束关闭浏览器)期间全部应用 # 只适用于场景:1、等待元素存在(DOM页面里面)、2、等待命令执行完成(), # 元素本身存在的情况就不太好用(这个百度的就是本身存在) # 等待上限:30s 元素什么时候存在了,什么时候就不等了。如果超时了就会抛异常,TimeoutExceptid driver.find_element_by_xpath('//p[@id="TANGRAM__PSP_10__footerULoginBtn"]').click() driver.quit()
3、显性等待
智能等待,上限时间范围之内,等待 xxx 条件成立,就结束等待。
1)时间上限、2)条件、3)等待(时间上限,轮询周期),每隔多久判断条件是否成立,成立就不等,未成立就等,超过时间上限就报错
等待:WebdriverWait类 条件:expected_condition 各种场景比如元素可见,
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click() # 页面的变化 - 弹出了登录框 默认轮询周期0.5秒 # WebDriverWait(driver, 等待上限, 轮询周期).until(条件) loc = (By.XPATH, '//p[@id="TANGRAM__PSP_10__footerULoginBtn"]') WebDriverWait(driver, 30).until(EC.visibility_of_element_located(loc)) # 元素可见:visibility_of_element_located # 元素们可见:visibility_of_elements_located # 点击 driver.find_element(*loc).click() driver.quit()