06-Selenium的窗口切换

目录

  • Selenium的切换

    • 一、窗口切换
    • 二、iframe切换
    • 三、弹出切换
      • 3.1 alert弹窗
      • 3.2普通隐藏弹窗
      • 3.3 其他-没看懂(转)

Selenium的切换

官方把selenium.webdriver包中的switch方法全部封装成了一个包 , switch_to :将焦点切换到所选选项的对象上

方法 方法介绍 备注
switch_to.window(window_name) 切到某个浏览器窗口
switch_to.frame(frame_reference) 切到某个frame
switch_to.parent_frame() 切到父frame,有多层frame的时候很有用
switch_to.alert 返回浏览器的Alert对象,可对浏览器alert、confirm、prompt框操作
switch_to.active_element 返回当前焦点的WebElement对象,网页上当前操作的对象(也就是你网页上光标的位置),比如你鼠标点击到了一个input框,你可以在这个input框里输入信息,这时这个input框即焦点
switch_to.default_content() 切到主文档

一、窗口切换

浏览器窗口的切换通过句柄(handle)来操作,每个窗口都有一个句柄,代表当前窗口,需要操作哪个页面的窗口,切换到窗口对应的句柄。通过driver.switch_to.window(handle)来切换句柄,其中handle表示指定页面窗口;

html中有属性:target=”_blank” ,会新开页面

示例

百度搜索腾讯课堂,打开腾讯课堂官网,点击qq登陆界面

from selenium.webdriver import Chrome
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

#创建浏览器对象
driver=Chrome()
#设置隐形等待
driver.implicitly_wait(15)
#打开百度
driver.get("http://www.baidu.com")
#定位输入框,输入腾讯课堂,定位确认按钮,点击搜索
driver.find_element_by_id("kw").send_keys("腾讯课堂")
driver.find_element_by_id("su").click()

#定位第一个腾讯课堂
ele=driver.find_element_by_xpath("(//div[@id=‘content_left‘]/descendant::a[contains(text(),‘职业‘)])[1]")
#获取点击前所有句柄
before_handles=driver.window_handles
#点击定位到内容
ele.click()
#与expected_condition结合,对窗口切换进行显示等待,直到有新窗口
WebDriverWait(driver,10).until(EC.new_window_is_opened(before_handles))
#获取点击前所有句柄
after_handles=driver.window_handles

#切换窗口
# driver.switch_to.window(after_handles[-1])#直接切换
for handle in after_handles:# 切换窗口
    if handle != driver.current_window_handle:
        print(‘switch to second window‘,handle)
        driver.close() # 关闭第一个窗口
        driver.switch_to.window(handle) #切换到第二个窗口

#定位登录控件,并点击qq登录
driver.find_element_by_xpath("//a[@id=‘js_login‘]").click()
driver.find_element_by_xpath("//a[text()=‘QQ登录‘]").click()

二、iframe切换

driver.switch_to.frame( frame_reference )
driver.switch_to.parent_frame() #切换到父级
driver.switch_to.default_content()#切换到主界面

通过源码观察,发现切换frame时,是通过id、name、索引、元素这四种方法来实现switch_to_frame()方法,而default_content的方法默认值为None,所以说我们可以发现driver.switch_to.frame(None)等同于driver.switch_to.default_content()

通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性,则可以用index和WebElement来定位:

  • index从0开始,传入整型参数即判定为用index定位,传入str参数则判定为用id/name定位
  • WebElement对象,即用find_element系列方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象

示例

from selenium.webdriver import Chrome
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

#创建浏览器对象
driver=Chrome()

#设置隐形等待
driver.implicitly_wait(15)

#打开163邮箱
driver.get("http://mail.163.com")

#定位成账号密码登录
driver.find_element_by_id("lbNormal").click()

#定位登录的iframe,显性等待
iframe_ele=driver.find_element_by_xpath("//div[@id=‘loginDiv‘]/iframe")
WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(iframe_ele))

#定位iframe内的输入框
input_ele=driver.find_element_by_xpath("//div[@id=‘account-box‘]/descendant::input")
input_ele.send_keys("abby_ma")

iframe显性等待条件frame_to_be_available_and_switch_to_it()查找元素并切换,可通过通过id、name、索引、元素、locator元祖这五种方法来

三、弹出切换

在平时的测试中,有时候会遇到弹窗的问题,有的是浏览器原生弹窗(alert)、有的是自定义弹窗

3.1 alert弹窗

这种弹窗是最简单的一种,Selenium里有自带的方法来处理它,用switch_to.alert(没有括号)先定位到弹窗,得到Alert对象,然后使用一系列方法来操作:

  • accept() - 点击【确认】按钮
  • dismiss() - 点击【取消】按钮(如有按钮)
  • send_keys(key) - 对弹窗对象内的输入框输入数据( alert和confirm没有输入对话框,所以就不用能用了,只能使用在prompt里 )
  • text-对弹窗对象,获取弹窗内的文本
ale=driver.switch_to.alert
ale.accept()
ale.dismiss()
ale.text
ale.send_keys()
WebDriverWait(driver,10).until(EC.alert_is_present())

可以定位alert、confirm、prompt对话框

3.2普通隐藏弹窗

平时的话,我们一般遇到的都是自定义弹窗,所以说一般不是不用到alert的,但是还是要拿出来说一下的;一般这种自定义弹窗是自定义的div层,然后是隐藏的,所以当你触发了这个弹窗后,它就会显示出来,这时我们通过正常的定位方式是可以正常定位到的。 如百度的登录弹窗

3.3 其他-没看懂(转)

