selenium库学习笔记(二)
页面等待
现在的大多数的Web应用程序越来越多采用了 Ajax 技术,以及程序不能确定何时某个元素完全加载出来了。这会让元
素定位困难而且会提高产生 ElementNotVisibleException 的概率。在selenium当中共有两种等待页面加载的方式,显示等
待和隐示等待。
显式等待:指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了。
显示等待主要使用了WebDriverWait类与expected_conditions模块。
WebDriverWait类是显性等待类,先看下它有哪些参数与方法:
__init__:(初始化参数四个:)
driver: 传入WebDriver实例。
timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
poll_frequency: 调用until中的方法的间隔时间,默认是0.5秒
ignored_exceptions: 忽略的异常,如果在调用until的过程中抛出这个元组中的异常,则不中断代码,继续等
待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。
WebDriverWait 的一个方法 until:
method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常
隐性等待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()