python3+selenium4实现切换窗口与iframe的方法

在自动化测试过程中,有时后会遇到元素定位方式没有问题,但是依旧抛出无法找到元素的异常的问题,通常情况下,如果元素定位没有问题,但还是无法找到元素,则可能是由于当前焦点不在指定页面或iframe导致的,以下将对两种情况分别进行说明

1、切换窗口

比如我们现在有这样一个需求,进入百度首页后,点击新闻,然后在新闻页面的搜索框输入selenium

而使用selenium要如何实现呢,在对selenium不是很熟悉的情况下,仅仅学习了之前的内容,写出的代码就可能会抛出找不到贴吧搜索输入框元素异常,示例代码如下

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

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '新闻').click()   # 点击新闻
driver.find_element(By.ID, 'ww').send_keys('selenium')  # 在新闻首页搜索框输入selenium
driver.quit()

代码看起来没什么问题,打开百度首页,点击贴吧,然后在贴吧登录页面点击立即注册,元素定位也没错,但是执行就会抛出异常,无法找到贴吧的输入框元素

造成此错误的原因是因为点击新闻之后,又打开了一个新的窗口,此时打开的窗口有百度首页和新闻页,而selenium不知道我们需不需要切换窗口,所以不会自动给我们切换窗口,需要手动进行窗口的切换

而要实现窗口的切换,则需要用到获取浏览器句柄以及窗口切换的方法

1.1、获取句柄

句柄是当前浏览器窗口或选项卡的一个类似id一样的唯一标识,可以用来判断当前窗口或选项卡是否在指定的窗口,获取句柄的方法如下:

获取当前页面句柄
driver.current_window_handle

获取当前所有存在的窗口句柄,多个句柄以列表方式存储
driver.window_handles

通常的,我们只需要使用当前窗口句柄与所有窗口句柄列表进行对比,然后使用窗口切换的方法,就可以完成窗口的切换

1.2、切换窗口

要完成窗口切换,需要使用方法switch_to.window(),完成新闻页输入selenium操作完整成功的示例代码如下:

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

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '新闻').click()   # 点击新闻

handle = driver.current_window_handle  # 获取当前窗口句柄
handles = driver.window_handles   # 获取所有窗口句柄
for window_handle in handles:   # 循环比较句柄
    if window_handle != handle:   # 如果窗口句柄与当前窗口句柄不一致,则切换到该窗口
        driver.switch_to.window(window_handle)

driver.find_element(By.ID, 'ww').send_keys('selenium')  # 在新闻首页搜索框输入selenium
time.sleep(2)
driver.quit()

以上代码只适用于两个窗口的切换,如果同时打开更多窗口,使用上述代码只能切换到列表最后一个非当前窗口,那存在多个窗口时需要如何准确的切换到指定的窗口呢,其实只需要追加一层判断即可,示例如下:

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

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '新闻').click()   # 点击新闻

handle = driver.current_window_handle  # 获取当前窗口句柄
handles = driver.window_handles   # 获取所有窗口句柄
for window_handle in handles:   # 循环比较句柄
    if window_handle != handle:   # 如果窗口句柄与当前窗口句柄不一致,则切换到该窗口
        driver.switch_to.window(window_handle)
        if driver.title == '百度新闻——海量中文资讯平台':     # 如果切换后的窗口的title与指定的一致,结束循环
            break

driver.find_element(By.ID, 'ww').send_keys('selenium')  # 在新闻首页搜索框输入selenium
time.sleep(2)
driver.quit()

上述代码中添加了一层判断切换后的窗口title是否与预期一致,如果一致则跳出循环以保证多窗口切换时能够准确的切换到预期的窗口就停止切换

1.3、关闭窗口并切换回原窗口

在切换到指定窗口完成测试后,如果我们需要关闭此窗口并切换到原来的窗口,示例代码如下:

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

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '新闻').click()   # 点击新闻

handle = driver.current_window_handle  # 获取当前窗口句柄
handles = driver.window_handles   # 获取所有窗口句柄
for window_handle in handles:   # 循环比较句柄
    if window_handle != handle:   # 如果窗口句柄与当前窗口句柄不一致,则切换到该窗口
        driver.switch_to.window(window_handle)
        if driver.title == '百度新闻——海量中文资讯平台':     # 如果切换后的窗口的title与指定的一致,结束循环
            break
