页面等待

  现在的大多数的Web应用程序越来越多采用了 Ajax 技术,以及程序不能确定何时某个元素完全加载出来了。这会让元

素定位困难而且会提高产生 ElementNotVisibleException 的概率。在selenium当中共有两种等待页面加载的方式,显示等

待和隐示等待。

  显式等待:指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了。

  显示等待主要使用了WebDriverWait类与expected_conditions模块。

  WebDriverWait类是显性等待类,先看下它有哪些参数与方法:

    __init__:(初始化参数四个:)

      driver: 传入WebDriver实例。 

      timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)

      poll_frequency: 调用until中的方法的间隔时间,默认是0.5秒

      ignored_exceptions: 忽略的异常,如果在调用until的过程中抛出这个元组中的异常,则不中断代码,继续等

        待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。

      selenium库学习笔记_python

    WebDriverWait 的一个方法 until:

      method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False

      message: 如果超时,抛出TimeoutException,将message传入异常

       selenium库学习笔记_python_02

 

   隐性等待implicitly_wait(xx),隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截

止,然后执行下一步。弊端就是程序会一直等待整个页面加载完成,就算你需要的元素加载出来了还是需要等待。 

1 from selenium import webdriver
2 driver = webdriver.Chrome()
3 driver.implicitly_wait(30)  
4 driver.get('https://www.baidu.com')

 

 案例:用显示等待登陆微博:

 1 # !/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import time
 4 import random
 5 from selenium import webdriver
 6 from selenium.webdriver.support.wait import WebDriverWait
 7 from selenium.webdriver.support import expected_conditions as ec
 8 from selenium.webdriver.common.by import By
 9 driver = webdriver.Chrome()
10 driver.get('https://www.weibo.com')
11 time.sleep(2)
12 # ConnectionResetError
13 driver.maximize_window()
14 time.sleep(2)
15 wait = WebDriverWait(driver, 20, 0.5)
16 
17 try:
18     wait.until(ec.presence_of_element_located((By.ID, 'loginname')))
19     wait.until(ec.presence_of_element_located((By.XPATH, '//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input')))
20     username = driver.find_element_by_id('loginname')
21     username.clear()  # 清除输入框里的默认值
22     username.send_keys('*********')
23     time.sleep(random.random() + 0.2)
24     driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input').send_keys('***********')
25     time.sleep(random.random() + 0.2)
26     driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]/a').click()
27 
28 except Exception as e:
29     print(e)
30 finally:
31     time.sleep(8)
32     response_txt = driver.page_source
33     print(response_txt)
34     if '首页' and '我的收藏' in response_txt:
35         print('登陆成功')
36     else:
37         print(False)
38     time.sleep(10)
39     driver.close()

 

清澈的爱,只为中国