• Selenium—获取页面的title,url;使用句柄方式切换窗口


    获取当前页面的 title

    • 红框内即为页面的 title

    • 获取方法:driver.title

     

    获取当前页面的 url

    • 红框内即为页面的 url
    • 获取方法:driver.current_url

    示例:

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    
    # 打开百度首页
    driver.get('http://baidu.com')
    
    # 打印当前窗口的 title
    print(driver.title)
    
    # 打印当前窗口的 url
    print(driver.current_url)

    driver.quit()

    输出结果如下:

    百度一下,你就知道
    
    https://www.baidu.com/

    窗口切换

      我们在使用浏览器打开链接时,通常会存在2种情况

      1. 在当前窗口打开,即覆盖
      2. 新建窗口打开,保留原有窗口

    示例:

    1. 百度首页搜索:博客园
    2. 打开博客园官网,获取当前页精华帖的标题
    3. 回到百度输入框,并打印出 title

    代码如下:

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    
    # 打开百度首页
    driver.get('http://baidu.com')
    
    # 输入 博客园 并点击 回车
    driver.find_element_by_id('kw').send_keys('博客园
    ')
    
    # 找到博客园的官网,并点击;点击后会在新的窗口打开链接
    driver.find_element_by_xpath("//h3//a[contains(.,'官网')]/../a[1]").click()
    
    # 打印当前窗口的 title
    print(driver.title)
    
    # 打印当前窗口的 url
    print(driver.current_url)
    
    # 点击博客园的 精华 贴
    driver.find_element_by_css_selector('a[title="编辑精选博文"]').click()
    
    ......

    输出结果如下:

    博客园_百度搜索
    
    https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%8D%9A%E5%AE%A2%E5%9B%AD&rsv_pq=fb7d28ae0001abcf&rsv_t=06598quU7hn3kFKgkuBxhCIOyMaWnFVVXEjwlgeJppBhRahvfl8rUTZcZVQ&rqlang=cn&rsv_enter=1&rsv_sug3=3&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&inputT=348&rsv_sug4=348
    
    selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"a[title="编辑精选博文"]"}
    # 报错信息,未定位到该元素

    浏览器实现结果

      通过浏览器的实现结果,和代码的运行结果,可以判断出:即使web页面已跳转至新窗口,但是代码逻辑还在原有窗口

      为解决该问题,我们需要引入 句柄 的概念:窗口句柄 ,粗略的理解,每个窗口对应一个句柄,句柄可认为是一个唯一长字符串

    获取句柄的方法:

    • 获取当前页面句柄:driver.current_window_handle
    • 获取所有页面句柄:driver.window_handles

    通过句柄,我们可以进行窗口的切换:

    • 切换窗口:driver.switch_to.window()

    示例:

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    
    # 打开百度首页
    driver.get('http://baidu.com')
    
    # 输入 博客园 并点击 回车
    driver.find_element_by_id('kw').send_keys('博客园
    ')
    
    # 找到博客园的官网,并点击;点击后会在新的窗口打开链接
    driver.find_element_by_xpath("//h3//a[contains(.,'官网')]/../a[1]").click()
    
    # 打印出所有的句柄信息
    print(driver.window_handles)
    
    driver.quit()

    输出结果如下:

    ['CDwindow-998407BA3D6B34956871D337B6F377FE', 'CDwindow-844FF13AAEE0E14487AD368DEAA7A0AE']
    
    # 从结果中我们可以看出:
    # driver.window_handles的数据类型是一个 列表

    让我们回到上面的需求:此时我们唯一要做的就是,打开新的窗口后,代码切换至新窗口,并输出结果

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    
    # 打开百度首页
    driver.get('http://baidu.com')
    
    # 输入 博客园 并点击 回车
    driver.find_element_by_id('kw').send_keys('博客园
    ')
    
    # 找到博客园的官网,并点击;点击后会在新的窗口打开链接
    driver.find_element_by_xpath("//h3//a[contains(.,'官网')]/../a[1]").click()
    
    # 打印当前窗口的 title
    print('切换前的title:',driver.title)
    
    # 切换至新窗口
    # 首先,我们要先获取到一个主句柄,作为灯塔,防止"迷路"
    mainWindow = driver.current_window_handle
    
    # 接着我们要获取所有的句柄信息,并赋值给 handles
    handles = driver.window_handles
    
    # 使用for循环,遍历所有的handles,以便判断
    for handle in handles:
        # 使用driver.switch_to.window()方法,切入句柄所在的窗口
        driver.switch_to.window(handle)
    
        # 判断 "代码" 是否在当前窗口的title中,如果在,跳出循环
        if "代码" in driver.title:
            break
    
    # 让我们打印一下当前窗口的 title
    print('切换后的title:',driver.title)
    
    # 点击博客园的 精华 贴
    driver.find_element_by_css_selector('a[title="编辑精选博文"]').click()
    
    # 定位到标题的元素,并赋值给 items
    items = driver.find_elements_by_css_selector('div[class="post_item"] h3>a')
    
    for one in items:
        print(one.text)
    
    # 打印完成后,切回主窗口,并打印出当前窗口的 title
    driver.switch_to.window(mainWindow)
    print('切回主句柄的title:',driver.title)

    输出结果如下:

    切换前的title: 博客园_百度搜索
    切换后的title: 博客园 - 代码改变世界
    
    ------------------2019-5-30 前20的精华帖-----------------------------
    【面试】如果你这样回答“什么是线程安全”,面试官都会对你刮目相看
    【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)
    为啥程序会有bug?
    关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
    ERP不规范,同事两行泪
    只有程序员才能读懂的西游记
    从软件工程的角度解读任正非的新年公开信
    通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。
    分布式系统关注点——99%的人都能看懂的「熔断」以及最佳实践
    神经网络的基本工作原理
    哎呀,我老大写Bug啦——记一次MessageQueue的优化
    机器学习web服务化实战:一次吐血的服务化之路
    Windbg分析高内存占用问题
    我是怎么把一个项目带崩的
    彼之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践
    Linux的内存分页管理
    通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
    藏在正则表达式里的陷阱
    你所不知道的日志异步落库
    为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?
    
    
    切回主句柄的title:博客园_百度搜索
  • 相关阅读:
    Photoshop 基础七 位图 矢量图 栅格化
    Photoshop 基础六 图层
    Warfare And Logistics UVALive
    Walk Through the Forest UVA
    Airport Express UVA
    Guess UVALive
    Play on Words UVA
    The Necklace UVA
    Food Delivery ZOJ
    Brackets Sequence POJ
  • 原文地址:https://www.cnblogs.com/wilson-5133/p/10946905.html
Copyright © 2020-2023  润新知