zoukankan      html  css  js  c++  java
  • selenium中的元素操作之三大等待(一)

    等待时做什么,为什么使用等待

    在做自动化测试,设计测试用例的时候,有时下一步的操作会依赖上一步的结果或者内容,上一步操作成功之后才能进行下一步操作等,这时候,我们就需要使用等待,来判断上一步操作是否完成,什么时候可以进行下一步操作。

    1、强制等待

    sleep(),单位是秒
    使用方法:sleep(X),等待X秒后,进行下一步操作。无论条件成立与否,都要等待到时间截至,才能进行下一步操作
    缺点:不能准确把握需要等待的时间(有时操作还未完成,等待就结束了,导致报错;有时操作已经完成了,但等待时间还没有到,浪费时间),如果在用例中大量使用,会浪费不必要的等待时间,影响测试用例的执行效率。
    优点:使用简单,可以在调试时使用。

    from selenium import webdriver
    import time
    
    # 创建driver对象,指定Chrome浏览器
    driver = webdriver.Chrome()
    # 窗口最大化
    driver.set_window_size(800, 600)
    # 访问百度
    driver.get("http://baidu.com")
    # 等待15秒(强制等待)
    time.sleep(15)
    # 点击新闻
    driver.find_element_by_xpath('//div[@id="u1"]//a[text()="新闻"]').click()
    # 等待15秒(强制等待)
    time.sleep(15)
    # 点击某一条新闻,查看详情
    driver.find_element_by_xpath('//li[@class="hdline3"]//a[@target="_blank"]').click()
    # 等待5秒(强制等待)
    time.sleep(5)
    # 关闭窗口
    driver.close()
    # 关闭会话,关闭浏览器,关闭chromedriver
    driver.quit()

    2、隐式等待

    driver.implicitly_wait()
    隐形等待:等待元素被找到、等待命令执行
    会话期间全局设置一次,所有的都通用
    使用方法:implicitly_wait(X),在X时间内,页面加载完成,进行下一步操作。
    设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步操作。
    缺点:使用隐式等待,程序会一直等待整个页面加载完成,才会执行下一步操作;
    优点:隐性等待对整个driver的周期都起作用,所以只要设置一次即可。
    但有时候页面想要的元素早已经加载完成了,但是因为网页上个别元素还没有加载完成,仍要等到页面全部完成才能执行下一步,使用也不是很灵活。

    from selenium import webdriver
    import time
    
    # 创建Chrome会话
    driver = webdriver.Chrome()
    
    # 设置隐形等待:等待元素被找到、等待命令执行
    # 等待时间上限为15秒,如5秒找到元素,则5秒后执行,若大于15秒,则报错
    # 全局只设置一次,后边的命令都最多等待15秒
    driver.implicitly_wait(15)
    # 发起请求
    driver.get("http://baidu.com")
    # 点击"贴吧"
    driver.find_element_by_xpath('//div[@id="u1"]//a[text()="贴吧"]').click()
    time.sleep(5)
    # 点击"英雄联盟"
    driver.find_element_by_xpath('//div[@id="spage_liveshow_slide"]//a[@title="英雄联盟"]').click()
    time.sleep(5)
    # 关闭会话
    driver.quit()

    3、显示等待

    当你的操作,引起了页面的变化,而你接下来的操作变化的元素时,一定要加等待
    程序每隔X秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException异常。
    缺点:使用相对比较复杂
    优点:等待判断准确,不会浪费多余的等待时间,在用例中使用,可以提高执行效率。
    使用方法:WebDriverWait(driver, 超时时间, 调用频率, 要忽略的异常).until(要执行的方法, 超时时返回的错误信息)

    WebDriverWait类

    until()方法:直到条件成立返回为真,等待结束。如果超时,抛出TimeoutException,将message传入异常。
    until_not()方法:直到条件不成立返回为真,是当某元素消失或什么条件不成立则继续执行,等待结束。如果超时,抛出TimeoutException,将message传入异常。
    expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件方法。

    from selenium import webdriver
    import time
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    
    # 创建Chrome会话
    driver = webdriver.Chrome()
    
    # 发起请求
    driver.get("http://baidu.com")
    
    # 等待的条件
    loc_1 = (By.XPATH, '//div[@id="u1"]//a[text()="贴吧"]')
    # 等待元素//div[@id="u1"]//a[text()="贴吧"]可见,等待上限为10秒
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc_1))
    # 点击"贴吧"
    driver.find_element_by_xpath('//div[@id="u1"]//a[text()="贴吧"]').click()
    
    # 等待//div[@id="spage_liveshow_slide"]//a[@title="英雄联盟"]元素可见
    loc_2 = (By.XPATH, '//div[@id="spage_liveshow_slide"]//a[@title="英雄联盟"]')
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc_2))
    # 点击"英雄联盟"
    driver.find_element_by_xpath('//div[@id="spage_liveshow_slide"]//a[@title="英雄联盟"]').click()
    # time.sleep(5)
    
    # 关闭会话
    driver.quit()
  • 相关阅读:
    Algorithm Gossip (37) 快速排序法 ( 一 )
    Algorithm Gossip (36) Heap排序法( 堆排序 )
    Algorithm Gossip (35) Shaker法
    Algorithm Gossip (34) 希尔排序
    AlgorithmGossip (33) 选择、插入、气泡排序
    Algorithm Gossip (32) 得分排行
    Algorithm Gossip (31) 数字拆解(dp问题)
    Algorithm Gossip (30) m元素集合的 n 个元素子集
    Algorithm Gossip (29) 产生可能的集合
    Algorithm Gossip (27) 排列组合
  • 原文地址:https://www.cnblogs.com/xingyunqiu/p/11497286.html
Copyright © 2011-2022 走看看