"""目前,大多数Web应用程序都在使用AJAX技术。当浏览器加载页面时,该页面中的元素
可能以不同的时间间隔加载。这使定位元素变得困难:如果DOM中尚未存在元素,则
locate函数将引发ElementNotVisibleException异常。使用等待,我们可以解决这个
问题。等待在执行的操作之间提供了一些松弛 - 主要是使用元素定位元素或任何其他操作。
Selenium Webdriver提供两种类型的等待 - 隐式和显式。
1.显式等待使WebDriver等待某个条件发生,然后再继续执行。(建议使用显示等待)
显式等待是您定义的代码,用于在进一步执行代码之前等待某个条件发生。
这种情况的极端情况是time.sleep(),它将条件设置为等待的确切时间段。
提供了一些便捷方法,可帮助您编写仅在需要时等待的代码。
WebDriverWait与ExpectedCondition相结合是一种可以实现的方法。
title_is # 标题是某内容
title_contains # 标题包含某内容
presence_of_element_located # 节点加载出来,传人定位元组,如(By.ID ,'p')
visibility_of_element_located # 节点可见,传人定位元组
visibility_of # 可见,传入节点对象
presence_of_all_elements_located # 所有节点加载出来
text_to_be_present_in_element # 某个节点文本包含某文字
text_to_be_present_in_element_value # 某个节点值包含某文字
frame_to_be_available_and_switch_to_it # 加载并切换
invisibility_of_element_located # 节点不可见
element_to_be_clickable # 节点可点击
staleness_of # 判断一个节点是否仍在DOM ,可判断页面是否已经刷新
element_to_be_selected # 节点可选择,传节点对象
element_located_to_be_selected # 节点可选择,传人定位元组
element_selection_state_to_be # 传人节点对象以及状态,相等返回True ,否则返回False
element_located_selection_state_to_be # 传入定位元组以及状态,相等返回True ,否则返回False
alert_is_present # 是否出现警告"""
from selenium importwebdriverfrom selenium.webdriver.common.by importByfrom selenium.webdriver.support.ui importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions as EC#声明浏览器对象并将其赋值为driver
driver =webdriver.Firefox()#调用get()方法请求网页
driver.get("https://www.taobao.com/")try:#WebDriverWait指定最长等待时间。而until()方法指定等待的条件
element = WebDriverWait(driver, 10).until(#检查该元素是否在10秒内加载出来并成功返回。没有则抛出异常
EC.presence_of_element_located((By.ID, "q"))
)
button= WebDriverWait(driver, 10).until(#检查元素是否可以点击
EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn-search"))
)print(element, button)finally:#最后执行退出
driver.quit()"""2.隐式等待使WebDriver在尝试定位元素时将DOM轮询一段时间。
隐式等待告诉WebDriver在尝试查找不能立即可用的任何元素(或元素)
时轮询DOM一段时间。默认设置为0.设置后,将为WebDriver对象的生命周期
设置隐式等待.
如果查找的节点没有立即出现,将会等待一段时间再次查找,这段时间是固定的,
而页面加载会受到网络条件的影响,是不固定因素"""
from selenium importwebdriver#声明浏览器对象并将其赋值为driver
driver =webdriver.Firefox()#implicitly_wait()方法实现隐式等待。
driver.implicitly_wait(10)#开始请求网页
driver.get("https://www.zhihu.com/explore")#找到指定的元素
input = driver.find_element_by_id("zu-top-add-question")print(input)