5-UI自动化-三大切换,iframe如何定位,窗口新开、alert弹窗如何进行元素定位

news/2024/4/25 20:43:28/文章来源:https://blog.csdn.net/weixin_41948075/article/details/128077382

5-UI自动化-三大切换,iframe如何定位,窗口新开、alert弹窗如何进行元素定位

  • 新开一个窗口如何定位元素
    • switch_to方法
  • iframe定位元素
  • alert弹窗如何定位元素

上篇介绍4-UI自动化-selenium三大等待操作

web测试过程中有没有遇到以下问题:
1、测试过程中遇到点击后打开了一个新的窗口,这种要如何定位呢?
2、页面嵌套iframe,如何定位元素?
3、有些甚至有alert弹窗,(基本较少,一些银行网站可能会有),如何定位元素?

本篇就来一一介绍

♡\color{red}{\heartsuit}

新开一个窗口如何定位元素

比如我输入百度url,输入淘宝,点击打开淘宝,然后在淘宝搜索连衣裙,点击淘宝会新开一个窗口,那么这个如何定位呢?

先要了解下窗口句柄的概念。窗口句柄其实可以理解为是窗口的id。
Python的WebDriver模块中,提供了相关方法。
这里截取了current_window_handle()和window_handles()源码,从方法名其实就可以看出,current_window_handle是当前窗口句柄,返回的是一个str类型,window_handles()是返回当前会话的所有窗口,是一个列表。

 	@propertydef current_window_handle(self) -> str:"""Returns the handle of the current window.:Usage:::driver.current_window_handle"""return self.execute(Command.W3C_GET_CURRENT_WINDOW_HANDLE)['value']@propertydef window_handles(self) -> List[str]:"""Returns the handles of all windows within the current session.:Usage:::driver.window_handles"""return self.execute(Command.W3C_GET_WINDOW_HANDLES)['value']

可以看到,打印出来两个窗口,第一个f75e8ddc-5367-47e2-b458-1a7681ce9e13是百度搜索窗口id,第二个是淘宝页面的窗口id,但是当前的句柄是在百度搜索页面窗口,也就是说,如果要在淘宝页面进行元素定位,需要先将窗口句柄切换到淘宝页面,才能进行元素定位。

在这里插入图片描述
那么如何切换窗口呢?

Python的WebDriver模块提供了switch_to方法,源码如下。注释部分已经为我们提供了几种切换用法,有切换iframe,切换窗口,退回主页面…

switch_to方法

方法作用
alert = driver.switch_to.alert切换alter弹窗
driver.switch_to.default_content()退回主页面
driver.switch_to.frame(‘frame_name’)通过窗口名切换窗口
driver.switch_to.frame(0)通过索引切换窗口
driver.switch_to.parent_frame()退回父级iframe
 	@propertydef switch_to(self) -> SwitchTo:""":Returns:- SwitchTo: an object containing all options to switch focus into:Usage:::element = driver.switch_to.active_elementalert = driver.switch_to.alertdriver.switch_to.default_content()driver.switch_to.frame('frame_name')driver.switch_to.frame(1)driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])driver.switch_to.parent_frame()driver.switch_to.window('main')"""return self._switch_to

我们用switch_to.window()就可以解决我们的问题,需要将窗口id传进去,但是print(self.driver.current_window_handle) handles = self.driver.window_handles获取到的分别是当前窗口(百度页面),和所有窗口,所有窗口列表中第二个是我们想要元素定位的窗口,那么要怎么传进第二个窗口名呢?不要忘了,它是一个列表,通过列表的取值就可以获取,-1表示获取最后一个窗口,也就是我们新开的窗口。self.driver.switch_to.window(handles[-1])切换到新窗口。

在这里插入图片描述

可以看到成功切换窗口了,那么接下来就回到老知识了,用之前学习过的元素定位就可以了

在这里插入图片描述