driver.find_element(By.ID, 'ww').send_keys('selenium')  # 在新闻首页搜索框输入selenium

driver.close()  # 关闭当前新闻窗口
driver.switch_to.window(handle)  # 切换回原窗口,即百度首页
driver.find_element(By.ID, 'kw').send_keys('selenium')   # 百度首页输入框输入selenium
time.sleep(2)
driver.quit()

需要注意的是,close()方法只是关闭当前所在窗口,但驱动的浏览器依旧处于等待执行状态,而quit()则会退出当前会话,无论打开了多少个窗口,均会被一次性关闭,且浏览器不再接受新的操作命令

2、切换iframe

除了打开多个窗口会导致无法找到元素之外,如果元素包含在iframe中,也会导致无法找到元素,比如现有如下元素:

<html>
    <iframe src="a.html" id="frame0" name="frame1">
        <input id="kw" / >
    </iframe>
</html>

此时id为kw的input标签元素处于iframe中,要定位此元素,若直接使用

driver.find_element(By.ID, 'kw')

也会抛出无法找到元素的异常,那么如何实现frame的切换,从而精准定位到元素呢

2.1、切换到iframe中

selenium提供了switch_to.frame()方法用于实现frame的切换,此方法接收id、name、index以及selenium的WebElement对象用来实现切换,比如上述的代码中,要切换到iframe中,则可以使用以下代码实现:

from selenium import webdriver

driver = webdriver.Edge()
driver.switch_to.frame('frame0')   # 通过id切换iframe
# driver.switch_to.frame('frame1')   # 通过name切换iframe
# driver.switch_to.frame(0)   # 通过index切换iframe,0代表第一个
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))  # 通过WebElement对象切换iframe

一般情况下,通过id或name即可解决大部分iframe切换的问题,如果没有这两个属性,再考虑使用index以及WebElement对象来实现

2.2、从frame中切换到主界面

在测试过程中,我们不仅会从主界面切换到iframe中,当操作完frame中的元素后,经常需要重新切换到主界面进行其他操作,切换回主页面使用方法如下:

driver.switch_to.default_content()

2.3、嵌套多层iframe的切换

有时候我们会遇到嵌套多层frame的情况,如下所示

<html>
    <iframe src="a.html" id="frame1">
    	    <iframe src="b.html" id="frame2" >
    			<input id="kw" / >
			</iframe>
    </iframe>
</html>

多层嵌套的情况下,如果要从主界面切换到第二层iframe,则需要一层一层的切换进去,即先切换到frame1,再切换到frame2,而不是直接切换进入frame2

driver.switch_to.frame("frame1")
driver.switch_to.frame("frame2")

selenium还提供了一个切换到父frame的方法,比如我们切换到frame2之后,要想切换到frame1操作,则不需要先切回主界面再切换到frame,而是使用如下方法:

driver.switch_to.parent_frame()

需要注意的是,如果当前已经是主页面,则使用此方法无效
灵活使用以上方法,则可轻松应对iframe的切换与窗口切换的问题,从此告别定位不到元素的苦恼