由于alert弹窗不美观,现在大多数网站都会使用自定义弹窗,使用Selenium自带的方法就驾驭不了了,此时就要搬出JS大法。这里举一个新世界教育官网首页的例子:

大家能看到,图中的这种弹窗就是现在主流的表现形式,处理这种弹窗可以利用HTML DOM Style 对象,有一个display属性,可以设置元素如何被显示,详细解释可以参考http://www.w3school.com.cn/jsref/prop_style_display.asp。将display的值设置成none就可以去除这个弹窗了:

js = ‘document.getElementById("doyoo_monitor").style.display="none";‘

完整代码如下:

# encoding:utf-8

from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get("http://sh.xsjedu.org/")
time.sleep(1)
js = ‘document.getElementById("doyoo_monitor").style.display="none";‘
driver.execute_script(js)

原文地址:https://www.cnblogs.com/testeremma/p/12684523.html

时间: 2024-08-29 21:48:51

06-Selenium的窗口切换的相关文章

selenium webdriver窗口切换

selenium webdriver窗口切换,有时候在做自动化的时候需要打开很多很多的页面, 当在操作不同的页面的时候需要切换窗口,下面是如何切换到前后页面窗口的操作: package test20161206; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; im

selenium 多窗口切换

selenium 多窗口切换 知识点: 1.current_window_handle:获取当前窗口句柄 2.window_handles:返回所有窗口的句柄到当前会话 3.switch_to.window():用于切换到相应的窗口.  与switch_to.frame()类似. switch_to.window()是用于不同窗口的切换.switch_to.frame()是用于不同表单的切换. 示例; #selenium 窗口切换 from selenium import webbrowser

Selenium多窗口切换方法快速入门

问题描述:执行脚本时遇到最多的一个问题就是Unable to find element in selenium...,除了排除页面加载时间原因外,对于初学者常犯的一个错误是,点击某个按钮跳转到新页面的问题.若在当前页面打开,给予足够的加载时间即可.但若是新窗口打开页面时,Selenium是不会自动识别到新窗口去查找元素的,所以需要我们去模拟人为切换到新窗口.WebDriver 提供了 switchTo().window()方法可以实现在不同的窗口之间切换. 解决方案: 1.首先,确认在哪个ste

第三章:Selenium 多窗口切换

当遇到在某一个窗口中点击某个按钮,就会跳转到另外一个窗口中,此时,如果不进行窗口切换,就会造成 元素错误. 多窗口切换案例: 我们想要操作 京东企业购 里面的内容:就必须进行窗口切换,这样才会保证不会报错 2. 窗口切换的代码:

win+python+selenium实现窗口和tab切换

这篇总结主要是关于两方面的需求:其一,在浏览器不同tab标签页之间按时间切换(同事用来不停刷新grid crontol 监控页面):其二,实现开启多个窗口,并将窗口缩放到一定范围,并齐占满整个桌面,按不同的时间间隔刷新几个页面. 一.标签页之间切换 之前这个通过找了一个浏览器插件tab-rotator实现了其需求,并未写程序实现,后面没事的时候网上翻selenium资料写了一个,内容如下: #code by www.111cn.netfrom selenium.webdriver.common.

selenium测试(Java)--多窗口切换(十三)

如果遇到点击按钮或链接后出现新窗口的情况,就需要使用窗口切换的方法. 本例中就是先打开百度搜索界面,然后利用js打开一个百度新闻界面,然后通过selenium提供的窗口切换方法切换窗口 1 package com.test.windows; 2 3 import java.util.Iterator; 4 import java.util.Set; 5 6 import org.openqa.selenium.By; 7 import org.openqa.selenium.Javascript

selenium 窗口切换(多表单切换)

在web应用中,前台网页的设计一般会用到iframe/frame表单嵌套页面的应用.简单的就是一个页面签嵌套多个HEML/JSP文件.selenium webdriver  只能在同一页面识别定位元素,可以狭隘的理解成只能识别当前所在位置的页面上的元素.对于不同的iframe/frame表单中的元素是无法直接定位的.需要结合switchTo().frame()方法切换到指定的frame/iframe中.switchTo().frame()默认的是取表单的ID和name属性.如果没有id和name

Selenium弹出新页面无法定位元素问题(Unable to locate element)--多窗口切换

最近学习到多窗口切换,在页面操作过程中有时点击某个链接会弹出新的窗口,这时需要先切换到新窗口才能对其进行操作.Webdriver提供了switch_to.window( ) 方法实现在不同窗口中切换. 查阅相关资料,得到两种方法来定位到当前页面: 方法一: browser.switch_to_window(browser.window_handles[1]) 方法二:直接定位当前最新弹出的窗口 for handle in browser.window_handles:#方法二,始终获得当前最后的

selenium多个窗口切换

造成新打开一个窗口,但是selenium不会自动跳转到新的串口,需要自己切换: # 你打开的浏览器,谷歌 browser = webdriver.Chrome() # 你中间的操作 ... # 获取当前浏览器所有的窗口 handles = browser.window_handles # handles为一个数组:handles = [窗口1,窗口2,...] # 窗口切换,切换为新打开的窗口 browser.switch_to.window(handles[-1]) # 切换回最初打开的窗口

selenium入门14 窗口切换

窗口切换: 当前窗口句柄 current_window_handle 所有的窗口句柄 window_handles 切换窗口 switch_to_window() #coding=utf-8 #切换窗口 from selenium import webdriver import time dr = webdriver.Firefox() dr.get("http://www.baidu.com") dr.find_element_by_link_text("登录")