在定位元素时,由于网络或其它的原因,定位的元素不能及时加载出来,此时需要等待一段时间后才能定位到指定元素,"等待一段时间"的方法有三种;
1)强制等待 time.sleep(等待时间),单位:s
2)隐式等待 :implicitly_wait(time),单位:s
3)显示等待:WebDriverWait(驱动,timeout,poll_frequency=None,ignored_exceptions=None)
——driver:WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
——timeout:最长超时时间,默认以秒为单位
——poll_frequency:休眠时间的间隔(步长)时间,默认为 0.5 秒,每隔0.5s去定位一次元素
——ignored_exceptions:超时后的异常信息,默认情况下抛 NoSuchElementException 异常
区别及优缺点:
1、强制等待(time.sleep()):在设置的时间范围内,如设置5s,则在5s内不管元素是否定位到,都需要等待5s后再进行下一步。元素可能在第1s或第2s就定位到,但是需要等待5s,比较浪费时间。但是每次定位元素都需要在定位元素的代码前编写显示等待的代码。
2、隐式等待(implicitly()):在设置的时间范围内,如设置5s,则在5s内定位的元素所在页面全部加载完毕,则进行下一步。定位的元素可能在第1s或第2s就定位到,但此时页面还未全部加载,需要继续等待,存在一定时间的浪费;(只需要在代码最前方写一次隐式等待的代码,后面定位的元素都会使用到)。
3、显示等待(WebDriverWait()):在设置的时间范围内,如设置5s,则在5s内定位到所需元素,则立即继续下一步,无需等待页面全部加载完成,不存在时间的浪费。但是每次定位元素都需要编写显示等待的代码。
from selenium import webdriver from time import sleep from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By class elementLocator_waittime_style(): ‘‘‘ 元素等待方式: 1)强制等待:time.sleep(2) 2)显示等待:WebdriverWait() 3)隐式等待:implicitly() ‘‘‘ def __init__(self): #加启动配置 option = webdriver.ChromeOptions() # 关闭“chrome正受到自动测试软件的控制” option.add_experimental_option(‘useAutomationExtension‘,False) #不自动关闭浏览器 option.add_experimental_option(‘detach‘,True) self.driver = webdriver.Chrome(chrome_options=option) self.driver.get("http://www.baidu.com") self.driver.maximize_window() #强制等待 def elementLocator_waittime_sleep(self): #强制等待5s,等待页面加载完成 sleep(5) #定位到搜索输入框 search_input = self.driver.find_element(By.ID,‘kw‘) #输入selenium等待时间 search_input.send_keys(‘selenium等待时间‘) #等待2s sleep(2) #定位到搜索按钮 search_button = self.driver.find_element(By.ID,‘su‘) #点击搜索按钮 search_button.click() #等待3s关闭窗口 sleep(3) self.driver.close() #显示等待 def elementLocator_waittime_webdriverwait(self): search_input = WebDriverWait(self.driver,30,poll_frequency=1,ignored_exceptions="未找到元素").until(lambda s:s.find_element(By.ID,‘kw‘)) search_input.send_keys("显性等待") #定位到搜索按钮 search_button = WebDriverWait(self.driver,30,poll_frequency=1,ignored_exceptions="未找到搜索按钮元素").until(lambda s:s.find_element(By.ID,‘su‘)) #点击搜索按钮 search_button.click() #隐式等待 def elementLocator_waittime_implicitly_wait(self): ‘‘‘ 30s内页面加载完毕则进行下一步,否则一直等待30s :return: ‘‘‘ self.driver.implicitly_wait(30) #定位百度搜索输入框 search_input = self.driver.find_element(By.ID,‘kw‘) #搜索隐式等待 search_input.send_keys("隐式等待") #定位搜索按钮 search_button = self.driver.find_element(By.ID,‘su‘) #点击搜索按钮 search_button.click() #等待3s关闭浏览 self.driver.quit() elementLocator_waittime_style().elementLocator_waittime_webdriverwait()