Python —— UI自动化之 三大等待与三大切换

1、三大等待

1、硬性等待

1、概述

硬性等待也可以称之为强制等待,写法如下:

time.sleep()

优点:使用简单

缺点:等待时间把握不准,容易造成时间浪费或者等待时间不足

2、实战
from time import sleep
from selenium.webdriver.support import expected_conditions as  EC
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWaitdriver = webdriver.Firefox()
driver.get("http://mall.hahahah.com:VVVV/")
driver.maximize_window()
'''
第一类等待:强制等待
'''
sleep(5)
driver.find_element(By.XPATH,"//div[text()='小熊摊手']").click()

2、隐式等待

1、概述

在设置的超时时间范围内不断查找元素,直到找到元素或者超时为止,设置方式如下:

driver.implicitly_wait(5)

优点:全局应用,它适用于WebDriver会话期间中所有查找的Web元素(通过findElement方法) 缺点:只能等待元素存在,不能适用条件更复杂的情况,如:元素可点击、元素可见

其他特点:

        1、如果超过隐式等待的设置时间还是找不到元素,就会抛出了NoSuchElementException-找不到元素异常

        2、放置的位置,一般我们会将其放置到driver的初始化之后

        3、全局生效,只需要设置一次,之后通过find_element去找元素都会有隐式等待的效果

        4、等待条件的区别,只能等待元素存在

2、实战
driver = webdriver.Firefox()
driver.get("http://mall.lemonban.com:3344/")
driver.maximize_window()'''第二类:隐式等待'''
driver.implicitly_wait(5)
driver.find_element(By.XPATH,"//div[text()='小熊摊手']").click()

3、显式等待

1、概述

在设置的超时时间范围内根据特定条件不断查找元素,直到找到元素为止。(如元素存在、元素可点 击、元素可见等) 使用方式:

from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 20,0.5).until(EC.presence_of_element_located((By.LINK_TEXT, '好123')))

优点:可以设置更加丰富的特定条件

缺点:仅对指定的元素生效,代码略复杂

等待条件解释
presence_of_element_located页面元素在页面源代码中存在
visibility_of_element_located页面元素在页面存在并且可见
element_to_be_clickable页面元素是否在页面上可被单击

其他:

        1、如果超过显式等待的设置时间还是找不到元素,就会抛出了TimeoutException-超时异常            2、局部生效的,只能针对单个元素生效

        3、设置的时候是针对单个元素的,并不是全局的

        4、等待更多丰富的条件:等待元素可见、可被点击、等待元素存在...    

2、实战
driver = webdriver.Firefox()
driver.get("http://mall.lemonban.com:3344/")
driver.maximize_window()driver.find_element(By.XPATH,"//div[text()='小熊摊手']").click()
# sleep(2)
'''第三类:显示等待,driver,5,0.5 是5秒钟内每0.5s轮循一次'''
WebDriverWait(driver,5,0.5).until(EC.element_to_be_clickable((By.CLASS_NAME,"buy-now"))).click()

2、三大切换

1、切换Iframe-内联框架-内嵌的网页

1、概述

当想要定位iframe中的元素时,由于driver的焦点还停留在原页面,我们在iframe新的页面上定位元素 时,自然会产生错误,所以我们需要将driver的焦点切换到iframe页面中。

切换方式:

driver.switch_to.frame(XXX);

跳转到父级iframe中:

driver.switch_to.parent_frame(XXX);

回到默认内容页面:

