• 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)
    
    
  • 相关阅读:
    ThinkPHP 3.2 调用自定义函数库
    phpstorm 2017版代码提示功能开启解决方案
    phpstorm 2017激活
    JavaScript返回上一页和返回上一级页面并刷新
    PHP处理Ajax请求与Ajax跨域
    13个能快速开发android的经典项目
    分享6款优秀的 AR/VR 开源库
    Android-----购物车(包含侧滑删除,商品筛选,商品增加和减少,价格计算,店铺分类等)
    Android------视频播放器(包含全屏播放,快退,快进,腾讯新闻的列表播放等)
    吴恩达课后作业学习2-week1-2正则化
  • 原文地址:https://www.cnblogs.com/testeremma/p/12684523.html
Copyright © 2020-2023  润新知