一篇文章告诉你什么是—Selenium的元素等待

news2024/11/18 5:47:09

前言

今天我们来说说selenium的元素等待,废话不多说直接开始吧。

1、元素等待介绍

WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程。为了保证脚本运行的稳定性,需要脚本中添加等待时间。

2、为什么要设置元素等待

在元素定位的时,可能出现脚本已经运行到定位某个元素的时候,但该元素尚未加载到页面,此时脚本会因无法定位到该元素而导致执行失败。换句话说就是代码执行的速度,快于页面元素加载的速度,我们需要等待页面元素全部加载完成之后,再做定位元素。元素等待本质是为了解决元素定位时序上不匹配的问题。

页面加载速度慢的原因:

  1. 由于网络速度原因。
  2. 电脑配置原因。
  3. 服务器处理请求原因。

3、Selenium中常用的元素等待方式

Selenium中常用的元素等待方式有三种:

  1. 强制等待:time.sleep()
  2. 隐式等待:implicitly_wait()
  3. 显式等待:WebDriverWait()

4、强制等待

设置等待最简单的方法就是强制等待,其实就是time.sleep()方法。不管它什么情况,让程序暂停运行一定时间,时间过后继续运行。缺点是不智能,如果设置的时间太短,元素还没有加载出来一样会报错。设置的时间太长,则会浪费时间。因而在实际UI自动化脚本开发中,这个方式一般比较少用。

5、隐式等待

(1)隐式等待介绍

WebDriver提供了mplicitly_wait()方法来实现隐式等待。隐式等待相当于设置全局等待,在定位元素时,对所有元素设置的超时时间。implicitly_wait()默认参数的单位为秒,默认设置超时时间为0,设置后这个隐式等待会在WebDriver对象实例的整个生命周期起作用。

从等待作用上看,是可以满足需要的,但是考虑到实际应用场景,Driver(浏览器)要等待的元素和脚本要操作的元素未必相同,也就是说,脚本要操作的元素已经出现,但因为设置了全局等待,Driver(浏览器)也会继续等待页面上其他无关元素,直至整个页面加载完毕。所以与显式等待相比,可能会出现一些无效等待的情况。

如果超出了设置的时长,元素还没有被加载,则抛NoSuchElementException异常(可自己指定异常或自定义异常)。

(2)隐式等待示例

"""
1.学习目标:
    掌握selenium隐式等待方法使用
2.操作
    2.1 隐式等待方法
        driver.implicitly_wait(最大等待时间,单位:秒)
    2.2 隐式等待作用
        在规定的时间内等待页面所有元素加载;
    2.3 使用场景:
        在有页面跳转的时候,可以使用隐式等待。
3.需求
    实现selenium隐式等待方法
"""
# 1.导入selenium
from selenium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException

# 2.打开浏览器
driver = webdriver.Chrome()

# 3.打开页面
url = "https://www.jd.com/"
driver.get(url)

# 4. 添加隐式等待
print("等待开始时间", time.time())
# 等待5秒钟,最多等待5秒。
# 如果在5秒内加载完成,加载完就继续执行。
driver.implicitly_wait(5)
print("等待结束时间", time.time())

# 5. 定位元素,点击链接
try:
    driver.find_element_by_link_text("秒杀").click()
except NoSuchElementException as e:
    print(e)
finally:
    # 6.关闭浏览器
    time.sleep(3)
    driver.quit()

"""
输出结果:
等待开始时间 1590511914.654972
等待结束时间 1590511914.6569717
"""
说明:
在上面的案例中implicitly_wait()设置等待时长为5秒。这个5秒的设置并不针对页面上的某一个元素进行等待,也不是一个固定的等待时间。如果页面全部元素提前加载完,不用等待全部时间。如果直到超出设置时长(5秒)还没有定位到元素,则抛出异常。

6、显式等待

(1)显式等待介绍

显示等待是一种更智能的等待方式。显示等待比隐式等待更节省测试时间,个人更推荐使用显示等待的方式来判断页面元素是否出现。程序会每隔一段时间(默认为0.5秒,可自定义)执行一下判断条件,等待某个条件成立时继续执行,否则在达到最大时长抛出超时异常TimeoutException(实际上是until()抛出的TimeoutException异常,这里注意一下)。

WebDriverWait()类是由WebDirver提供的等待方法。在设置时间内,通过配合until()、until_not()、ExpectedCondition等条件的使用,默认每隔一段时间,轮询检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。这样的等待方式可避免无效等待,在实际应用中推荐使用该方法。

(2)显式等待语法

# 导包WebDriverWait
from selenium.webdriver.support.wait import WebDriverWait

# 显示等待方法
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