driver.switch_to.default_content(XXX)
2、实战
from time import sleepfrom selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Firefox()
# driver.get("https://qzone.qq.com/")
# driver.get("https://www.126.com/")# 切换iframe
'''QQ空间案例'''
# driver.switch_to.frame(driver.find_element(By.XPATH,"//iframe[@id='login_frame']"))
# # sleep(2)
# driver.find_element(By.ID,'switcher_plogin').click()
# driver.find_element(By.ID,'u').send_keys('1425301899')
# driver.find_element(By.ID,'p').send_keys('123456')
# driver.find_element(By.ID,'login_button').click()
# sleep(2)
# # 返回上一个页面,即跳出当前的iframe
# driver.switch_to.default_content()
'''
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="u"]
会报错,因为有iframe
driver.find_element(By.ID,'u')
''''''126邮箱案例 '''
# 切换
# driver.switch_to.frame(driver.find_element(By.XPATH,"//iframe[contains(@id,'x-URS-iframe')] "))
# driver.find_element(By.XPATH,"//input[@placeholder='邮箱账号或手机号码']").send_keys("123456")
# driver.find_element(By.NAME,"password").send_keys("123456")
# driver.find_element(By.ID,"dologin").click()
# sleep(6)
# # 返回默认iframe页面
# driver.switch_to.default_content()
# driver.close()'''多层iframe嵌套的案例'''
driver.get("file:///D:/%E6%9F%A0%E6%AA%AC%E7%8F%AD%E8%AF%BE%E7%A8%8B/web%E8%87%AA%E5%8A%A8%E5%8C%96/lemon/Python%E8%87%AA%E5%8A%A8%E5%8C%96VIP%E5%BD%95%E6%92%AD%E8%A7%86%E9%A2%91/py%E5%85%A8%E6%A0%8864%E6%9C%9F/%E5%8A%A0%E5%AF%86%E5%90%8E%E8%A7%86%E9%A2%91/iframe%E5%A4%9A%E5%B1%82%E5%B5%8C%E5%A5%97/a.html")
driver.maximize_window()
driver.find_element(By.ID,"aa").send_keys("hhh")
sleep(3)
# 切换到第一层iframe
driver.switch_to.frame(driver.find_element(By.ID,"bframe"))
driver.find_element(By.ID,"bb").send_keys("你好,今天和明天")
sleep(5)
# 切换到第二层iframe
driver.switch_to.frame(driver.find_element(By.ID,"cframe"))
driver.find_element(By.ID,"cc").send_keys("人生美好")
sleep(2)
# 回到默认页面
# 方法一
driver.switch_to.default_content()
# 方法二
driver.switch_to.parent_frame()
driver.switch_to.parent_frame()# 清楚原来写入输入框的元素
driver.find_element(By.ID,"aa").clear()
driver.close()

2、弹窗切换

1、概述

弹窗有三种不同类型:

        alert(警告消息框)、

        confirm(确认消息框)、

        prompt(提示消息对话框) 通过switch_to.alert()切换到弹窗,再使用accept、dismiss、send_keys、text方法进行操作

2、实战
from time import sleepfrom selenium import webdriver
from selenium.webdriver.common.by import By''' 弹窗切换 '''
driver = webdriver.Firefox()
driver.get("file:///D:/%E6%9F%A0%E6%AA%AC%E7%8F%AD%E8%AF%BE%E7%A8%8B/web%E8%87%AA%E5%8A%A8%E5%8C%96/lemon/Python%E8%87%AA%E5%8A%A8%E5%8C%96VIP%E5%BD%95%E6%92%AD%E8%A7%86%E9%A2%91/py%E5%85%A8%E6%A0%8864%E6%9C%9F/%E5%8A%A0%E5%AF%86%E5%90%8E%E8%A7%86%E9%A2%91/%E5%BC%B9%E7%AA%97%E4%B8%8B%E6%8B%89%E6%A1%86demo.html")
driver.maximize_window()
sleep(2)'''1、警告窗,比较常见,不需要切换'''
# driver.find_element(By.ID,"alert").click()
# sleep(5)'''2、确认窗'''
# 点击确认框
# driver.find_element(By.ID,'confirm').click()
# sleep(2)
# 切换弹窗
# driver.switch_to.alert.accept()  确认
# print(driver.switch_to.alert.text)   输出:confirm弹窗演示
# driver.switch_to.alert.dismiss() 取消
'''3、提示窗,比较少见'''
driver.find_element(By.ID,"prompt").click()
sleep(2)
driver.switch_to.alert.send_keys("测试测试测试")
sleep(3)driver.close()

3、切换windows

1、概述

当我们点击了 a 标签元素(超链接)时,会触发打开链接页面的事件,有两种情形:

         1. 在当前窗口加载新页面内容

        2. 新建一个窗口加载新页面内容,这种情况在 a 标签有 target="_blank" 时触发

当发生第2种情况时,同iframe类似,我们需要切换窗口 切换方式: 传入要操作窗口的handle句柄 --窗口的标识,唯一

driver.switch_to.window()

 如何获取到窗口的句柄

driver.current_window_handle(); #获取当前操作窗口的句柄
driver.window_handles(); #获取所有打开的窗口句柄

备注:窗口的句柄并不是固定的,而是由浏览器分配的

2、实战
from time import sleepfrom selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Firefox()
driver.get("https://www.baidu.com/")
driver.maximize_window()
#有一个问题,点击超链接时,超链接元素有属性target="_blank"就会重新打开一个页面
print(driver.window_handles)  # 输出:['b9ddb693-1b03-4e62-981f-f432e01cfe2d']
driver.find_element(By.LINK_TEXT,"地图").click()
driver.find_element(By.LINK_TEXT,"hao123").click()
print(driver.window_handles) # 最开始打开的页面,有一个句柄,如果再打开2个,那么就会增加2个新的句柄
'''
输出:
['d18c1856-8718-4ec8-9541-665d9605c402', '6a90cdf8-20c6-42e7-a55e-397ecf6e5fa6', '8f90fcc2-633b-4b77-9489-982d9e1a9c4b']
'''
handles = driver.window_handles
# 切换窗口,可以根据下标或者用标题去切换
driver.switch_to.window(handles[-1])  # 用下标
#如果是同时打开了多个窗口,要去切换到目标窗口中for handle in handles:#判断是否符合目标窗口,通过url地址或者title确定if driver.title == 'hao123_上网从这里开始':# url地址# if driver.current_url == 'https://www.hao123.com/?src=from_pc':# 符合的话,就说明当前driver是在目标窗口里面,所以就退出循环breakelse:# 否则我们就需要切换窗口driver.switch_to.window(handle)
driver.find_element(By.LINK_TEXT,'携程旅行网').click()
#需要注意,窗口的句柄并不是固定的,而是由浏览器分配的,类似于进程号
#窗口句柄是唯一,但是并不固定
sleep(5)
driver.close()

