python實(shí)現(xiàn)自動(dòng)登錄跳轉(zhuǎn)頁(yè)面并獲取信息
一.python輸入點(diǎn)擊登錄頁(yè)面
from selenium import webdriver from time import sleep dx=webdriver.Chrome() # dx.get("http://192.168.10.132:8080/cms/") dx.get("http://192.168.10.132:8080/cms/manage/login.do") dx.maximize_window() sleep(2) dx.find_element_by_id("userAccount").send_keys("admin") sleep(2) dx.find_element_by_id("loginPwd").send_keys("123456") sleep(2) dx.find_element_by_id("loginBtn").click() sleep(10) dx.quit()
在老版本可以,若是更新到最新的插件和第三方庫(kù),報(bào)錯(cuò)
''' 報(bào)錯(cuò):
---> 11 dx.find_element_by_id("userAccount").send_keys("admin")
12 sleep(2)
13 dx.find_element_by_id("loginPwd").send_keys("123456")
AttributeError: 'WebDriver' object has no attribute 'find_element_by_id'
'''
'''解析:
在您的代碼中,出現(xiàn)的錯(cuò)誤 AttributeError: 'WebDriver' object has no attribute 'find_element_by_id' 是因?yàn)槟褂玫?Selenium 庫(kù)中,find_element_by_id 方法已經(jīng)被棄用并在較新的版本中移除。從 Selenium 4 開始,推薦使用新的方法來(lái)查找元素。
您可以使用 find_element 方法,并通過(guò) By.ID 來(lái)指定使用 ID 查找元素。首先,確保您已經(jīng)導(dǎo)入了 By 類。
'''
解決方法,使用符合當(dāng)前最新庫(kù)的語(yǔ)法,丟棄之前的錯(cuò)誤寫法
# 登錄測(cè)試 from selenium import webdriver from selenium.webdriver.common.by import By # 導(dǎo)入 By 類以使用新的查找元素方法 from time import sleep dx = webdriver.Chrome() dx.get("http://192.168.10.132:8080/cms/manage/login.do") dx.maximize_window() sleep(2) dx.find_element(By.ID, "userAccount").send_keys("admin") sleep(2) dx.find_element(By.ID, "loginPwd").send_keys("123456") sleep(2) dx.find_element(By.ID, "loginBtn").click() sleep(10) dx.quit()
二.若是link方式定位跳轉(zhuǎn)
from selenium import webdriver from time import sleep dx=webdriver.Chrome() dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) dx.find_element_by_link_text("地圖").click()
若是版本及庫(kù)更新到最新,會(huì)報(bào)錯(cuò)如下:
'''
AttributeError Traceback (most recent call last)
<ipython-input-1-081328daae09> in <module>
5 dx.maximize_window()
6 sleep(2)
----> 7 dx.find_element_by_link_text("地圖").click()
AttributeError: 'WebDriver' object has no attribute 'find_element_by_link_text'
'''
'''
在 Selenium 4 中,許多舊的定位元素的方法,如 find_element_by_link_text,已經(jīng)被棄用并移除。
這是為了統(tǒng)一和簡(jiǎn)化 API,并鼓勵(lì)使用更現(xiàn)代的 find_element 方法結(jié)合 By 類來(lái)定位元素。
為了修復(fù)你的代碼,你需要使用 By.LINK_TEXT 來(lái)代替直接調(diào)用 find_element_by_link_text。
'''
此次,放棄之前廢棄的語(yǔ)法,重新修改到對(duì)應(yīng)的語(yǔ)法,如下:
from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep dx = webdriver.Chrome() dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) # 使用新的方法查找并點(diǎn)擊鏈接文本為"地圖"的元素 dx.find_element(By.LINK_TEXT, "地圖").click() sleep(10) dx.quit()
三.懸停
1.懸停的關(guān)鍵語(yǔ)句及意義
ActionChains(dx).move_to_element(wz).perform()
ActionChains(dx).move_to_element(wz).perform() 是 Selenium WebDriver API 中的一個(gè)操作鏈,用于模擬用戶將鼠標(biāo)移動(dòng)到頁(yè)面上的特定元素上的行為。下面是對(duì)這個(gè)操作的詳細(xì)解析:
ActionChains 類:
ActionChains 是 Selenium 提供的一個(gè)類,用于生成一系列的用戶交互動(dòng)作,比如點(diǎn)擊、鍵盤輸入、鼠標(biāo)移動(dòng)等。
這些動(dòng)作可以被串聯(lián)起來(lái),形成一個(gè)動(dòng)作鏈,然后通過(guò)調(diào)用 perform() 方法一次性執(zhí)行。
dx 參數(shù):
dx 在這里代表一個(gè) WebDriver 實(shí)例,它是與瀏覽器交互的接口。
ActionChains 類的構(gòu)造函數(shù)需要傳入一個(gè) WebDriver 實(shí)例,以便能夠控制瀏覽器執(zhí)行相應(yīng)的動(dòng)作。
move_to_element 方法:
move_to_element(element) 是 ActionChains 類的一個(gè)方法,用于將鼠標(biāo)移動(dòng)到指定的元素上。
參數(shù) element 是一個(gè) WebElement 對(duì)象,代表頁(yè)面上的一個(gè)元素。這個(gè)對(duì)象通常是通過(guò) WebDriver 的 find_element 或 find_elements 方法找到的。
wz 參數(shù):
wz 在這個(gè)上下文中是一個(gè)變量,它應(yīng)該引用了一個(gè) WebElement 對(duì)象。
在您的代碼中,wz 是通過(guò) dx.find_element_by_name("tj_briicon") 獲取的。但是,如之前所述,"tj_briicon" 通常不是百度首頁(yè)元素的正確 name 屬性,因此這行代碼可能無(wú)法找到正確的元素。
perform 方法:
perform() 是 ActionChains 類的一個(gè)方法,用于執(zhí)行之前添加到動(dòng)作鏈中的所有動(dòng)作。
在調(diào)用 perform() 之前,可以添加多個(gè)動(dòng)作到動(dòng)作鏈中,然后一次性執(zhí)行它們。
在這個(gè)例子中,動(dòng)作鏈中只有一個(gè)動(dòng)作:將鼠標(biāo)移動(dòng)到 wz 指定的元素上。
綜上所述,ActionChains(dx).move_to_element(wz).perform() 的作用是:
創(chuàng)建一個(gè)與 WebDriver 實(shí)例 dx 關(guān)聯(lián)的動(dòng)作鏈。
將鼠標(biāo)移動(dòng)到由 wz 指定的元素上。
執(zhí)行這個(gè)動(dòng)作鏈。
但是,由于 wz 可能沒(méi)有正確引用到頁(yè)面上的元素(因?yàn)槭褂昧隋e(cuò)誤的定位策略),這個(gè)操作可能無(wú)法按預(yù)期工作。正確的做法是使用正確的定位策略來(lái)找到元素,并確保該元素在嘗試移動(dòng)鼠標(biāo)到其上之前是可見和可交互的。
2.懸停相關(guān)的其他拓展
ActionChains類(鼠標(biāo)操作)
常用于模擬鼠標(biāo)的行為,比如單擊、雙擊、拖拽等行為
- click(on_element=None) --- 鼠標(biāo)單擊
- double_click(on_element=None) --- 雙擊
- context_click(on_element=None) --- 右擊
- click_and_hold(on_element=None) --- 鼠標(biāo)單擊并且按住不放
- drag_and_drop(source,target) --- 拖拽
- drag_and_drop_by_offset(source,xoffset,yoffset) --- 將目標(biāo)拖動(dòng)到指定的位置
- key_down(value,element=None) --- 按下某個(gè)鍵盤上的鍵
- key_up(value,element=None) --- 松開某個(gè)鍵
- move_by_offset(xoffset,yoffset) --- 鼠標(biāo)從當(dāng)前位置移動(dòng)到某個(gè)坐標(biāo)
- move_to_element(to_element) --- 鼠標(biāo)移動(dòng)到某個(gè)元素
- move_to_element_with_offset(to_element,xoffset,yoffset) --- 移動(dòng)到距某個(gè)元素(左上角坐標(biāo))多少距離的位置
- perform() --- 執(zhí)行鏈中的所有動(dòng)作
- release(on_element=None) --- 在某個(gè)元素位置松開鼠標(biāo)左
3.懸停相關(guān)的代碼示例
3.1 示例百度學(xué)術(shù)
#懸停百度 from selenium import webdriver from time import sleep from selenium.webdriver.common.action_chains import ActionChains dx=webdriver.Chrome() dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) wz=dx.find_element_by_name("tj_briicon") ActionChains(dx).move_to_element(wz).perform() sleep(2) dx.find_element_by_link_text("學(xué)術(shù)").click()
在新版本中依舊報(bào)錯(cuò)
'''報(bào)錯(cuò):
AttributeError Traceback (most recent call last)
<ipython-input-1-60c3e6400a39> in <module>
8 dx.maximize_window()
9 sleep(2)
---> 10 wz=dx.find_element_by_name("tj_briicon")
11 ActionChains(dx).move_to_element(wz).perform()
12 sleep(2)
AttributeError: 'WebDriver' object has no attribute 'find_element_by_name'
'''
'''解決:
在較新版本的 Selenium 中,一些舊的元素查找方法,如 find_element_by_name,已經(jīng)被棄用并最終從庫(kù)中移除。這就是為什么你在嘗試使用 find_element_by_name 方法時(shí)遇到了 AttributeError。
為了解決這個(gè)問(wèn)題,你應(yīng)該使用 find_element 方法結(jié)合 By 類來(lái)定位元素。By 類提供了多種方式來(lái)定位元素,如通過(guò)名稱、ID、類名、標(biāo)簽名、鏈接文本等。
首先,你需要從 selenium.webdriver.common.by 導(dǎo)入 By 類。然后,你可以使用 find_element(By.NAME, "value") 的形式來(lái)替代 find_element_by_name("value")
'''
更新后最新包和庫(kù)的更改
#懸停百度學(xué)術(shù)(新) from selenium import webdriver from time import sleep from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By # 導(dǎo)入 By 類 dx = webdriver.Chrome() dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) # 使用 By.NAME 來(lái)替代 find_element_by_name wz = dx.find_element(By.NAME, "tj_briicon") ActionChains(dx).move_to_element(wz).perform() sleep(2) # 注意:'學(xué)術(shù)' 這個(gè)鏈接文本是否存在于當(dāng)前頁(yè)面需要確認(rèn), # 因?yàn)榘俣仁醉?yè)的布局和鏈接可能會(huì)變化。如果鏈接不存在,這里會(huì)拋出錯(cuò)誤。 dx.find_element(By.LINK_TEXT, "學(xué)術(shù)").click()
3.2 示例百度高級(jí)搜索
使用懸停
#懸停百度高級(jí)搜索 from selenium import webdriver from time import sleep from selenium.webdriver.common.action_chains import ActionChains dx=webdriver.Chrome() dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) wz=dx.find_element_by_xpath('//*[@id="s-usersetting-top"]') ActionChains(dx).move_to_element(wz).perform()#懸停 sleep(3) dx.find_element_by_link_text("高級(jí)搜索").click()
#懸停百度高級(jí)搜索(新) from selenium import webdriver from time import sleep from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By # 導(dǎo)入 By 類 # 創(chuàng)建 WebDriver 實(shí)例 dx = webdriver.Chrome() # 加載百度首頁(yè) dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) # 定位到設(shè)置圖標(biāo)(注意:XPath 可能會(huì)因頁(yè)面更新而變化) wz = dx.find_element(By.XPATH, '//*[@id="s-usersetting-top"]') # 執(zhí)行懸停操作 ActionChains(dx).move_to_element(wz).perform() sleep(3) # 點(diǎn)擊高級(jí)搜索鏈接(注意:這里的鏈接文本可能會(huì)因頁(yè)面更新而變化) try: dx.find_element(By.LINK_TEXT, "高級(jí)搜索").click() except Exception as e: print(f"無(wú)法點(diǎn)擊高級(jí)搜索鏈接:{e}") sleep(5) # 關(guān)閉瀏覽器 dx.quit()
不使用懸停,點(diǎn)擊跳轉(zhuǎn)
#未懸停直接點(diǎn)擊 from selenium import webdriver from time import sleep dx=webdriver.Chrome() dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) dx.find_element_by_xpath('//*[@id="s-usersetting-top"]').click() sleep(3) dx.find_element_by_link_text("高級(jí)搜索").click()
#未懸停直接點(diǎn)擊(新) from selenium import webdriver from time import sleep dx=webdriver.Chrome() dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) dx.find_element(By.XPATH,'//*[@id="s-usersetting-top"]').click() sleep(3) dx.find_element(By.LINK_TEXT,"高級(jí)搜索").click()
調(diào)整完版本后,對(duì)異常處理 應(yīng)考慮優(yōu)化,具體如下
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException, TimeoutException from selenium.webdriver.common.by import By from time import sleep dx = webdriver.Chrome() try: dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) try: dx.find_element(By.XPATH, '//*[@id="s-usersetting-top"]').click() except NoSuchElementException: print("未找到設(shè)置圖標(biāo)元素") # 發(fā)生異常時(shí)退出,避免后續(xù)代碼執(zhí)行 dx.quit() raise except Exception as e: print(f"點(diǎn)擊設(shè)置圖標(biāo)時(shí)發(fā)生異常: {e}") dx.quit() raise sleep(3) try: # 嘗試點(diǎn)擊高級(jí)搜索鏈接 dx.find_element(By.LINK_TEXT, "高級(jí)搜索").click() except NoSuchElementException: print("未找到高級(jí)搜索鏈接元素") except Exception as e: print(f"點(diǎn)擊高級(jí)搜索鏈接時(shí)發(fā)生異常: {e}") finally: # 無(wú)論是否發(fā)生異常,都確保關(guān)閉瀏覽器 dx.quit()
四.獲取網(wǎng)頁(yè)標(biāo)簽及文本
1.獲取網(wǎng)頁(yè)標(biāo)題
#title 獲取網(wǎng)頁(yè)標(biāo)題 from selenium import webdriver dx=webdriver.Chrome() dx.get("http://www.baidu.com") dx.maximize_window() t=dx.title #百度一下,你就知道 print(t) #如果日志不是預(yù)期報(bào)錯(cuò)提醒 assert t=="百度一下,你就知道"
2.重轉(zhuǎn)網(wǎng)頁(yè),獲取更新標(biāo)題
#跳轉(zhuǎn)完后,標(biāo)題更新 from selenium import webdriver from time import sleep dx=webdriver.Chrome() dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) dx.get("http://www.jd.com") dx.maximize_window() t=dx.title #百度一下,你就知道 print(t)
3.獲取網(wǎng)頁(yè)標(biāo)題
#title 獲取網(wǎng)頁(yè)標(biāo)題 from selenium import webdriver from time import sleep dx=webdriver.Chrome() dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) wb=dx.find_element_by_xpath('//*[@id="s-usersetting-top"]').text print(wb) if wb=="設(shè)置": print("ok") else: print("no")
更新版本并優(yōu)化代碼
# 打印獲取到的文本 from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep dx = webdriver.Chrome() try: # 加載百度首頁(yè) dx.get("http://www.baidu.com") dx.maximize_window() sleep(2) # 查找設(shè)置圖標(biāo)元素并獲取其文本 wb_element = dx.find_element(By.XPATH, '//*[@id="s-usersetting-top"]') wb = wb_element.text print(wb) if wb == "設(shè)置": print("ok") else: print("no") finally: # 確保關(guān)閉瀏覽器 dx.quit()
以上就是python實(shí)現(xiàn)自動(dòng)登錄跳轉(zhuǎn)頁(yè)面并獲取信息的詳細(xì)內(nèi)容,更多關(guān)于python自動(dòng)登錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot實(shí)現(xiàn)登錄注冊(cè)常見問(wèn)題解決方案
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)登錄注冊(cè)常見問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03pip安裝庫(kù)報(bào)錯(cuò)[notice]?A?new?release?of?pip?available:?22.2
這篇文章主要給大家介紹了關(guān)于pip安裝庫(kù)報(bào)錯(cuò)[notice]?A?new?release?of?pip?available:?22.2?->?22.2.2的相關(guān)資料,文中通過(guò)圖文將解決的方法介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03python GUI庫(kù)圖形界面開發(fā)之PyQt5布局控件QGridLayout詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開發(fā)之PyQt5布局控件QGridLayout詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03使用python編寫簡(jiǎn)單的小程序編譯成exe跑在win10上
這篇文章主要介紹了使用python編寫簡(jiǎn)單的小程序編譯成exe跑在win10上的相關(guān)資料,需要的朋友可以參考下2018-01-01Python實(shí)現(xiàn)PPT幻燈片的添加、刪除或隱藏操作
PowerPoint文檔是商務(wù)、教育、創(chuàng)意等各領(lǐng)域常見的用于展示、教育和傳達(dá)信息的格式,在制作PPT演示文稿時(shí),靈活地操作幻燈片是提高演示效果、優(yōu)化內(nèi)容組織的關(guān)鍵步驟,本文給大家介紹了Python 操作PPT幻燈片- 添加、刪除、或隱藏幻燈片,需要的朋友可以參考下2024-08-08Pycharm中pyqt工具配置(Qt Designer、PyUIC、PyRCC)
Pycharm中進(jìn)行擴(kuò)展工具設(shè)置,從而實(shí)現(xiàn)在pycharm中打開Qt Designer、Ui文件生成Py文件、資源文件生成Py文件三個(gè)功能,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07python中統(tǒng)計(jì)相同字符的個(gè)數(shù)方法實(shí)例
我們?cè)陂_發(fā)中經(jīng)常需要統(tǒng)計(jì)某個(gè)字符或字符串出現(xiàn)的次數(shù),下面這篇文章主要給大家介紹了關(guān)于python中統(tǒng)計(jì)相同字符的個(gè)數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01利用python實(shí)現(xiàn)終身免費(fèi)的聽書工具
本文通過(guò)實(shí)際案例,詳細(xì)介紹了作者如何利用Python庫(kù)實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音的過(guò)程,從安裝庫(kù)到實(shí)際操作案例,都有詳細(xì)的說(shuō)明,為讀者提供了一定的參考價(jià)值2024-03-03