如果网站采用了动态 html 技术, 那么页面上的部分元素出现时间便不能确定, 这个时候就可以设置一个等待时间, 强制要求在时间内出现, 否则报错, 那么我可以用等待.
说到等待, 又有三种等法, 且听博主一一道来:
1. 强制等待
第一种也是最简单粗暴的一种办法就是强制等待 time.sleep(10).
- from selenium import webdriver
- from time import sleep
- driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
- driver.get('https://www.baidu.com/')
- sleep(3) # 强制等待 3 秒再执行下一步
- print driver.current_url
driver.quit()
这种等待方式时间到了就执行下个语句, 但比较死板, 不能保证在等待的时间内元素真正被加载了出来.
2. 隐性等待
第二种办法叫隐性等待, driver.implicitly_wait(20), 这个等待表示在规定的时间内页面的所有元素都加载完了就执行下一步, 否则一直等到时间截止, 然后再继续下一步.
- from selenium import webdriver
- driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
- driver.implicitly_wait(30) # 隐性等待, 最长等 30 秒
- driver.get('https://www.baidu.com/')
- print driver.current_url
driver.quit()
这个方法的缺点是你需要的元素已经加载出来了, 但页面还没有加载完, 再需要继续等待页面加载完才能执行下一步操作.
3. 显性等待
第三种办法就是显性等待 WebDriverWait, 配合该类的 until() 和 until_not() 方法, 就能够根据判断条件而进行灵活地等待了.
- # 20 表示最长时间 0.5 表示刷新频率
- # By.LINK_TEXT == driver.find_element_by_link_text()
- WebDriverWait(driver,20,0.5).until(
- EC.presence_of_element_located((By.LINK_TEXT, 'CSDN')))
- print driver.find_element_by_link_text('CSDN').get_attribute('href')
driver.close()
表示程序每隔 x 秒去判断一下指定的元素是否加载完, 加载完了就执行下一步, 否则继续每隔 x 秒去判断, 指定时间截止. 如果超时就会抛出异常.
来源: https://juejin.im/post/5c1899255188254351474ebd