獲取當前頁面的 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種情況
-
- 在當前窗口打開,即覆蓋
- 新建窗口打開,保留原有窗口
示例:
- 百度首頁搜索:博客園
- 打開博客園官網,獲取當前頁精華帖的標題
- 回到百度輸入框,並打印出 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:博客園_百度搜索