06-Selenium的窗口切换
Posted testeremma
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了06-Selenium的窗口切换相关的知识,希望对你有一定的参考价值。
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)
以上是关于06-Selenium的窗口切换的主要内容,如果未能解决你的问题,请参考以下文章