【Selenium】(五)Selenium中的三种等待方式

相关文章链接:
【Selenium】(一)Selenium介绍及安装部署说明
【Selenium】(二)使用selenium编写测试用例
【Selenium】(三)Selenium中控件定位方法
【Selenium】(四)Selenium中WEB控件交互的方法
【Selenium】(六)Selenium中表单、多窗口、多frame、多浏览器等场景处理方法
【Selenium】(七)selenium中执行JavaScript脚本


selenium提供三种等待方式,分别为:直接等待、隐式等待、显示等待。这三种等待方式都有各自的优缺点,下面就为大家介绍一下这三种等待方式。


1. 直接等待

  • 语法:

    • time.sleep(N)
  • 说明:

    • 强制等待,线程会休眠一段时间
  • 缺点:

    • 非常不智能,使用不当会影响程序运行。
    • 例如,定位元素。让页面加载完成后,元素才能被成功定位。因此我们会加入等待语句来等待页面加载。当使用直接等待时,若设置时间较短,很可能会因为页面还未完全加载而导致元素未成功定位;若设置时间较长,则会影响线程运行时间。
  • 示例:

from time import sleep# 1. 导入依赖
from selenium import webdriver

class Testdemo():
    def setup(self):
        self.driver = webdriver.Chrome()  # 2. 创建driver
        self.driver.maximize_window()
        
    def teardown(self):  # 测试用例结束后操作
        self.driver.quit()  # 不添加的话,页面不会自动退出,影响资源回收
    
    def test_wait(self):
        self.driver.get("https://www.baidu.com")
        self.driver.find_element_by_id('kw').send_keys("Selenium")  #1.查询框输入 “Selenium”
        sleep(5)
        self.driver.find_element_by_id('su').click()  #2. 点击查询按钮
        sleep(3)

2. 隐式等待

  • 语法:
    • driver.implicitly_wait()
  • 说明:
    • 设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没有出现就抛出异常。
  • 优点:
    • 轮询查找,相对智能,避免元素提前加载好后,程序还一直等待的情况。
  • 缺点:
    • 全局设置,作用域所有find element的方法,因此等待时间必须设置成元素查找的最长时间。若元素查找出现故障时则会影响程序运行。
  • 示例:
from selenium import webdriver

class TestDemo():
    def setup(self):
        self.driver=webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(5)  #在setup中设置隐式等待,作用于全局find element函数

    def teardown(self):
        self.driver.quit()
    
    def test_implicitly_wait(self):
     	 self.driver.get("https://www.baidu.com")
     	 self.driver.find_element_by_id('kw').send_keys("Selenium") #由于隐式等待,每0.5秒查找元素,查找到了就继续执行
     	 self.driver.find_element_by_id('su').click()

3. 显示等待

  • 语法:
    • WebDriverWait( ).until()
    • WebDriverWait( ).until_not()
  • 说明:
    • 在代码中定义等待条件,当条件发生时才继续执行代码。
    • WebDriverWait( )配合until()和until_not()方法,根据判断条件进行等待。
    • 程序每个一段时间(默认0.5秒)进行条件判断,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间。
  • 优点:
    • 显示等待是最优的等待方式,它是指定某一个元素来进行等待条件判断的,因此避免了在使用直接等待和隐式等待时可能产生的问题,提高程序运行的效率。
  • 示例:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions  # 导入依赖:条件判断时使用的类
from selenium.webdriver.support.wait import WebDriverWait  # 导入依赖:显示等待

class TestDemo():
    def setup(self):
        self.driver=webdriver.Chrome()
        self.driver.maximize_window()

    def teardown(self):
        self.driver.quit()
    
    def test_webdriverwait(self):
        self.driver.get("https://www.baidu.com")

        #设置等待条件,当百度首页的logo图标可以点击的时候,则进行下一步操作
        #使用内置方法:expected_conditions  来进行判断
        WebDriverWait(self.driver,3).until(expected_conditions.element_to_be_clickable((By.ID,'s_lg_img')))
        self.driver.find_element_by_id('kw').send_keys("Selenium")

        #自定义方法,来进行until的条件判断
        def wait(x):
            '''
            当找到元素的时候则返回True,否则False
            :return: bool值,True-查到到元素,False-未找到元素
            '''
            # 使用find_elements方法,返回的是元素对象列表,未找到元素则为返回空列表
            return len(self.driver.find_elements_by_class_name('s_tab_inner'))>=1
        WebDriverWait(self.driver, 3).until(wait)
        self.driver.find_element_by_id('su').click()

        sleep(3)  #添加直接等待,为了方便最后看页面查询效果  可以删除

你可能感兴趣的:(WEB自动化,selenium,python,等待方式,WEB自动化测试)