当前位置: 首页 > news >正文

自动化测试——多窗口切换和切换frame

在这里插入图片描述


这里写目录标题

  • 一、多窗口切换
    • 1、base.py:公共代码
    • 2、切换句柄的方式1,通过for循环
    • 3、切换句柄的方式2,通过索引切换
    • 4、源代码
  • 二、frame窗口
    • 1、什么是frame?
    • 2、Frame 分类
    • 3、判断要定位的元素在不在frame中两种方式
      • 方式一:鼠标选中要定位的元素,底部如果能看到iframe的字样,说明在frame中
      • 方式二:鼠标选中要定位的元素,向上查是否存在iframe标签
    • 4、切换未嵌套的iframe
      • a、使用iframe中的id属性来切换frame
      • b、依据索引来切换frame
    • 5、切换嵌套的iframe

一、多窗口切换

获取当前的窗口句柄:driver.current_window_handles
所有的窗口句柄:driver.window_handles
切换窗口:driver.switch_to.window()

1、base.py:公共代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/2/23 11:18
# @Author  : 杜兰特
# @File    : base.pyimport sys
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keysclass Base:def setup_class(self):self.driver=webdriver.Chrome()self.driver.implicitly_wait(3)self.driver.maximize_window()def teardown(self):self.driver.quit()

继承Base仍然先执行setup_class
最后执行test_down()

2、切换句柄的方式1,通过for循环

for item in window_handles:if item != self.driver.current_window_handle:self.driver.switch_to.window(item)

3、切换句柄的方式2,通过索引切换

self.driver.switch_to.window(window_handles[-1])

4、源代码

import sys
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from .base import Baseclass TestSwitchWindow(Base):#继承Base仍然先执行setup_class#最后执行test_down()def test_switch_window(self):self.driver.get('http://www.baidu.com')self.driver.find_element(By.XPATH,'//a[text()="新闻"]').click()window_handles=self.driver.window_handles#切换到最新的窗口self.driver.switch_to.window(window_handles[-1])time.sleep(5)#按照坐标的形式,滑动到指定的位置ActionChains(self.driver).scroll_by_amount(0,3000).perform()time.sleep(3)#再切换到最新的窗口self.driver.switch_to.window(window_handles[0])time.sleep(3)#文本框中输入文字666self.driver.find_element(By.CSS_SELECTOR,'.s_ipt').send_keys('666')time.sleep(3)

二、frame窗口

在web自动化中,如果一个元素定位不到,那么很大可能是在iframe中。

1、什么是frame?

frame是html中的框架,在html中,所谓的框架就是可以在同一个浏览器中显示不止一个页面。
基于html的框架,又分为垂直框架和水平框架

2、Frame 分类

frame标签包含frameset、frame、iframe三种,
frameset和普通的标签一样,不会影响正常的定位,可以使用index、id、name、webelement任意种方式定位
frame。
而frame与iframe对selenium定位而言是一样的。selenium有一组方法对frame进行操作

frame存在两种:一种是嵌套的,一种是非嵌套的。

3、判断要定位的元素在不在frame中两种方式

方式一:鼠标选中要定位的元素,底部如果能看到iframe的字样,说明在frame中

在这里插入图片描述

方式二:鼠标选中要定位的元素,向上查是否存在iframe标签

在这里插入图片描述

4、切换未嵌套的iframe

driver.switch_to.frame(‘frame的id’):按照frame中的id属性切换frame
driver.switch_to_frame(‘frame-index’):frame无ID的时候依据索引来处理,
索引从0开始driver.switch_to_frame(0)

a、使用iframe中的id属性来切换frame

import sys
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from .base import Baseclass TestSwitchWindow(Base):#继承Base仍然先执行setup_class#最后执行test_down()def test_switch_frame(self):self.driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')ele=self.driver.find_element(By.ID,'iframeResult')self.driver.switch_to.frame(ele)self.driver.find_element(By.XPATH,'//div[text()="请拖拽我!"]')self.driver.switch_to.parent_frame()self.driver.find_element(By.XPATH,'//button[contains(text(),"点击运行")]')time.sleep(3)

b、依据索引来切换frame

import sys
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from .base import Baseclass TestSwitchWindow(Base):#继承Base仍然先执行setup_class#最后执行test_down()def test_switch_frame1(self):self.driver.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')self.driver.switch_to.frame(0)self.driver.find_element(By.XPATH,'//div[text()="请拖拽我!"]')self.driver.switch_to.parent_frame()self.driver.find_element(By.XPATH,'//button[contains(text(),"点击运行")]')time.sleep(3)

5、切换嵌套的iframe

对于嵌套的先进入到iframe的父节点,再进入子节点,然后可以对子节点里面的对象进行处理和操作
driver.switch_to.frame(‘父节点’)
driver.switch_to.frame(‘子节点’)

在一个iframe中,如果还嵌套了另一个iframe
进入:一个一个的进,先进第一层的iframe,一层一层的进
如果出呢:一层一层的出

相关文章:

自动化测试——多窗口切换和切换frame

