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)

猜你喜欢

转载自www.cnblogs.com/testeremma/p/12684523.html
今日推荐