3、下拉框的定位

1、select标签的下拉框

有3种方法:
1、通过索引来选择选项。索引从0开始
2、通过value属性来选择
3、通过选项的文本来选择 - 也是最常用的方法

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Selectdriver= webdriver.Firefox()
driver.get("file:///D:/%E6%9F%A0%E6%AA%AC%E7%8F%AD%E8%AF%BE%E7%A8%8B/web%E8%87%AA%E5%8A%A8%E5%8C%96/lemon/Python%E8%87%AA%E5%8A%A8%E5%8C%96VIP%E5%BD%95%E6%92%AD%E8%A7%86%E9%A2%91/py%E5%85%A8%E6%A0%8864%E6%9C%9F/%E5%8A%A0%E5%AF%86%E5%90%8E%E8%A7%86%E9%A2%91/%E5%BC%B9%E7%AA%97%E4%B8%8B%E6%8B%89%E6%A1%86demo.html")
driver.maximize_window()'''
一、当下拉框是Select标签的时候,处理方法如下
'''ele = driver.find_element(By.ID,"select")sleep(3)'''方法一:通过索引来选择选项。索引从0开始'''# Select(ele).select_by_index(3)'''方法二:通过value属性来选择'''# Select(ele).select_by_value("o4")'''方法三:通过选项的文本来选择- 最常用'''
Select(ele).select_by_visible_text("浙江省")sleep(5)
driver.close()

2、一般的下拉框

'''
一、非Select标签,处理方法为:直接去点击对应下拉框
以百度页面的“设置”按钮为例
'''
driver.get("https://www.baidu.com/")
driver.find_element(By.ID,"s-usersetting-top").click()
driver.find_element(By.XPATH,"//span[text()='高级搜索']").click()
driver.find_element(By.XPATH,"//span[text()='时间不限']").click()
sleep(3)
driver.find_element(By.XPATH,"//p[text()='一月内']").click()
sleep(5)
driver.close()

4、扩展

如果元素定位不到,有哪些原因?

1、检查我们的元素定位表达式是否写错,可以F12搜索验证

2、检查是否是需要加等待

3、检查是否元素在iframe中,如果是的话就需要切换iframe

4、检查元素是否在新的窗口中,如果是的话我们就需要切换窗口

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

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

相关文章

【Docker 内核详解】namespace 资源隔离(三):PID namespace

namespace 资源隔离(三):PID namespace 1.PID namespace 中的 init 进程2.信号与 init 进程3.挂载 proc 文件系统4.unshare() 和 setns() PID namespace 隔离非常实用,它对进程 PID 重新标号,即两个不同 namespace 下的…

2023年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程(1~8级)全部真题・点这里 Python编程(1~6级)全部真题・点这里 第1题:生日相同 在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试…

redis简介和配置教程

redis简洁版教程 一、概述1、简介2、特点3、优势 二、配置 一、概述 1、简介 Redis是一个高性能的 key-value 数据库。 2、特点 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-v…

基于nodejs+vue校园失物招领平台设计与实现

科学技术日新月异的如今,计算机在生活各个领域都占有重要的作用,尤其在信息管理方面,在这样的大背景下,学习计算机知识不仅仅是为了掌握一种技能,更重要的是能够让它真正地使用到实目 录 摘 要 I ABSTRACT II 目 录 II…

RENAME,CHANGE,ALTER,MODIFY 四个字段的作用和区别

目录 1. ALTER 搭配 ADD 向表中添加字段 2. ALTER 搭配 MODIFY 修改表中的字段长度,默认值,数据类型 3. ALTER 搭配 CHANGER 修改表中字段的名称 4. ALTER,RENAME 都可以修改表的名称 5. DROP 和 TRUNCATE 的区别 1. ALTER 搭配 ADD 向表…

【Pytorch】深度学习之损失函数

文章目录 二分类交叉熵损失函数交叉熵损失函数L1损失函数MSE损失函数平滑L1(Smooth L1)损失函数目标泊松分布的负对数似然损失KL散度MarginRankingLoss多标签边界损失函数二分类损失函数多分类的折页损失三元组损失HingEmbeddingLoss余弦相似度CTC损失函数参考资料 学习目标&am…