这里写目录标题一、多窗口切换1、base.py:公共代码2、切换句柄的方式1,通过for循环3、切换句柄的方式2,通过索引切换4、源代码二、frame窗口1、什么是frame?2、Frame 分类3、判断要定位的元素在不在frame中两种方式方式一:鼠标选…...

C#中,Elasticsearch.Net判断空字符串

之前有个业务需求,由于最开始存储到es里的,是默认空字符串。 后面程序取数据时,发现需要取空字符串的数据时,不好取出来。 字符串的字段如图: 实际数据如图: 我用的是C#语言,使用的是Elastic…...

23种设计模式-适配器模式

适配器模式(Adapter Pattern)是一种常用的设计模式,它可以将不兼容的接口转换成可兼容的接口,使得原本不能一起工作的类可以协同工作。 在Java中,适配器模式一般有两种实现方式,即类适配器模式和对象适配器…...

深入理解this指向问题

this指向 在运行时绑定,所以this和函数的调用方式和调用的位置有关,和定义的位置没关系 绑定规则 默认绑定(非严格模式下this指向全局变量,在严格模式下函数内的this指向undefined) 独立函数调用,没有主题 …...

事业单位联考(综合应用A类)典型例题教案

【联考A类】根据材料2,请你概括C市B县旅游质监所投诉处理科小王在接待投诉时存在的主要问题,并指出问题的具体表现。(35分)要求:准确、全面、分条作答。字数在300字以内。材料2:某日,几位游客家…...

frp内网穿透实验

