zoukankan      html  css  js  c++  java
  • Selenium3+python3自动化(十一)--多窗口/标签页、句柄(handle);js将多窗口设置为一个窗口

    前言

    有些页面的链接打开后,会重新打开一个窗口/标签页,对于这种情况,屏幕会聚焦在新窗口或新标签页上,但WebDriver 不知道操作系统认为哪个窗口是活动的。要使用新窗口,您需要切换到它。获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了。当然,我们也可以通过js修改元素属性,最终让新打开的链接在一个窗口打开。

    一、识别多窗口

    1.打开百度:https://www.baidu.com/,点击新闻按钮会发现右边多了一个窗口标签。

     2.我们使用代码去操作,打开的网页也是这样的(一个窗口多个标签页)

     二、获取当前窗口/标签页句柄

    1.元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别。

    2.人为操作的话,可以通过眼睛,识别不同的窗口点击切换。但是脚本没长眼睛,它不知道你要操作哪个窗口,这时候只能使用句柄来判断了。

    3.获取当前页面的句柄:driver.current_window_handle

    # coding:utf-8
    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.get("https://www.baidu.com")
    driver.implicitly_wait(10)
    h=driver.current_window_handle
    print(h)
    driver.find_element_by_link_text("新闻").click()
    print(driver.current_window_handle)
    

     运行结果:

    CDwindow-59FD4DB806265FFBC646EF8369EB2353
    CDwindow-59FD4DB806265FFBC646EF8369EB2353 

     三、获取所有句柄

    1.定位新闻按钮,并点击

    2.点击后,获取当前所有的句柄:window_handles

    # coding:utf-8
    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.get("https://www.baidu.com")
    driver.implicitly_wait(10)
    h=driver.current_window_handle
    print(h)
    driver.find_element_by_link_text("新闻").click()
    nh=driver.window_handles
    print(nh,nh[1])  

     运行结果

    CDwindow-5F5B9CC310D6704D328C0CD268FE0381
    ['CDwindow-5F5B9CC310D6704D328C0CD268FE0381', 'CDwindow-06CC09C03B9DB58F9E9415B0D98247E1'] CDwindow-06CC09C03B9DB58F9E9415B0D98247E1
    

    四、切换句柄

    直接从所有窗口句柄中,取出第n个句柄的值 nh[1]

    如上面代码

    五、关闭新窗口,切回主页

    1.打开新页面后,其实只想验证新页面跳转对不对,这里可以做个简单的验证,获取当前页面的title验证

    2.验证完后,关闭新窗口

    3.切回句柄到首页

    4.打印当前页面的句柄,看是否切换到首页了

    # coding:utf-8
    from selenium import webdriver
    import time
    driver=webdriver.Chrome()
    driver.get("https://www.baidu.com")
    driver.implicitly_wait(10)
    h=driver.current_window_handle
    print(h)
    driver.find_element_by_link_text("新闻").click()
    nh=driver.window_handles
    print(nh,nh[1])
    driver.switch_to.window(nh[1])
    print(driver.title)
    time.sleep(3)
    #关闭新窗口
    driver.close()
    #切换到首页句柄
    driver.switch_to.window(h)
    #打印当前的title
    print(driver.title)  

     运行结果

    CDwindow-130EA160DA8FDEE09BB98D9656D5D87B
    ['CDwindow-130EA160DA8FDEE09BB98D9656D5D87B', 'CDwindow-C679162F61EB91A181A02B15248593FC'] CDwindow-C679162F61EB91A181A02B15248593FC
    百度新闻——海量中文资讯平台
    百度一下,你就知道  

     六、打开百度,点击新闻,出现窗口多标签情况,查看新闻按钮元素属性:target=“_blank”

     七、这里用到js的定位方法,定位该元素的class属性,定位到元素后,去掉target属性 或修改target属性值为空,执行代码发现,只打开了一个窗口标签

    #coding:utf-8
    from selenium import webdriver
    driver=webdriver.Chrome()
    driver.get("https://www.baidu.com")
    # js='document.getElementsByClassName("mnav c-font-normal c-color-t")[0].removeAttribute("target")'
    js='document.getElementsByClassName("mnav c-font-normal c-color-t")[0].target=""'
    driver.execute_script(js)
    driver.find_element_by_link_text("新闻").click()
    

     

     

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    大数据平台的数据源
    大数据平台的数据采集
    kubernetes入门
    机器学习分类算法
    唱吧DevOps的落地,微服务CI/CD的范本技术解读
    JavaEE开发之SpringBoot整合MyBatis以及Thymeleaf模板引擎
    MySQL索引及查询优化总结 专题
    玩转spring boot——ajax跨域
    Linux Shell远程执行命令(命令行与脚本方式)
    Android ServiceConnection
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13581661.html
Copyright © 2011-2022 走看看