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('博客園\n')

# 找到博客園的官網,並點擊;點擊后會在新的窗口打開鏈接
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('博客園\n')

# 找到博客園的官網,並點擊;點擊后會在新的窗口打開鏈接
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('博客園\n')

# 找到博客園的官網,並點擊;點擊后會在新的窗口打開鏈接
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:博客園_百度搜索

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM