Python+Selenium+Unittest 之selenium15--等待时间

        在正常的自动化过程中,如果整篇代码中没有加等待时间的话,有时候可能页面跳转或者还没开始点击就执行到下一个流程了,这时候因为页面没有加载完毕,所以有可能会导致找不到对应的元素而报错,因此我们需要在整个代码流程中间合适的位置加上等待时间,使其等待页面加载完毕后,在进行后续代码流程。

       Selenium中有三种等待方式,分别为:强制等待、隐式等待、显示等待。

1、强制等待。

        强制等待顾名思义就是按着设置的等待时间进行等待,设置的多久就是多久,无论元素是有有加载出来,都必须到设置的时间才会进行下面的操作,这种方式相比其他两种在自动化中不是特别灵活。

        强制等待使用的是time模块的sleep(),在sleep()括号中填入数字即可,单位为秒。

from selenium import webdriver        #导入selenium模块的webdriver
from time import sleep       #导入Time模块的sleep
driver = webdriver.Chrome()     #webdriver.Chrome()是启动谷歌浏览器然后定义成变量driver
driver.get("http://www.baidu.com")    #打开百度浏览器
sleep(5)   #等待5秒
driver.maximize_window()   #全屏显示

        上面的这段就能明显的看出来,打开浏览器后,等待了5s浏览器才全屏显示的。

2、隐式等待

        隐式等待相比较强制等待比较灵活,隐式等待就是设置一个全局的等待时间即可,定义一次就行,不用在特定的步骤写了,设置完后,就是会在等待时间里,如果页面加载完成(浏览器整个页面元素都加载完毕,一般看浏览器上没有loading的那个小圈圈就行),就可以执行下一步了,不用说是非得等到时间到才执行,如果超过设置的时间还没有加载完成,就不等了去执行下一步。      

        隐式等待用得是implicitly_wait()方法,在括号里填上时间即可。从下面的代码中就可以看出,不到5S时就对浏览器执行了全屏操作。

from selenium import webdriver        #导入selenium模块的webdriver
from time import sleep       #导入Time模块的sleep
driver = webdriver.Chrome()     #webdriver.Chrome()是启动谷歌浏览器然后定义成变量driver
driver.get("http://www.baidu.com")    #打开百度浏览器
driver.implicitly_wait(5)   #最多等待5s,如果页面加载完毕开始后续代码执行,设置一次后,后面都会按着这个规则去执行
driver.maximize_window()   #全屏显示

3、显示等待

        显示等待相比较隐式等待更加灵活。显示等待是会加一个判断条件,如果我在规定时间里找到了这个元素,我就开始往下执行了,有时候可能页面里咱们需要的元素已经加载出来了,但是别的元素还在加载中,这时候如果我们用隐式等待的话,他会等都加载出来才执行,但是显示等待发现有我需要的元素了,就停止等待,往下执行代码了。

        显示等待除了要设置等待时间还需要设置一下条件,在使用是需要导入WebDriverWait模块(时间)和expected_conditions模块(条件)。

(1)WebDriverWait()

对于WebDriverWait()方法来说,需要在括号中填入以下内容:

WebDriverWait(driver,timeout,poll_frequency,ignore_exception)

#driver:浏览器驱动
#timeout:设置的最长等待时间
#poll_frequency:检查元素是否存在的时间间隔
#ignore_exception:超时没找到元素后抛出的异常信息

        一般来说只填入driver和timeout即可,其他的为默认值可以不进行填写,如:WebDriverWait(driver,5) ,就是最长等待5S,每500ms检测一次元素是否加载出来了,如果没有加载出来报默认的异常NoSuchElementException。

(2)until()和not_until()

        WebDriverWait()大部分都是配合until()和not_until()使用。下面可以看下具体用法:

until()的用法是直到后面的条件返回内容为Ture,否则就报错错误信息,一般括号里填写为until(method:判断的方法,message=“报错信息”)。用于跟着expected_conditions()方法来判断元素是否加载出来了。

not_until()的用法和until()正好相反,not_until()是直到后面的条件返回的内容为False,否则就报出错误信息,括号里填写的与until()一样。not_until()一般是用于判断某个元素是否消失了。

from selenium import webdriver    #导入selenium的webdriver模块
from selenium.webdriver.support.wait import WebDriverWait  #导入selenium的WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC   #导入selenium的expected_conditions模块并命名为EC
from selenium.webdriver.common.by import By    #导入导入selenium的by模块并命名为By
driver = webdriver.Chrome()       #webdriver.Chrome()是启动谷歌浏览器然后定义成变量driver  
driver.get("https://www.baidu.com")    #打开百度浏览器
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,"kw"))).send_keys("3333")    #设置强制等待10面,每500ms检查一次元素是否存在,检查方式为持续检查,知道发现了ID为kw的元素,然后返回True给until,之后执行输入"3333"的命令