Frp (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用,它支持 TCP、UDP 协议, 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站, 帮你实现 公网 ←→ FRP(服务器) ←→ 内网…...

认识JavaScript中的防抖函数

👨 作者简介:大家好,我是Taro,前端领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录前言一、防抖是什么?1. deounce-v1的基本…...

macOS 13.3 Beta 2 (22E5230e)With OpenCore 0.8.9正式版 and winPE双引导分区原版镜像

原文地址:http://www.imacosx.cn/112340.html,转载需注明出处镜像特点完全由黑果魏叔官方制作,针对各种机型进行默认配置,让黑苹果安装不再困难。系统镜像设置为双引导分区,全面去除clover引导分区(如有需要…...

JetPack—DataStore核心原理与使用

简介 首先,DataStore是Jetpack一部分,是一种数据存储解决方案。其次,DataStore使用协程及flow以异步、一致的方式实现数据的存储。最后是DataStore的实现,分为Preferences DataStore和Proto DataStore:Preferences Da…...

热烈祝贺|酒事有鲤盛装亮相2023中国(山东)精酿啤酒产业发展创新论坛暨展览会

酒事有鲤(济南)品牌管理有限公司是一家致力于将世界顶级精酿啤酒技术和理念与“ 在地”文化有机融合,做世界认 可的多元化好啤酒,通过精致 舒适的家门口酒馆,让啤酒的 世界观更为完整。 中国生物发酵产业协会联合齐鲁…...

深度强化学习DLR

1 强化学习基础知识 强化学习过程:⾸先环境(Env)会给智能体(Agent)⼀个状态(State),智能体接收到环境给的观测值之后会做出⼀个动作(Action),环境接收到智能体给的动作之后会做出⼀系列的反应,例如对这个动作给予⼀个奖励(Reward…...

Android Handler机制(四) Message源码分析

一. 简介 接上一篇文章:Android Handler机制(三) Looper源码分析 ,我们来继续分析一下Message源码 这一系列文章都是为了深入理解Handler机制. Message 作为消息传递的载体,源码主要分为以下 几个部分: 1. 操作数据相关,类似 getter()和 setter()这种…...

【Git】git命令(全)

Git1、本地操作2、版本管理3、远端仓库4、分支管理5、缓存stash6、遗留rebase7、标签管理8、解决冲突9、参考教程10、示例代码1、本地操作 Linux安装git:yum install git查看git版本 git version查看git设置 git config --list设置git属性 git config --global初始…...

软考论文-成本管理(1)

成本管理 1.成本管理的主要内容? 规划成本:制定一个成本管理的计划。估算成本:根据项目范围说明书,项目管理计划和wbs等文档,采用xxx方法进行估算成本成本预算:可以算工作包的费用,制定预算和…...

Java 多线程 --- 锁的概念和类型划分

Java 多线程 --- 锁的概念和类型划分锁的概念乐观锁与悲观锁公平锁与非公平锁什么是可重入锁独占锁与共享锁轻量级锁和重量级锁自旋锁 (Spinlock)锁的概念 锁可以将多个线程对共享数据的并发访问转换为串行访问, 这样一个共享数据一次只能被一个线程访问, 该线程访问结束后其他…...

python程序员狂飙上头——京海市大嫂单推人做个日历不过分吧?

嗨害大家好鸭!我是小熊猫~ 这个反黑剧其实火了很久了, 但是我现在才有空开始看 该说不说,真的很上头!!! 大嫂简直就像是干枯沙漠里的玫瑰 让人眼前一亮哇~~ 我小熊猫此时此刻就成为大嫂的单推人&…...

浅谈子网掩码、IP地址、网络地址之间关系

文章目录一、什么是子网掩码二、给定IP地址,如何求网络地址网络标识(net-id)和主机标识(host-id)计算步骤三、CIDR地址表示方法(Classless Inter Domain Routing)四、IP地址与MAC地址一、什么是子网掩码 在TCP/IP协议…...

前端优化的解决方案

能缓存的,尽量强缓存。减少HTTP请求数 使用外部引入的css和js文件,并且引入的css和js越少越好使用雪碧图(精灵图)img计算缩放也需要时间,使用base64编码将较小图片嵌入到样式表中,减少请求数因为iframe会阻…...

PYthon组合数据类型的简单使用

Python的数据类型有两种,基本数据类型和组合数据类型,组合数据类型在Python的使用中特别重要。 1.组合数据类型的分类: 2.序列类型 序列类型中元素存在顺序关系,可以存在数值相同但位置不同的元素。序列类型支持成员关系操作符&…...

【Java】P2 基础语法与运算符

Java 基础语法 运算符Java注释方法基本数据类型驼峰命名法Scanner类基本运算除法隐式转换逻辑运算符 以及 短路逻辑运算符三元运算符前言 上一节内容涵盖Java的基础知识,包含安装下载,JDK与JRE等。 链接:https://blog.csdn.net/weixin_43098…...

如何快速打造微信风格视频编辑功能?推荐开源神器WeiXinRecordedDemo

如何快速打造微信风格视频编辑功能?推荐开源神器WeiXinRecordedDemo 【免费下载链接】WeiXinRecordedDemo 仿微信视频拍摄UI, 基于ffmpeg的视频录制编辑 项目地址: https://gitcode.com/gh_mirrors/we/WeiXinRecordedDemo WeiXinRecordedDemo是一款基于FFmpe…...

腾讯王者荣耀强化学习环境:打造专业AI训练平台的完整指南

腾讯王者荣耀强化学习环境:打造专业AI训练平台的完整指南 【免费下载链接】hok_env Honor of Kings AI Open Environment of Tencent 项目地址: https://gitcode.com/gh_mirrors/ho/hok_env 在人工智能研究领域,游戏环境一直是强化学习算法的理想…...

GitHub Desktop汉化终极指南:如何让英文界面瞬间变成中文

GitHub Desktop汉化终极指南:如何让英文界面瞬间变成中文 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDesktop2Chinese 还在为GitHub Desktop的英文界面而头疼吗&#xf…...

GeoSeg终极指南:基于Transformer的遥感图像语义分割实战教程

GeoSeg终极指南:基于Transformer的遥感图像语义分割实战教程 【免费下载链接】GeoSeg UNetFormer: A UNet-like transformer for efficient semantic segmentation of remote sensing urban scene imagery, ISPRS. Also, including other vision transformers and C…...

nlp_structbert_sentence-similarity_chinese-large实战教程:本地知识库向量化检索完整指南

nlp_structbert_sentence-similarity_chinese-large实战教程:本地知识库向量化检索完整指南 你是不是经常遇到这样的问题:面对公司内部堆积如山的文档、产品手册、客服记录,想找某个特定信息时,却像大海捞针一样困难?…...

3分钟搞定!Windows 11 LTSC 24H2微软商店终极安装指南

3分钟搞定!Windows 11 LTSC 24H2微软商店终极安装指南 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 你是否正在使用Windows 11 24H2 LTS…...

能耗效率比拼:百川2-13B量化版在OpenClaw长时间任务中的表现

能耗效率比拼:百川2-13B量化版在OpenClaw长时间任务中的表现 1. 测试背景与目标 最近在探索如何用OpenClaw实现个人工作流的自动化时,遇到一个现实问题:当需要长时间运行自动化任务时,本地设备的能耗和稳定性会成为瓶颈。我决定…...

Phi-4-Reasoning-Vision部署案例:基于torch.bfloat16的双卡显存优化实操

Phi-4-Reasoning-Vision部署案例:基于torch.bfloat16的双卡显存优化实操 1. 项目背景与核心价值 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡RTX 4090环境优化。这个工具解决了大模型部署中…...

Lumerical圆锥建模避坑指南:从参数计算到3D旋转生成的完整流程

Lumerical圆锥建模避坑指南:从参数计算到3D旋转生成的完整流程 在光学仿真领域,精确的几何建模往往是获得可靠结果的第一步。对于圆锥结构这种在光子晶体、超表面和纳米天线设计中广泛应用的形状,其建模过程看似简单却暗藏玄机。许多研究人员…...

Windows下OpenClaw实战:30分钟接入Qwen3.5-4B-Claude模型

Windows下OpenClaw实战:30分钟接入Qwen3.5-4B-Claude模型 1. 为什么选择WindowsOpenClaw组合 去年我在尝试自动化办公流程时,发现很多AI工具对Windows支持并不友好。直到遇到OpenClaw,这个开源的智能体框架让我眼前一亮——它不仅能像人类一…...