最终代码

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditionsclass SwitchSample:def __init__(self):self.driver = webdriver.Firefox()# 在打开浏览器驱动等待3s,再去输入urlself.driver.implicitly_wait(3)self.driver.get('http://baidu.com')def switch_window(self):self.driver.find_element(By.ID, 'kw').send_keys('淘宝')# 在点击百度一下前先等待2sself.driver.find_element(By.ID, 'su').click()# 在输出浏览器的标题前,先等待3s,防止浏览器还未加载完全time.sleep(3)# 点击淘宝self.driver.find_element(By.LINK_TEXT, '淘宝').click()print(self.driver.title)print("当前的窗口{}".format(self.driver.current_window_handle))handles = self.driver.window_handlesprint("当前所有窗口{}".format(handles))self.driver.switch_to.window(handles[-1])print(f"切换后新的窗口{self.driver.current_window_handle}")time.sleep(2)self.driver.find_element(By.ID, 'q').send_keys('连衣裙')print(self.driver.current_url, self.driver.title)time.sleep(2)self.driver.close()self.driver.quit()if __name__ == '__main__':ss = SwitchSample()ss.switch_window()

在这里插入图片描述

♡\color{red}{\heartsuit}

iframe定位元素

IFRAME是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架)。

如果你用Selenium定位的目标元素在某个iframe里,需要先执行switch_to_frame,否则会找不到元素。

标签是一个内联框架,即用来在当前 HTML 页面中嵌入另一个文档的,且所有主流浏览器都支持iframe标签。

如网易云音乐网站,https://music.163.com/,点击进入网页,F12,查看网页elements,然后点击用户登录。用户登录的id属性为"index-enter-default"。

如果直接通过定位元素driver.find_element(By.ID, "index-enter-default").click(),会出现报错:selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="index-enter-default"]

因为用户登录是在iframe中的
在这里插入图片描述
如果想找一个 iframe 当中的元素,不能直接查找,而是先要进入iframe当中。
我们先要定位iframe元素,进入iframe中,然后再去定位iframe当中的元素。代码实现如下:

import timefrom selenium import webdriver
from selenium.webdriver.common.by import Byclass SwitchIframe:def __init__(self):self.driver = webdriver.Firefox()self.driver.maximize_window()# 在打开浏览器驱动等待3s,再去输入urlself.driver.implicitly_wait(3)self.driver.get('https://music.163.com/')def switch_iframe(self):# 先定位iframe元素,然后切换进入iframeiframe = self.driver.find_element(By.ID, "g_iframe")# 等待iframe切换成功wait = WebDriverWait(self.driver, 3)wait.until(expected_conditions.frame_to_be_available_and_switch_to_it(iframe))# 加入显式等待,让代码更智能,增强代码的健壮性# self.driver.switch_to.frame(iframe)# 找到用户登录,点击self.driver.find_element(By.ID, "index-enter-default").click()print(self.driver.title)time.sleep(2)self.driver.close()self.driver.quit()if __name__ == '__main__':si = SwitchIframe()si.switch_iframe()

在这里插入图片描述
可以用显式等待,等待直到iframe切换成功。在代码中加入这些即可,不知道显式等待的,可以看下我的上篇介绍。

# 等待iframe切换成功
wait = WebDriverWait(self.driver, 3)
wait.until(expected_conditions.frame_to_be_available_and_switch_to_it(iframe))

♡\color{red}{\heartsuit}

alert弹窗如何定位元素

alter弹窗的切换也是类似的,只是把上面的代码改吧改吧,wait.until(expected_conditions.alert_is_present())目前alter弹窗用的也相对少了,我找不到网站来演示。暂时不介绍了。之后有相关的,再补充。

哈哈哈,终于让我找到了别人写的弹窗:web自动化测试-文件上传与弹框处理

以下摘抄了一些这位网页写的

在页面操作中有时会遇到 JavaScript 所生成的 alert、confirm 以及 prompt 弹框,可以使用 switch_to.alert () 方法定位到。然后使用 text、accept、dismiss、send_keys 等方法进行操作。

  • text:返回 alert、confirm、prompt 中的文字信息。
  • accept ():接受现有警告框,即点击确定。
  • dismiss ():解散现有警告框,即点击取消。
    send_keys (keysToSend):发送文本至警告框。keysToSend: 将文本发送至警告框。

输入一段文本点击比如提交按钮,会弹出确认内容的弹框,这种场景可以使用下面的方式处理:

