python3.6+selenium_显示等待和隐式等待

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)
原文地址:https://www.cnblogs.com/xiuxiu123456/p/10435719.html