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

news2024/11/25 17:24:29

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()是返回当前会话的所有窗口,是一个列表。

 	@property
    def 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']

    @property
    def 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
 	@property
    def switch_to(self) -> SwitchTo:
        """
        :Returns:
            - SwitchTo: an object containing all options to switch focus into

        :Usage:
            ::

                element = driver.switch_to.active_element
                alert = driver.switch_to.alert
                driver.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_conditions


class SwitchSample:

    def __init__(self):
        self.driver = webdriver.Firefox()
        # 在打开浏览器驱动等待3s,再去输入url
        self.driver.implicitly_wait(3)
        self.driver.get('http://baidu.com')

    def switch_window(self):
        self.driver.find_element(By.ID, 'kw').send_keys('淘宝')
        # 在点击百度一下前先等待2s
        self.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_handles
        print("当前所有窗口{}".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 time

from selenium import webdriver
from selenium.webdriver.common.by import By


class SwitchIframe:

    def __init__(self):
        self.driver = webdriver.Firefox()
        self.driver.maximize_window()
        # 在打开浏览器驱动等待3s,再去输入url
        self.driver.implicitly_wait(3)
        self.driver.get('https://music.163.com/')

    def switch_iframe(self):
        # 先定位iframe元素,然后切换进入iframe
        iframe = 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 time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait


class 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.coloradmin.cn/o/48512.html

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

相关文章

中概股回暖,B站打开向上通道

“回来了,我感觉他们都回来了。”周星驰《少林足球》中这句经典台词,最近成为了中概股投资者的口头禅。 财报季临近尾声,好消息已经层出不穷。中概互联网指数KWEB在11月的涨幅超过30%,不少个股从低位大幅反弹,其中就包…

C/C++家族族谱管理系统

C/C家族族谱管理系统 课题名称: 家族族谱管理 主要目标: 通过训练,强化学生对树结构、二叉树结构的表示及操作算法的掌握和灵活运用 3.具体要求: 要求设计实现具有下列功能的家谱管理系统: (1) 输入文件以存放最初家谱中各成员的信息,成员的信息中…

[Java] 从内存的角度去理解ThreadLocal如何把不同线程间的访问隔离开来?ThreadLocal的内存泄露问题是什么?如何避免?

文章目录前言前置知识:堆内存与栈内存普通数据结构类和ThreadLocal存取数据的不同?结合源码来看ThreadLocal如何实现的1. ThreadLocal类get方法2. ThreadLocal类的getMap(Thread)方法3. Thread类的threadLocals属性4. ThreadLocal类的setInitialValue()方…

win11该文件没有与之关联的应用怎么办

win11用户在使用电脑的时候遇到了“该文件没有与之关联的应用”的提示,这是怎么回事呢?应该怎么办呢?出现这个情况应该是注册表被误删了,大家需要新建一个文本文档,然后输入下文提供的指令,之后将其重命名为…

亚信科技亮相南京软博会,数智赋能百行千业

11月23至25日,主题为“软件赋能 数智转型”的2022中国(南京)国际软件产品和信息服务交易博览会在南京国际博览中心盛大启幕。“数智化全栈能力提供商”亚信科技携“云网边端”产品体系,5G、人工智能、边缘AI、机器人流程自动化、数…

AlphaFold2源码解析(4)--模型架构

AlphaFold2源码解析(4)–模型架构 我们将Alphafold的流程分为一下几个部分: 搜索同源序列和模板特征构造特征表示MSA表示与残基对表示之间互相交换信息残基的抽象表示转换成具体的三维空间坐标 模型参数 AlphaFold有多个不同类型的参数(单体&#x…

一文让你理解Linux权限问题

前言: 权限是个很重要的一部分,无论是在Linux系统中还是在生活里,权限都是必不可缺失的一部分,在生活中,权限是很常见的,例如VIP,如果你不是VIP你就不能享用VIP的一些特有的功能,这就…

WebRTC学习笔记四 RTCDataChannel

一、RTCDataChannel 简单来说,RTCDataChannel 就是在点对点连接中建立一个双向的数据通道,从而获得文本、文件等数据的点对点传输能力。它依赖于流控制传输协议(SCTP),SCTP 是一种传输协议,类似于 TCP 和 U…

[ECCV2022]Language-Driven Artistic Style Transfer

标题:Language-Driven Artistic Style Transfer 链接:https://sites.cs.ucsb.edu/~william/papers/LDAST.pdf 如标题所示,本文做的是基于文本引导的风格迁移。整体的思路还是用的AST(arbitrary style transfer)那一套自编码器结构。AST的思…

期中考试【Verilog】

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

Windows访问centOS的Tomcat

首先,先准备好jdk1.8和Tomcat的文件 点击此处获取jdk1.8和Tomcat的文件(提取码:xxrc) 配置IP地址 打开终端输入ifconfig,检查centOS的ip地址 根据要求,是要把ip地址最后一位改为自己的学号(前…

手把手教你做智能合约开源|多文件合约开源|引用文件开源

本文手把手教你使用 区块链浏览器 验证智能合约的三种方式。 验证单一 Solidity 文件 在开始验证之前,我们需要首先部署智能合约。进入 Remix IDE,创建一个合约新文件。复制粘贴下面的代码: // SPDX-License-Identifier: MITpragma solidit…

夜曲编程Python体验课

目录 day1 编程中的“文本” 代码规范 打印数字 打印字符串 注释 总结思维导图 day2 变量与赋值 变量 常量 赋值 格式化输出 转义字符: 总结思维导图 day3 编程中的“数字” 整形 浮点型 运算符 四种常见的四则运算符( - * / &…

【软件测试】测试人的我们,咋做一个如鱼得水的测试员?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 一千个人&#xff0…

短视频创作,主动变现和被动变现方式详解,建议收藏反复阅读-下

同样先说纲要,有兴趣可以继续看下去,上一篇讨论了抖音变现的有三个建议,①变现标准低、②变现天花板高、③可主动变现。 这一篇的内容只要是抖音上被动和主动两类变现方式,涉及了直播打赏,广告接单,视频带货…

小啊呜产品读书笔记001:《邱岳的产品手记-15》第28讲 产品分析的套路(上):谁是利益相关者? 29讲产品分析的套路(中):解决什么问题?

小啊呜产品读书笔记001:《邱岳的产品手记-15》第28讲 产品分析的套路(上):谁是利益相关者?& 29讲产品分析的套路(中):解决什么问题? 一、今日阅读计划二、泛读&知…

【Big Data】Hadoop--MapReduce经典题型实战(单词统计+成绩排序+文档倒插序列+每月Top3温度)

🍊本文使用了4个经典案例进行MapReduce实战 🍊参考官方源码,代码风格较为优雅 🍊解析详细 一、Introduction MapReduce是一个分布式运算程序的编程框架,核心功能是将用户写的业务逻辑代码和自身默认代码整合成一个完整…

vue+videojs视频播放、视频切换、视频断点分段上传

“本次需求是做一个视频列表,点击视频列表播放对应视频;同时要求实现断点分段上传大文件(视频)的功能 。 videojs文档:Getting Started with Video.js - Video.js: The Player Framework | Video.js 断点续传组件地址…

WebRTC学习笔记六 兼容性 adapter.js

一、adapter.js发展背景 adapter.js自2012年底或者2013年初WebRTC早期的时候就已经出现了。它最初是Google的apprtc demo的一部分。原始版本仍可在Chrome tree中找到。它是一个非常小的项目,还没有150行。主要功能是隐藏像webkitRTCPeerConnection和mozRTCPeerConne…

Spring Boot+Mybatis:实现数据库登录注册与两种properties配置参数读取

〇、参考资料 1、hutool介绍 https://blog.csdn.net/abst122/article/details/124091375 2、Spring BootMybatis实现登录注册 https://www.cnblogs.com/wiki918/p/16221758.html 3、Spring Boot读取自定义配置文件 https://www.yisu.com/zixun/366877.html 4、Spring Boot读取p…