原文地址:http://blog.csdn.net/huilan_same/article/details/52544521
作者这篇文章写的很详细,很经典,就不再重新写了。
总结一下:
1、强制等待——sleep(xxx)
不管如何,都等待xxx秒,才继续执行下面的代码。
适合调试代码用。
2、隐性等待——implicitly_wait(xxx)
隐式等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步,我想等我要的元素出来之后就下一步怎么办?有办法,这就要看selenium提供的另一种等待方式——显性等待wait了
3、显性等待
显性等待某个元素,元素找到了,即便页面其它的 js 等文件加载不完,也执行。显性等待效果好,但是操作较复杂,一般来说,掌握好前两种等待方法,就能解决掉大部分的问题。
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.implicitly_wait(20) driver.get('http://www.baidu.com/') locator = (By.LINK_TEXT,'地图') try: WebDriverWait(driver,20,0.5).until(expected_conditions.presence_of_element_located(locator)) driver.find_element_by_link_text('地图').click() finally: driver.quit()
补充一点:
有这样一个页面xxx,打开后元素a,需要5秒才能加载出来,请问下面的代码是否能执行成功?
1、 使用implicitly_wait(20)
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(20) driver.get("xxx") driver.find_element_by_link_text('元素a').click() driver.quit()
2、使用implicitly_wait(20)
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(20) driver.get("xxx") ele = driver.find_element_by_link_text('元素a') ele.click() driver.quit()这个代码能执行成功吗?
第一个代码,定位元素,然后点击click
第二个代码,先把元素赋值给变量,然后变量使用click方法
代码1执行成功
代码2执行失败
分析:
代码1:implicitly_wait(20) ,对某个元素执行操作的时候,如果找不到元素就等待,找到了就执行操作,等20秒还找不到才报错。
代码2:赋值语句,不是对元素进行操作,找不到元素,赋值直接失败,报错。