说明:

  • driver :WebDriver的驱动程序(IE、Firefox、Chrome等)。
  • timeout:最长超时时间,默认以秒为单位。
  • poll_frequency:休眠时间的间隔(步长)时间,默认为0.5秒(轮询频率)
  • ignored_exceptions:超时后的异常信息,默认值ignored_exceptions=None,因为通常配合until()方法使用,until()方法默认情况下抛TimeoutException异常。

(3)until()和until_not()方法

WebDriverWait()方法一般会和until()或until_not()方法配合使用。

@1、until(method, message=' ')

  • method:在等待期间,每隔一段时间调用这个传入的方法,直到返回值为True;
  • message:如果超时,抛出TimeoutException,将message位置传入异常。

@2、until_not(method, message=’ ’)

  • method:在等待期间,每隔一段时间调用这个传入的方法,直到返回值为False。
  • message:如果超时,抛出TimeoutException,将message位置传入异常。
注:until_not是当某元素消失或什么条件不成立则继续执行。

(4)显式等待的使用

调用方式如下

WebDriverWait(driver, 超时时长, 调用频率(可选,有默认值), 忽略异常(可选,有默认值)).until(可执行方法, 超时时返回的信息)

示例

"""
1.学习目标
     必须掌握selenium中显式等待使用方法
2.操作步骤(语法)
    2.1导入WebDriverWait类
    2.2使用方法
        WebDriverWait(driver,timeout,pol1_frequency=0.5).until(method)
            driver:浏览器
            timeout:最大等待时间,单位:秒(和隐式显示是一样的)
            po11_frequency:轮询时间

        until(method,message)
        method:将一个方法作为参数传入

3.需求
    在注册A页面中,使用显示等待来定位账号A输入相
"""
# 1.导入selenium
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import NoSuchElementException

# 2.打开浏览器
driver = webdriver.Chrome()

# 3.打开页面
url = "https://www.jd.com/"
driver.get(url)

# 4.使用显示等待,定位元素,点击链接
try:
    print("等待开始时间", time.time())
    """
    lambda x: x.find_element_by_link_text("秒杀")
    是Python的匿名函数,主要记得这里要传入一个方法。
    x = driver
    不过以后在我们的实际开发中,不这样传入一个方法。
    """
    login = WebDriverWait(driver, 5).until(lambda x: x.find_element_by_link_text("秒杀"))
    print("等待结束时间", time.time())
    login.click()
except NoSuchElementException as e:
    print(e)
finally:
    # 5.关闭浏览器
    time.sleep(3)
    driver.quit()

"""
输出结果:
等待开始时间 1590511979.5245922
等待结束时间 1590511979.5725648
"""

 

最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

全套资料获取方式:点击下方小卡片自行领取即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenStack(4)--NameSpace实现不同项目(租户)重叠网段

openstack通过namespace将不同项目(租户)的网络隔离,每个项目的管理员都需要对项目网络进行规划建设,这就导致不同项目之间会重复使用到某些网段,例如192.168.X.X就是管理员习惯使用的网段。 上一次我们新建位于vxlan…

基于Java的景区售票信息管理系统

1.设计要求 (1)要求每个学生独立完成期末作品,在遇到问题时,同学之间可以相互讨论,但切忌复制他人程序。 (2)根据期末作品题目,自己编写程序,上机调试程序,…

uniapp视频播放器

