1.何为元素等待呢?
元素等待:js代码执行渲染期间,导致数据/标签加载缓慢,如果元素没有加载完成,直接通过find_element去进行定位,会出现元素不存在的异常。
2.元素等待的三种方法
(1) time.sleep(10) 强制性等待,不管元素在设置时间范围内是否加载出来,都必须要等待固定的时间。
(2)WebDriverWait(10) 智能等待的方法,最多等待10秒,10秒之后仍然没有元素,会抛出异常。10秒内找到这个元素,直接向下执行代码。这个方法一般适用于单个元素的等待;
(3)implicitly_wait(10) 最大等待时间10秒,针对的是整个页面,给当前页面设置最大等待时间;
3.元素等待举例
-
from selenium import webdriver
-
from selenium.webdriver.support.wait import WebDriverWait
-
-
driver = webdriver.Firefox()
-
#在淘宝中搜索笔记本电脑
-
driver.get( 'https://s.taobao.com/search?initiative_id=tbindexz_20170306&ie=utf8&spm=a21bo.2017.201856-taobao-item.2&sourceId=tb.index&search_type=item&ssid=s5-e&commend=all&imgfile=&q=%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91&suggest=history_1&_input_charset=utf-8&wq=&suggest_query=&source=suggest')
-
driver.implicitly_wait( 20)
-
-
# 在定位价格时,添加元素等待
-
# 方式一:
-
# price = WebDriverWait(driver, 20).until(lambda driver:driver.find_element_by_css_selector('.price > strong'))
-
# print(price.text)
-
-
# 方式二:
-
price = driver.find_element_by_css_selector( '.ctx-box > .title > a')
-
is_display = WebDriverWait(driver, 20).until( lambda driver: price.is_displayed())
-
# is_displayed()元素是否可见(页面是否加载出来)
-
-
print(is_display)
-
if is_display:
-
# 如果元素可见,再执行点击,输入,清空等操作
-
price.click()
-
else:
-
# 不可见
-
pass
-
-
driver.close()