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

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

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()

selenium中的元素操作之三大等待(一)的更多相关文章

  1. selenium中的元素操作之三大切换(二)

    一.窗口切换 使用方法: 1.获取到打开的所有的窗口,句柄handles all_handles = driver.window_handles print(all_handles) 2.获取当前的窗 ...

  2. selenium中的元素操作之下拉列表操作(四)

    下拉列表操作中分为两种:select.非select 1.非select的下拉框操作 非select下拉列表操作与网页元素操作一致,找到元素,定位元素,设置等待,点击元素等等 接下来操作百度的设置按钮 ...

  3. 【Selenium】selenium中隐藏元素如何定位?

    前言 面试题:selenium 中隐藏元素如何定位?这个是很多面试官喜欢问的一个题,如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是吧~~~很多面试官自己都搞不清楚 ...

  4. 巧妙利用selenium中的JS操作来处理特殊的文本框

    在使用selenium对页面进行相关操作时,有时候会遇到以下三种情况: 1.日期框:无法直接输入文本,必须要选择某一天的日期并点击才会填入文本框: 2.检索框:可以直接输入文本,但必须要点击根据输入的 ...

  5. selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?

    1.在寻找元素时,加上显示等待或者隐式等待,这样在对元素进行操作之前保证元素被找到,进而提高成功率: 2.在对元素操作之前,比如click,如果该元素未display(非hidden),就需要先滚动到 ...

  6. Selenium webdriver Java 元素操作

    本来这些东西网上一搜一大堆,但是本着收集的精神,整理一份放着吧!哈!哈!哈! 1. 输入框(text field or textarea) WebElement element = driver.fi ...

  7. selenium webdriver python 元素操作

    常用操作 click 点击某个元素 driver.find_element_by_id(“su”).click()   clear driver.find_element_by_id(“kw”).cl ...

  8. <自动化测试>之<selenium API 查找元素操作底层方法>

    搜罗了一些查找元素的除标准语句外,另外的语句使用方法,摘自 开源中国 郝云鹏driver = webdriver.Chrome(); 打开测试页面 driver.get( "http://b ...

  9. selenium中各个模块操作:下拉框、鼠标悬浮连贯、拼图拖拽操作、以及其他拖拽操作、连线操作

    1.下拉框的修改操作 方法一:定位到元素后,通过select选择对应的值 方法二:通过两次点击的方法:没有select的value属性时,采用click两次的方法去选择: click第一次后,出现下拉 ...

随机推荐

  1. [基础不过关填坑] 跨iframe触发事件

    子iframe $("#testId").on("change",function(){ alert("change") }) 父页面 $( ...

  2. Unknown column 'startname' in 'field list

    Unknown column 'startname' in 'field list  字段匹配不上 解决思路 1.检查数据库字段名与sql中的字段名是否一致 2.是否为关键字或中英文区别 ,(关键字可 ...

  3. Hash算法及java HashMap底层实现原理理解(含jdk 1.7以及jdk 1.8)

    现在很多公司面试都喜欢问java的HashMap原理,特在此整理相关原理及实现,主要还是因为很多开发集合框架都不甚理解,更不要说各种其他数据结构了,所以造成面子造飞机,进去拧螺丝. 1.哈希表结构的优 ...

  4. Feign进行文件上传+表单调用

    Feigin默认是不支持文件上传和表单提交的,需要做一些配置才能支持. 1.feign依赖 图中红色为form支持必须的jar. 2.添加自定义Encoder类: import static java ...

  5. WebRTC搭建前端视频聊天室——数据通道篇

    本文翻译自WebRTC data channels 在两个浏览器中,为聊天.游戏.或是文件传输等需求发送信息是十分复杂的.通常情况下,我们需要建立一台服务器来转发数据,当然规模比较大的情况下,会扩展成 ...

  6. 【原】QuickTime安装时,提示CAB文件"QuickTime.cab"中找不到此文件

    卸载安装程序:apple software updateapple mobile device supportapple 应用程序支持32apple 应用程序支持64 再重新安装quicktime

  7. 【GMT43智能液晶模块】例程二十一:DMA LAN实验——高速数据传输测速

    源代码下载链接: 链接:https://pan.baidu.com/s/1wQomZvOUP9_ZslZus_NSIA 提取码:3fmf 复制这段内容后打开百度网盘手机App,操作更方便哦 GMT43 ...

  8. 【计算机视觉】OpenCV篇(10) - 模式识别中的模板匹配

    什么是模式识别? 它指的是,对表征事物或现象的各种形式的信息进行处理和分析,从而达到对事物或现象进行描述.辨认.分类和解释的目的. 我们之所以可以很快辨别猫是猫.O不是0,就是因为在我们大脑中已经给猫 ...

  9. Maven多模块工程打包指定模块工程方法

    Maven多模块工程打包指定模块工程执行如下命令: mvn clean package -pl  指定模块工程名 -am 参数说明: -am --also-make 同时构建所列模块的依赖模块:-am ...

  10. 量化编程技术—matplotlib与可视化

    import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D np.random ...