微信小程序使用hic-video-player app(android和ios)使用好用视频播放器注:用的是旧版本的这个组件 目前只有app中支持竖屏横批选集 android视频全屏是通过 beforeDestroy() {// #ifdef APP-VUE// 页面关闭时关闭沉浸模式if (uni.getSystemInfoSync().platform &quo…

【FFmpeg实战】解复用实战

原文链接:https://blog.csdn.net/u014078003/article/details/128554153 1.封装格式相关函数 avformat_alloc_context():负责申请一个AVFormatContext结构的内存,并进行简单初始化,这个函数可以不用手动调用,内部会自动调用。avf…

【无标题】NXP i.MX 6ULL工业核心板硬件说明书( ARM Cortex-A7,主频792MHz)

1 硬件资源 创龙科技SOM-TLIMX6U是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的低成本工业级核心板,主频792MHz,通过邮票孔连接方式引出Ethernet、UART、CAN、LCD、USB等接口。核心板经过专业的PCB Layout和高低温测试验证&…

怎么才能提高自动化测试的覆盖率,华为大佬教你一招!

前言 自动化测试一直是测试人员的核心技能,也是测试的重要手段之一。尤其是在今年所谓的互联网寒冬的行情下,各大企业对测试人员的技术水平要求的很高,而测试人员的技术水平主要集中在三大自动化测试领域,再加测试辅助脚本的编写…

智慧园区能源管理系统建设方案

随着能源资源的日益紧缺和环境保护意识的不断提高,智慧园区能源管理系统建设成为了当前能源管理的热点话题。智慧园区能源管理系统是一种集成化的能源管理平台,可以实现对园区内各种能源的实时监测、分析和管理,从而达到优化能源配置、提高能…

Python 学习之NumPy(一)

文章目录 1.为什么要学习NumPy2.NumPy的数组变换以及索引访问3.NumPy筛选使用介绍筛选出上面nb数组中能被3整除的所有数筛选出数组中小于9的所有数提取出数组中所有的奇数数组中所有的奇数替换为-1二维数组交换2列生成数值5—10,shape 为(3,5)的二维随机浮点数 NumP…

对一大厂游戏测试员的访谈实录,带你了解游戏测试

今天采访了一个在游戏行业做测试的同学,他所在的游戏公司是做大型多人在线角色扮演类的游戏,类似传奇游戏。他所在的公司目前有1200多人,是上市公司,目前游戏产品在国内海外都有市场。 因为我是一个对游戏无感的人,所…

【C++ 程序设计】第 7 章:输入/输出流

目录 一、流类简介 二、标准流对象 三、控制I/O格式 (1)流操纵符 (2)标志字 四、调用cout的成员函数【示例一】 五、调用 cin 的成员函数 (1)get() 函数 (2)getline()…

高考选什么专业好?适合考公务员的10大热门专业,了解一下!

高考是人生的分水岭,它是青春和未来的交汇处。高考成绩的优劣将对考生未来的发展产生深远的影响。作为学生们人生中重要的一站,高考不仅考验着学生的学业能力,也考验着他们的心理素质和思维能力。 高考结束后,众多考生面临的一个重…

FFmpeg视频转码参数详解

1 固定码率因子crf(Constant Rate Factor) 固定码率因子(CRF)是 x264 和 x265 编码器的默认质量(和码率控制)设置。取值范围是 0 到 51,这其中越低的值,结果质量越好,同…

阿里云docker启动xxljob,部署自己的定时任务

本次安装版本xxl-job-admin:2.3.0 一:创建xxl-job数据库的各种表 作者官方地址 下载sql执行 二:docker拉取xxl-job镜像 docker pull xuxueli/xxl-job-admin:2.3.0 三:docker启动xxl-job服务 docker run -e PARAMS"--spring.datasour…

用C语言实现经典游戏——贪吃蛇

目录 1.游戏实现思想 (1)定义蛇对象 (2)食物对象 (3)分数: (4)初始化蛇 (5)初始化食物 (6)修改控制台光标位置 &…

Spring Data JPA 报 HOUR_OF_DAY: 0 -> 1异常的解决过程和方案

在进行数据查询时,控制台报了Caused by: com.mysql.cj.exceptions.WrongArgumentException: HOUR_OF_DAY: 0 -> 1异常,查询得知:这是由于查mysql库,转换类型为datetime类型的字段引起的。 网上的解决方案有多种,大…

坐标系转换QGIS插件GeoHey

最近要将面要素(GCJ02火星坐标系)转WGS84,用程序转太麻烦了,找了半天没找到合适的。 插件非常好用!!! 在QGIS中,由极海(GeoHey)团队提供GeoHey Toolbox插件…

Linux_清理docker容器的log

最近发现服务器硬盘空间满了,就排查了一番,发现有docker容器的log文件占用太多,所以要做一下清理。 首先是要找到docker容器log文件的储存位置。 1、首先在执行了一下 df -Th 命令,发现根目录满了。 2、然后去到根目录下&#xff…

Android项目中接入 Lint代码规范

一、概述 Android Studio 提供了一个名为 Lint 的代码扫描工具,可帮助开发者发现并更正代码结构质量方面的问题,并且无需您实际执行应用,也不必编写测试用例。系统会报告该工具检测到的每个问题并提供问题的描述消息和严重级别,以便开发者可以快速确定需要优先进行的关键改…

Linux下vim的常见命令操作(快速复查)

目录 前言1、Vim常用操作1.1、环境参数1.2、方向1.3、插入命令1.4、定位命令1.5、删除命令1.6、复制和剪切命令1.7、替换和取消命令1.8、搜索和搜索替换命令1.9、保存和退出命令1.10、其他命令1.11、可视模式 前言 本篇文章不面向新手,全文几乎都是命令,…

【Redis】多级缓存之缓存数据同步策略与Canal

目录 一、数据同步策略 1.设置有效期 2.同步双写 3.异步通知 二、Canal 三、监听Canal 一、数据同步策略 缓存数据同步的常见方式有三种: 1.设置有效期 给缓存设置有效期,到期后自动删除。再次查询时更新,他简单、方便,但…