(3)expected_conditions()

对于expected_conditions()方法来说,使用时需要在括号里面填上具体的判断条件即可,详细内容见下面。

expected_conditions常用的判断方法
title_is("预期title")网页的title是否完全等于预期(返回布尔值)
title_contains("预期")网页的title是否包含预期结果(返回布尔值)
url_to_be("url")网页的网址是否完全等于预期结果(返回布尔值)
url_contains("url")网页的网址是否包含预期结果(返回布尔值)
url_matches("正则表达式")网页的网址是否满足于正则表达式匹配的网址(返回布尔值)
presence_of_element_located("元素")判断元素是否存在于页面DOM树中(元素不一定可见)(返回元素对象)
visibility_of_element_located("元素")判断元素是否可见(返回元素对象)(locator定位)
visibility_of("元素")判断元素是否可见(返回元素对象)(element定位)(关于locator定位和element定位方式大家自行百度下吧)
text_to_be_present_in_elemen(元素,"文本")判断文本是否存在于元素中(返回布尔值)
number_of_windows_to_be(数字)判断打开的窗口数是否于实际一致(返回布尔值)
element_to_be_clickable(元素)判断元素是否可点击(返回布尔值)
new_window_is_opened(handle)判断是否打开了一个新的窗口(返回布尔值)
element_to_be_selected(元素)判断元素是否被选中(一般用于下拉框)(返回布尔值)(element定位)
element_located_to_be_selected(元素)判断元素是否被选中(一般用于下拉框)(返回布尔值)(locator定位)
element_selection_state_to_be(元素,布尔值)判断元素的选中状态是否符合预期(返回布尔值)(element定位)
element_located_selection_state_to_be(元素,布尔值)判断元素的选中状态是否符合预期(返回布尔值)(locator定位)
alert_is_present()判断页面是否有alert对话框(如果存在切换到alert,如果不存在返回False)

        这里就不对expected_conditions常用方法一一举例了,记住整体的使用方式,配合我们需要的场景进行使用即可。


如果大家在使用过程中遇到了问题,可以在文章下留言,或者关注公众号:刘阿童木的进化记录,进行留言

                   下图为公众号二维码,内容会同步发出,大家可以关注一起学习!

                                            

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++语法学习

一、字符串 1.字符与整数的联系--ASCII表 0~9 :48~57 A~Z:65~90 a~z:97~122 字符与数字之间转换: 1.1字符转数字&#xff1a; 字符转数字&#xff1a; char c A;cout << c-A << endl; //输出0cout << (int)c << endl; //输出…

go并发编程-runtime、Channel与Goroutine

1. runtime包 1.1.1. runtime.Gosched() 让出CPU时间片&#xff0c;重新等待安排任务(大概意思就是本来计划的好好的周末出去烧烤&#xff0c;但是你妈让你去相亲,两种情况第一就是你相亲速度非常快&#xff0c;见面就黄不耽误你继续烧烤&#xff0c;第二种情况就是你相亲速度…

日志报错:Unexpected EOF read on the socket

记一次关于网关的问题及修复问题。 项目提测后&#xff0c;修改时web端页面出现502&#xff0c;查看后台服务日志发现&#xff1a; org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOExcept…

鸿蒙harmony--TypeScript基础语法

把青春献给身后那座辉煌的都市&#xff0c;为了这个美梦我们付出着代价 目录 一&#xff0c;基础类型 二&#xff0c;数组 三&#xff0c;any 四&#xff0c;变量的类型注释 五&#xff0c;函数 5.1 参数类型注解 5.2 返回类型注解 5.3 匿名函数 六&#xff0c;对象类型 可选属…

整数对最小和 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定两个整数数组array1、array2&#xff0c;数组元素按升序排列。 假设从array1、array2中分别取出一个元素可构成一对元素&#xff0c;现在需要取出k对元素&am…

【Java的基本数据类型及其占用内存大小和默认值】

Java的基本数据类型及其占用内存大小和默认值 Java的基本数据类型包括以下几种&#xff1a; byte&#xff08;字节型&#xff09;&#xff1a;占用1个字节&#xff0c;取值范围是-128到127&#xff0c;默认值为0。short&#xff08;短整型&#xff09;&#xff1a;占用2个字节&…

【LeetCode每日一题】1109. 航班预订统计1094. 拼车 (差分数组)