在这里插入图片描述
通过name属性定位元素
在这里插入图片描述
同理,如果想要自定义输出弹窗内容,定位输入的元素,输入自定义内容即可。
在这里插入图片描述

import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitclass AlertDemo:def __init__(self):self.driver = webdriver.Firefox()self.driver.maximize_window()self.driver.implicitly_wait(3)def switch_alert(self):"""Alert弹窗获取文本与确认操作"""self.driver.get("http://sahitest.com/demo/alertTest.htm")time.sleep(3)# 可以自定义弹窗的输出内容wait = WebDriverWait(self.driver, 5, 0.5)locator = ('xpath', '//input[@name="t1"]')wait.until(expected_conditions.visibility_of_element_located(locator)).send_keys('金聪聪,冲冲冲')# self.driver.find_element('xpath', '//h2').send_keys("金聪聪,冲冲冲!")self.driver.find_element(By.NAME, "b1").click()# 添加显示等待,等待弹框的出现WebDriverWait(self.driver, 5, 0.5).until(expected_conditions.alert_is_present())# 切换到弹框alert = self.driver.switch_to.alert# 打印弹框的文本print(alert.text)time.sleep(3)# 点击确定,弹窗消失alert.accept()# 点击取消或者关闭弹框# alert.dismiss()if __name__ == '__main__':ad = AlertDemo()ad.switch_alert()

下节分享6-UI自动化-鼠标键盘操作

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

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

相关文章

使用 Hibernate Envers 进行实体审计

业务应用程序中的常见要求是在特定数据更改时存储版本控制信息;当某事发生变化时,谁改变了它,改变了什么。在这篇博文中,我们将介绍Hibernate Envers,它是Hibernate JPA库的一个组件,它为实体类提供了一个简单的审计/版…

期中考试【Verilog】

期中考试【Verilog】前言推荐期中考试一. 单选题(共10题)二. 填空题(共5题)三. 简答题(共3题)四. 其它(共4题)最后前言 编写于2022/11/30 13:30 以下内容源自Verilog期中试题 仅供…

GeoServer服务迁移出现 EncryptionOperationNotPossibleException 错误的解决方案

目录1.前言2.GeoServer服务迁移一般流程3.遇到问题4.原因分析5.解决办法6.根本原因分析7.总结1.前言 这几天我在迁移 GeoServer 服务的时候发现,报了一个错,EncryptionOperationNotPossibleException ,这个错误的大概意思是加密操作不可用异常…

Faster RCNN全文翻译

Abstract—State-of-the-art【最先进的】 object detection networks depend on region proposal algorithms to hypothesize【假设、推测】 object locations.Advances like SPPnet [1] and Fast R-CNN [2] have reduced the running time of these detection networks, expos…

Redis集群方案备忘录

文章目录哨兵模式官方Redis ClusterJedis(客户端分片)Codis(代理分片)哨兵模式 优点 哨兵模式是基于主从模式的,解决可主从模式中master故障不可以自动切换故障的问题。缺点 (1)是一种中心化的…

一些跨平台技术方案的经验参考

今天就站在一个小开发的视角分享一下一个小项目是如何进行跨平台方案选型的 本系列文章先站在公司的的角度对产品技术选型进行分析,然后再根据我们项目实际开发经验进行汇总,供大家参考。 目前大前端技术也非常丰富,可以实现,一…

【uniapp】利用Vuex实现购物车功能

实战项目名称:实现购物车功能 文章目录一、实战步骤1. 先编辑store.js文件2. 定义方法和基本的结构3. 编写SETSHPPING二、在项目中调用1. 触发相应的mutations2. 利用computed计算数量和总价的方法提示:本实战内容大部分为具体实现的思路,界面…

FRED应用:激光二极管的模拟

简介 当提及模拟激光二极管时,FRED软件具有极大的灵活性。在这篇应用笔记中,将会描述简单到详细的激光光源模型。最基本的模型是高斯TEM0,0模。更高级的模型包括在束腰上偏移和发散中的像散光束。激光也可以使用其M2因子表示。最后,可以创…

猿如意开发工具|Sublime Text(4126)

