selenium有3种等待,即直接等待、隐式等待、显式等待。
直接等待
直接等待即强制等待,强制线程休眠一段时间(此种等待尽量不要用)
示例:time.sleep(3)
隐式等待
作用于全局的find_element;
设置一个等待时间,默认每隔0.5秒轮询查找元素是否出现,如果在设置的等待时间内元素仍未出现,就抛出异常
示例:self.driver.implicitly_wait(3)
显示等待
程序默认每隔0.5秒进行一次条件判断,如果条件成立,则执行下一步;否则继续等待,直到超过设置的等待时间
示例1:webdriverwait(self.driver, 10).until(条件)
示例2:webdriverwait(self.driver, 10).until_not(条件)
代码
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import webdriverwait
class TestWait:
def setup(self):
self.driver = webdriver.Chrome(executable_path='./chromedriver.exe')
self.driver.get('http://www.baidu.com')
self.driver.maximize_window()
# 隐式等待3秒
self.driver.implicitly_wait(3)
def teardown(self):
self.driver.quit()
def test_wait(self):
self.driver.find_element(By.ID, 'kw').send_keys("软件测试")
self.driver.find_element(By.ID, 'su').click()
# 自定义方法作为显示等待的判断条件,必须传1个参数
# def wait(driver):
# # 判断“搜索工具”元素是否出现,若出现则返回真
# return len(self.driver.find_elements(By.XPATH, '//*[@id="container"]/div[2]/div/div[2]/div')) >= 1
# webdriverwait(self.driver,10).until(wait) # 注:wait不加括号
# 显示等待“搜索工具”元素是否可点击
webdriverwait(self.driver,10).until(expected_conditions.element_to_be_clickable((By.XPATH,'//*[@id="container"]/div[2]/div/div[2]/div')))
# 点击第一个查询结果
self.driver.find_element(By.XPATH,'//*[@id="3001"]/div[1]/h3/a').click()
# 强制等待3秒
sleep(3)