1.隐式等待
隐式等待,就是在创建driver时,为浏览器对象创建一个最长等待时间,这个方法是得不到某个元素就等待,直到拿到元素位置(如果一直拿不到就等到时间截止),再执行下一步。
注意这里有一个弊端,那就是程序会一直等待整个页面加载完成(浏览器标签栏那个小圈不再转),才会执行下一步,但有时候页面想要的元素早就加载完成了,但是因为个别js之类的东西特别慢,仍得等到页面全部完成才能执行下一步,我想等我要的元素出来之后就下一步怎么办?这就要用到显性等待wait了。
2.显示等待
显示等待,(使用driver.implicitly_wait(1)) 就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出NoSushElementException
(简而言之,就是直到元素出现才去操作,如果超时则报异常)
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/12/6 16:32 # @File : unittest_test5_1.py '''显示等待''' import unittest from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions class LoginAlert(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://www.baidu.com/?tn=91694651_hao_pg') def test_baidu_login_alert(self): search_filed = self.driver.find_element_by_id('kw') search_filed.clear() search_filed.send_keys('phones') search_filed.submit() #自定义的预期条件判断检测搜索框的class属性值 WebDriverWait(self.driver,10).until(lambda s:s.find_element_by_id('kw').get_attribute('class')=='s_ipt') #等待页面出现‘百度首页’的时候再进行下一步操作 search_filed_over = WebDriverWait(self.driver,10) .until(expected_conditions.visibility_of_element_located((By.LINK_TEXT,u'百度首页'))) #点击登录 self.driver.find_element_by_xpath('//*[@id="u"]/a[3]').click() ''' 如果页面有alert弹窗,可以用alert_is_present()方法 alert = WebDriverWait(self.driver,10) .until(expected_conditions.alert_is_present()) ''' #待弹出页面上的‘x’可点时才可进行下一步操作 search_login_text = WebDriverWait(self.driver,10) .until(expected_conditions.element_to_be_clickable((By.ID,'TANGRAM__PSP_4__closeBtn'))) search_login_text.click() def tearDown(self): self.driver.quit() if __name__=='__main__': unittest.main(verbosity=2)