到此这篇关于python3+selenium4实现切换窗口与iframe的方法的文章就介绍到这了,更多相关python3 selenium4切换窗口与iframe内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python3 selenium 切换窗口的几种方法小结

    第一种方法: 使用场景: 打开多个窗口,需要定位到新打开的窗口 使用方法: # 获取打开的多个窗口句柄 windows = driver.window_handles # 切换到当前最新打开的窗口 driver.switch_to.window(windows[-1]) 举例说明: # _._ coding:utf-8 _._ """ :author: 花花测试 :time: 2017.05.03 :content: 使用第一种方法切换浏览器 ""&quo

  • python3+selenium4实现切换窗口与iframe的方法

    在自动化测试过程中,有时后会遇到元素定位方式没有问题,但是依旧抛出无法找到元素的异常的问题,通常情况下,如果元素定位没有问题,但还是无法找到元素,则可能是由于当前焦点不在指定页面或iframe导致的,以下将对两种情况分别进行说明 1.切换窗口 比如我们现在有这样一个需求,进入百度首页后,点击新闻,然后在新闻页面的搜索框输入selenium 而使用selenium要如何实现呢,在对selenium不是很熟悉的情况下,仅仅学习了之前的内容,写出的代码就可能会抛出找不到贴吧搜索输入框元素异常,示例代码

  • 浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)

    1.打开指定的网页地址 我们使用selenium进行自动化测试时,打开浏览器之后,第一步就是让浏览器访问我们指定的地址,可使用get方法实现 from selenium import webdriver driver = webdriver.Edge() driver.get('https://www.baidu.com/') # 本行用于访问指定的地址 2.获取当前页面url 我们在测试过程中,有时需要获取当前页面的url以判断是否跳转到指定页面,获取页面url的方法如下: from sele

  • iframe 父窗口和子窗口相互的调用方法集锦

    一.父窗口调用iframe子窗口方法 1.HTML语法:<iframe name="myFrame" src="child.html"></iframe> 2.父窗口调用子窗口:myFrame.window.functionName(); 3.子窗品调用父窗口:parent.functionName(); 简单地说,也就是在子窗口中调用的变量或函数前加个parent.就行 4.父窗口页面源码: 复制代码 代码如下: <html>

  • iframe中子父类窗口调用JS的方法及注意事项

    一.前言 我页面用的是EasyUI的弹出窗口里面嵌入一个iframe. 第一:父窗口打开子窗口是一个新增用户信息的iframe子页面,点击保存后,子窗口iframe则去调用父窗口的function closeAddWindow()方法,让父窗口去关闭新增页面: 第二:父窗口打开一个设置用户权限的iframe子窗口,首先打开这个子窗口会全部加载数据库表中所有的存在的权限,然后子窗口需要把加载的权限信息拼接html  Append到一个ID为<table id="tb"><

  • 详解C#切换窗口

    最近项目不多忙,于是抽点时间巩固下切换窗口问题,感兴趣的朋友跟着小编一起学习吧! 1.第一个方法比较简单,也比较萌,是我最近无意间发现的~ public MainFrom_Client() { InitializeComponent(); SetMainTreadState(); } //先设定主窗体(也就是MainFrom_Client)的透明度和任务栏状态 private void SetMainTreadState() { //这个其实是障眼法!把主窗体(也就是MainFrom_Clien

  • Ubuntu18.04中Python2.7与Python3.6环境切换

    本文为大家分享了Python2.7与Python3.6环境切换的具体方法,供大家参考,具体内容如下 系统支持为:Ubuntu18.04 系统默认安装:Python2.7 自己安装:Python3.6 由于编写需要,有些程序只能在Python3下进行执行,当然可以选择在命令行进行指定环境的运行,但总归是有点不方便,便将系统的默认环境进行修改 1.查看系统的Python环境 python --version 2.查看系统Python的可用环境列表 update-alternatives --list

  • Layui实现主窗口和Iframe层参数传递

    这应该是我们在开发中经常用到的吧,主窗口和Iframe层之间传值实现我们各种需求,比如打开某条记录的详细数据-. 主窗口向Iframe层传值: //主窗口代码 layer.open({ type: 2, title: "标题", shade: 0.5, area: ['500px', '500px'], anim: 2, content: ['url'], success: function (layero, index) { var iframe = window['layui-la

  • 3种方法实现WindowsForm切换窗口

    在Windows Form平台下实现窗口跳转,常见的有以下几种方式,比如通过Show/ShowDialog方法显示新的窗口,通过多文档界面(MDI)在父窗口中加载子窗口,或者是通关过在窗口中动态加载自定义控件,比如通过将窗口中的Panel控件作为容器,将一些自定义元素作为视图界面控件,动态加载到Panel控件中.下面我们将简单介绍这几种方式 Show/ShowDialog 通过这两种方法可以很简单的实现窗口跳转, Home home = new Home(); home.Show(); Home

  • selenium学习教程之定位以及切换frame(iframe)

    总有人看不明白,以防万一,先在开头大写加粗说明一下: frameset不用切,frame需层层切! 很多人在用selenium定位页面元素的时候会遇到定位不到的问题,明明元素就在那儿,用firebug也可以看到,就是定位不到,这种情况很有可能是frame在搞鬼(原因之一,改天专门说说定位不到元素,可能的一些原因及处理办法). frame标签有frameset.frame.iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定

随机推荐