差分数组 差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。 一、基本概念&#xff1a; 差分数组的定义如下&#xff1a; 假设原始数组为arr&#xff0c;差分数组为diff&#xff0c;其中diff[i] arr[i] - arr[i-1]&#xff08;0 < i < n&#xff0…

Ubuntu-22.04上ToDest设置开机不弹出图形界面

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、开始操作1.设置图形端 总结 前言 有时候远程成为开发必不可少的工具&#xff0c;目前国内有很多相关的软件&#xff0c;比较有名的是向日葵、ToDesk、Rust…

美团面试:Sentinel底层滑动时间窗限流算法怎么实现的?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 问题1&#xff1a;Sentinel高可用熔断降级&#xff0c;是如何…

2023年06月CCF-GESP编程能力等级认证Python编程四级真题解析

一、单选题(共15题,共30分) 第1题 高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A:编辑 B:保存 C:调试 D:编译 答案:D 第2题 排序算法是稳定的(Stable Sorting),就是指排序算法可以保证,在待排序数据中有两个相等记录的关…

GPT-5的功能界面曝光。。。

最近网络上流传的照片是否真实尚不可知&#xff0c;我们需要进一步的核实与分析。 GPT-5的预期发布已经引起了业界的极大关注。根据Roemmele的透露&#xff0c;GPT-5将是一个革命性的多模态模型&#xff0c;能够支持语音、图像、编程代码和视频等多种格式&#xff0c;这标志着…

C++关键词auto详解

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、小思考 随着我们对于C的不断学习&#xff0c;遇到的程序越来越复杂&#xff0c;程序中用到的类型也越来越复杂…

《高性能MySQL》

文章目录 一、创建1. 磁盘1.1 页、扇区、寻道、寻址、硬盘性能 2. 行结构row_format2.1 Compact紧凑2.1.1 行溢出2.1.2 作用2.1.3 内容1-额外信息1、变长字段长度2、NULL值列表3、记录头信息 2.1.4 内容2-真实数据4、表中列的值5、transaction_id6、roll_point7、row_id 2.2 dy…

RAG Fusion简明教程

随着 NLP 和生成 AI 领域的最新进展&#xff0c;RAG&#xff08;检索增强生成&#xff09;的引入有望通过结合基于检索的模型和序列到序列的强大功能&#xff0c;对 BERT Chat GPT 等现有技术进行改进。 架构。 RAG 是一个人工智能框架&#xff0c;旨在通过建立外部知识源模型来…

SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)

点击下载《SpringBootRedis如何实现用户输入错误密码后限制登录&#xff08;含源码&#xff09;》 1. 引言 在当今的网络环境中&#xff0c;保障用户账户的安全性是非常重要的。为了防止暴力破解和恶意攻击&#xff0c;我们需要在用户尝试登录失败一定次数后限制其登录。这不…

Python武器库开发-武器库篇之FTP服务暴力破解(五十三)

Python武器库开发-武器库篇之FTP服务暴力破解(五十三) FTP (File Transfer Protocol) 是一种用于在网络上传输文件的协议。它允许用户通过一个客户端应用程序连接到远程服务器&#xff0c;并通过该服务器传输文件。FTP 服务是在互联网上广泛使用的一种服务&#xff0c;它使用户…

postman用法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、postman怎么使用json输出 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0…

人工智能时代:AI提示工程的奥秘 —— 驾驭大语言模型的秘密武器

文章目录 一、引言二、提示工程与大语言模型三、大语言模型的应用实践四、策略与技巧五、结语《AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型》亮点内容简介作者简介目录获取方式 一、引言 随着人工智能技术的飞速发展&#xff0c;大语言模型作为一种新…

如何在FBX剔除Lit.shader依赖

1&#xff09;如何在FBX剔除Lit.shader依赖 2&#xff09;Unity出AAB包&#xff08;PlayAssetDelivery&#xff09;模式下加载资源过慢问题 3&#xff09;如何在URP中正确打出Shader变体 4&#xff09;XLua打包Lua文件粒度问题 这是第371篇UWA技术知识分享的推送&#xff0c;精…

VueFire:一个一流的 Vue 和 Firebase 体验,包括对 Nuxt 的支持,现在已经稳定了

VueFire&#xff0c;一个一流的 Vue 和 Firebase 体验 — 包括对 Nuxt 的支持&#xff0c;现在已经稳定了。 Vue 和 Firebase 现在比以往任何时候都更好了。 构建更好的VueFire 去年&#xff0c;我们宣布与 Eduardo San Martin Morote 合作&#xff0c;构建一个成熟的 Vue 和…