• Selenium-Switch--切换浏览器tab/iframe/alart


    Switch

    我们在UI自动化测试时,总会出现新建一个tab页面、弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了。需要用到Selenium单独提供的模块switch_to模块

    引用路径

    # 第一种方式可以通过直接导入SwitchTo模块来进行操作
    from selenium.webdriver.remote.switch_to import SwitchTo
     
    # 第二种方式是直接通过Webdriver的switch_to来操作
    driver.switch_to

    其实webdriver在以前的版本中已经为我们封装好了切换Windows、Alert、Iframe,现在依然可以使用,但是会被打上横线,代表他已经过时了,建议使用SwitchTo类来进行操作。

    SwitchToWindows

    # 获取浏览器所有的的tab名
    tabNames = driver.window_handles
    # 切换tab
    # driver.switch_to_window(tabNames[1]) 不推荐使用这种方法,最后还是会重复调用switch_to.
    # driver导入的类库是SwitchTo
    driver.switch_to.window(tabNames[1])  # 切换到新页面

    示例:

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get('http://ui.imdsx.cn/menu/')
    driver.find_element_by_css_selector('a[href="/uitester/"]').click()
    
    js = 'window.scrollTo(0,0);'
    driver.execute_script(js)
    
    element = driver.find_element_by_css_selector('a[href="/new-index/"]').click()
    
    # 获取浏览器所有的的tab名
    tabNames = driver.window_handles
    print(tabNames)
    # 输出:['CDwindow-645023DAEF3D7A632EAB9D22408C5F23', 'CDwindow-187B104E8C3062DC086B0D97F3B76B54']
    
    # 获取当前tab名
    tabCurrentName = driver.current_window_handle
    print(tabCurrentName)
    # 输出:CDwindow-645023DAEF3D7A632EAB9D22408C5F23
    
    # 切换tab
    # driver.switch_to_window(tabNames[1]) 不推荐使用这种方法,最后还是会重复调用switch_to.
    # driver导入的类库是SwitchTo
    driver.switch_to.window(tabNames[1])  # 切换到新页面
    print(driver.current_window_handle)  # 切换后,当前页面是:CDwindow-187B104E8C3062DC086B0D97F3B76B54
    
    driver.find_element_by_css_selector('#newtag').send_keys('111') # 输入框内输入111
    time.sleep(3)
    print(driver.title)  # 打印tab名:NewIndex
    # driver.close()  # 关闭当前tab页面,分支开关,switch tab时,记住执行close,以免页面开太多,不好识别,最好保持最多2个tab
    time.sleep(3)
    # 自动退出全部tab,关闭服务,总开关
    driver.quit()

    补充浏览器相关操作示例:浏览器前进、后退、刷新、获取浏览器大小

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get('http://ui.imdsx.cn/uitester')
    js = 'window.scrollTo(0,0);'
    driver.execute_script(js)
    time.sleep(2)
    
    # 浏览器的后退按钮
    driver.back()
    time.sleep(1)
    # 浏览器的前进按钮
    driver.forward()
    time.sleep(1)
    # 浏览器的刷新按钮
    driver.refresh()
    # 获取当前浏览器大小,返回宽和高
    size=driver.get_window_size()
    print(size)  # 输出结果:{'width': 945, 'height': 1020}

    SwitchToFrame

    # SwitchToFrame支持id、name、frame的element
     
    # 接受定位到的iframe的Element,这样就可以通过任意一种定位方式进行定位了
    frameElement = driver.find_element_by_name('top-frame')
    driver.switch_to.frame(frameElement)
     
    # 通过fame的name、id属性定位
    driver.switch_to.frame('top-frame')
     
    # 当存在多层iframe嵌套时,需要一层一层的切换查找,否则将无法找到
    driver.switch_to.frame('top-frame')
    driver.switch_to.frame('baidu-frame')
     
    # 跳转到最外层的页面
    driver.switch_to.default_content()
     
    # 多层Iframe时,跳转到上一层的iframe中
    driver.switch_to.parent_frame()

    示例:

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://ui.imdsx.cn/uitester')
    driver.maximize_window() # 最大化窗口
    js = 'window.scrollTo(0,0);' # 将屏幕滚动到最上方
    driver.execute_script(js)
    
    driver.find_element_by_css_selector('#i1').send_keys('111')
    
    driver.switch_to.frame('top-frame')  # 切换第一层iframe
    
    driver.find_element_by_css_selector('#newtag').send_keys('222')
    
    driver.switch_to.frame('baidu-frame')  # 切换第二层iframe
    
    driver.find_element_by_css_selector('#kw').send_keys('333')
    
    driver.switch_to.parent_frame()  # 回到上一层
    driver.find_element_by_css_selector('#newtag').clear()  # 清除文本框内容
    
    # driver.switch_to_default_content() #回到默认层
    driver.switch_to.default_content()  # 回到默认层,最外层HTML标签
    
    driver.find_element_by_css_selector('#i1').clear()
    1. 代码报错说没有定位到这个元素的问题,排除问题步骤如下:
        a, 当前页面到底有没有这个元素
        b, 你定位的元素是否可以被看到(如页面滚屏、被广告遮挡等)
        c, 是否被其他元素遮挡
        d, 那是否有新的tab生成了 有的话 --》切换tab
        e, 是否有iframe标签,目标元素是否在iframe中,如果有 --》切换iframe
        f, 排除这个元素的父集 有没有宽高

    SwitchToAlert

    # alert 实际上也是Selenium的一个模块
    from selenium.webdriver.common.alert import Alert
     
    # 也可以通过Webdriver的switch_to来调用
     
    # 点击确认按钮
    driver.switch_to.alert.accept()
     
    # 如果是确认弹框,相当于点击取消和X按钮
    driver.switch_to.alert.dismiss()
     
     
    # 如果alert上有文本框时,可以输入文字。(注: 没遇到过)
    driver.switch_to.alert.send_keys()
     
    # 返回Alert上面的文本内容
    text = driver.switch_to.alert.text

    例:

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get('http://ui.imdsx.cn/uitester')
    driver.maximize_window()
    js = 'window.scrollTo(0,0);'
    driver.execute_script(js)
    
    driver.find_element_by_css_selector('#alert').click() #点击alert元素
    time.sleep(2)
    driver.switch_to.alert.accept() #点击alart中的确认按钮
    
    driver.find_element_by_css_selector('#confirm').click() #点击confirm元素
    time.sleep(2)
    # driver.switch_to.alert.accept() #点击alart中的确认按钮
    driver.switch_to.alert.dismiss() #点击alart中的取消按钮
    
    text = driver.switch_to.alert.text
    print(text) #输出弹框内容:CONFIRM弹框!!
    
    time.sleep(2)
    driver.quit()
  • 相关阅读:
    学生宿舍水电管理系统 产品需求评审(用户故事)
    nyoj 14-会场安排问题 (贪心)
    好看的鼠标hover效果
    JavaScript-三种弹窗方式
    博客园美化夜间模式
    js写个小时钟
    js获取时间,循环执行任务,延迟执行任务
    Bzoj1103 [POI2007]大都市meg
    POJ2155 Matrix
    POJ3625 Building Roads
  • 原文地址:https://www.cnblogs.com/denise1108/p/10557634.html
Copyright © 2020-2023  润新知