[Python小项目] 从桌面壁纸到AI绘画

从桌面壁纸到AI绘画 一、前言 1.1 确认问题 由于生活和工作需要,小编要长时间的使用电脑,小编又懒,一个主题用半年的那种,所以桌面壁纸也是处于常年不更换的状态。即时改变主题也是在微软自带的壁纸中选择,而这些自…

1.安装环境

学习Java的第一步应该从配置环境开始,这篇博文介绍了在哪下载安装包以及如何在windows电脑中配置环境,希望大家看完后可以独立安装 ~ 文章目录 一、下载安装包二、 配置环境 一、下载安装包 安装包可以从官网下载,也可以直接私信我拿取。这里…

三、静态路由实验

拓扑图: 两个路由器分了三个网段出来,首先对两台PC机进行配置 进入R1路由器对两边链路进行ip配置 对AR2进行相同的配置,然后我们查看R1的路由表,里面有一些直连的信息。 三个网段的设备现在可以互通,我们要实现跨网段…

Rabin-Karp 字符串哈希算法总结

Rabin-Karp 字符串哈希算法用到的场景分为两种: 第一种回文场景:正序hash值和逆序hash值的计算方法,相等时说明是回文 pre (pre*base endcode(s[i]))%mod #顺序的前缀hash值 con (endcode(s[i])*mul con)%mod #逆序的前缀hash值第二…

python flask接口字段存在性校验函数(http接口字段校验)(返回提示缺少的字段信息)validate_fields()

文章目录 字段存在性校验示例 字段存在性校验 from flask import Flask, request, jsonifyapp Flask(__name__)def validate_fields(data, fields):missing_fields [field for field in fields if field not in data]if missing_fields:return False, f"缺少以下字段: …

[elasticsearch]使用postman来查询数据

最近需要debug程序,debug的时候需要查找elasticsearch里面的数据是否正确。 第一步建立一个post请求,并按照图下的方式填上ur和参数: 发送post请求,url为: http://ip:port/index_name/_search我这里查询的是title字…

Linux桌面环境(桌面系统)

早期的 Linux 系统都是不带界面的,只能通过命令来管理,比如运行程序、编辑文档、删除文件等。所以,要想熟练使用 Linux,就必须记忆很多命令。 后来随着 Windows 的普及,计算机界面变得越来越漂亮,点点鼠标…

母婴用品会员商城小程序的作用是什么

随着政策放松,母婴行业相比以前迎来了更高的发展空间,由于可以与多个行业连接,因此市场规模也是连年上升,母婴用品是行业重要的分支,近些年从业商家连年增加,但在实际经营中,商家所遇经营痛点也…

Go中varint压缩编码原理分析

文章目录 编码介绍无符号整数较小的值较大的值Go中的实现编码PutUvarint解码Uvarint 有符号整数较小的值(指绝对值)较大的负数(只绝对值)Go中的实现编码PutVarint解码Varint 总结 编码介绍 varint是一种将整数编码为变长字节的压缩编码算法,本篇文章就是分析该编码…

spark读取hive表字段,区分大小写问题

背景 spark任务读取hive表,查询字段为小写,但Hive表字段为大写,无法读取数据 问题错误: 如何解决呢? In version 2.3 and earlier, when reading from a Parquet data source table, Spark always returns null for any column …

详解Leetcode中关于malloc模拟开辟二维数组问题,涉及二维数组的题目所给函数中的各个参数的解读

目录 相关题目介绍二维数组的模拟开辟函数参数解读此列题的解题代码 相关题目介绍 最近博主一直再刷Leetcode上有关c语言的题目,有些题目第一步就将我卡死了。为什么呢?因为题目中所给的函数里的参数的具体含义我既然都不知道是什么意思。当然在请教了一…

数据仓库DW-理论知识储备

数据仓库DW 数据仓库具备 采集数据、分析数据、存储数据的功能,最后得出一些有用的数据,一些目标数据来使用。 采集来自不同源的数据,然后对这些数据进行分析和计算得出一些有用的指标,提供数据决策支持。 数据的来源有&#xff…

uniapp-vue3-标签选择器wo-tag

采用uniapp-vue3实现, 是一款支持高度自定义的标签选择器组件&#xff0c;支持H5、微信小程序&#xff08;其他小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id14960 使用示例 <template>&…

使用 GitHub Action 自动更新 Sealos 集群的应用镜像

在 IT 领域&#xff0c;自动化无疑已成为提高工作效率和减少人为错误的关键。Sealos 作为一个强大的云操作系统&#xff0c;已经为许多企业和开发者提供了稳定可靠的服务。与此同时&#xff0c;随着技术不断发展&#xff0c;集成更多的功能和服务变得尤为重要。考虑到这一点&am…