文章目录 一、猿如意是什么? 二、如何使用猿如意下载安装Sublime Text 三、总结 一、猿如意是什么? 猿如意是一款面向开发者的辅助开发工具箱,包含了效率工具、开发工具下载,教程文档,代码片段搜索,全网搜…

Azure DevOps Server 用户组加入 Azure AD Domain Service 管理用户

一,引言 今天我们继续讲解 Azure DevOps Server 的内容,对于管理用户组除了在 Azure DevOps Server 服务器上添加管理员方式外,还有没有其他方式,Azure DevOps 需要加入Azure ADDS 服务域后,Azure DevOps Server 的管理…

oh-my-zsh 为 ls 命令自定义颜色

ls 命令默认显示的颜色是: 白色: 表示普通文件 蓝色: 表示目录 绿色: 表示可执行文件 红色: 表示压缩文件 蓝绿色: 链接文件 红色闪烁:表示链接的文件有问题 黄色: 表示设备文件 灰…

深入理解SR-IOV和IO虚拟化

一、背景 SR-IOV(Single Root I/O Virtualization)是由PCI-SIG组织定义的PCIe规范的扩展规范《Single Root I/O Virtualization and Sharing Specification》,目的是通过提供一种标准规范,为VM(虚拟机)提供…

ProcessDB实时/时序数据库——ODBC之连接数据库

目录 前言 一、安装ProcessDB-ODBC驱动 1.下载ProcessDB-ODBC驱动 2.安装ProcessDB-ODBC驱动 二、配置ProcessDB数据源 三、JAVA连接ProcessDB数据库 前言 ProcessDB实时/时序数据库支持ODBC连接数据库,接下来将和大家分享下如何使用ODBC操作ProcessDB实时/时…

基于Java Web的传智播客crm企业管理系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

tinymce富文本编辑器做评论区

今天分享一下tinymce富文本编辑器做评论区的全过程。 文章目录一、介绍1.最终效果2.功能介绍3.主要项目包版本介绍:二、每个功能的实现1.自定义toolbar的功能区①对应的样式以及意义②对应的代码实现【忽略了一切非实现该功能的代码】2.展示、收起评论区①对应的样式…

软件测试面试技巧:如何提高面试通过率?这3点一定要做到

对于想要进入到软件测试岗的新手人员来说,面试这一关是非常重要的,它直接关系着你的去留,也关系后续的期待遇问题,那么,有没有什么技巧可以帮忙提高面试通过率呢? 关于这一问题答案,我从这几个方…

Java自动化测试调试中遇到的问题

前言:记录下遇到的问题 Java自动化测试在调试中遇到的问题总结 1、遇到的Waring:must be unique [WARNING] dependencies.dependency.(groupId:artifactId:type:classifier) must be unique: com.vertica.jdbc:vertica-jdbc:jar -> duplicate declaration of version 10.…

数商云供应链管理系统助力化工行业企业实现客户订单管理可视化

订单管理是现代企业商务业务的重要组成部分,可以帮助企业解决订单管理低效、混乱等问题。随着产业互联网时代的到来,越来越多企业放弃传统费时费力的手动操作,开始应用数字化的管理工具来提高企业订单管理的水平。这里以化工行业企业为例&…

RabbitMQ 快速入门七种简单模式

RabbitMQ 快速入门七种简单模式起步七种模式项目依赖1、"Hello World!"(1) Connection 方式(2) RabbitTemplate 方式2、Work Queues生产者消费者3、Publish/Subscribe关系绑定生产者消费者4、Routing消费者生产者5. Topics消费者生产者6、RPC7、Publisher Confirms起…

09 更真实的云原生:Kubeadm实际搭建多节点的Kubernetes集群

文章目录1. 前言2. 什么是 kubeadm?2.1 kubeadm 介绍2.2 kubeadm 原理3. kubeadm 实验环境的架构是什么样的?3.1 Master 节点3.2 Worker 节点3.3 辅助节点3.4 安装前的准备工作3.4.1 修改主机名3.4.2 修改 Docker 配置3.4.3 修改网络设置3.4.4 修改交换分区4. 安装…