如何使用Selenium WebDriver查找錯(cuò)誤的鏈接?
?今日互動(dòng)話題?
今年的圣誕節(jié)你想怎么過(guò)?
當(dāng)您在網(wǎng)站上遇到404 /頁(yè)面未找到/無(wú)效超鏈接時(shí),會(huì)想到什么想法?啊!當(dāng)您遇到損壞的超鏈接時(shí),您會(huì)感到煩惱,這是為什么您應(yīng)繼續(xù)專注于消除Web產(chǎn)品(或網(wǎng)站)中損壞的鏈接的唯一原因。您可以使用Selenium WebDriver來(lái)利用自動(dòng)化進(jìn)行錯(cuò)誤的鏈接測(cè)試,而無(wú)需進(jìn)行人工檢查。

當(dāng)特定鏈接斷開并且訪問者登陸頁(yè)面時(shí),它將影響該頁(yè)面的功能并導(dǎo)致不良的用戶體驗(yàn)。無(wú)效鏈接可能會(huì)損害您產(chǎn)品的信譽(yù),因?yàn)樗翱赡堋笔鼓脑L問者感到對(duì)體驗(yàn)的關(guān)注程度最低。
如果您的Web產(chǎn)品包含許多頁(yè)面(或鏈接),導(dǎo)致404錯(cuò)誤(或找不到頁(yè)面),則搜索引擎(例如Google)上的產(chǎn)品排名也將受到嚴(yán)重影響。刪除無(wú)效鏈接是SEO(搜索引擎優(yōu)化)活動(dòng)的組成部分之一。
在Selenium WebDriver教程系列的這一部分中,我們將深入研究如何使用Selenium WebDriver查找斷開的鏈接。我將演示了使用Selenium Python進(jìn)行的斷開鏈接測(cè)試。
Web測(cè)試中的斷開鏈接簡(jiǎn)介
簡(jiǎn)單來(lái)說(shuō),網(wǎng)站(或Web應(yīng)用程序)中的損壞鏈接(或無(wú)效鏈接)是指無(wú)法訪問且無(wú)法按預(yù)期工作的鏈接。鏈接可能由于服務(wù)器問題而暫時(shí)斷開,或者在后端配置不正確。

除了導(dǎo)致404錯(cuò)誤的頁(yè)面外,斷開鏈接的其他主要示例是格式錯(cuò)誤的URL,指向已移動(dòng)或刪除的內(nèi)容(例如,文檔,pdf,圖像等)的鏈接。
鏈接斷開的主要原因
以下是發(fā)生鏈接斷開(死鏈接或鏈接腐爛)的一些常見原因:
用戶輸入的網(wǎng)址不正確或拼寫錯(cuò)誤。
網(wǎng)站中具有URL重定向或內(nèi)部重定向的結(jié)構(gòu)更改(即永久鏈接)未正確配置。
鏈接到已移動(dòng)或刪除的內(nèi)容,如視頻,文檔等。如果內(nèi)容被移動(dòng),則“內(nèi)部鏈接”應(yīng)重定向到指定的鏈接。
網(wǎng)站維護(hù)導(dǎo)致網(wǎng)站暫時(shí)停機(jī),導(dǎo)致該網(wǎng)站暫時(shí)無(wú)法訪問。
頁(yè)面頂部的HTML標(biāo)記損壞,JavaScript錯(cuò)誤,錯(cuò)誤的HTML / CSS自定義,嵌入式元素?fù)p壞等都可能導(dǎo)致鏈接斷開。
地理位置限制會(huì)阻止從某些IP地址(如果將其列入黑名單)或世界上特定國(guó)家/地區(qū)訪問網(wǎng)站。使用Selenium進(jìn)行地理位置測(cè)試有助于確保為訪問站點(diǎn)的位置(或國(guó)家/地區(qū))量身定制體驗(yàn)。
為什么要檢查斷開的鏈接?
鏈接斷開對(duì)于訪問您網(wǎng)站的訪問者來(lái)說(shuō)是個(gè)很大的麻煩。這是您應(yīng)檢查網(wǎng)站上損壞的鏈接的一些主要原因:
鏈接斷開可能會(huì)損害用戶體驗(yàn)。
對(duì)于SEO(搜索引擎優(yōu)化)來(lái)說(shuō),刪除斷開(或失效)的鏈接至關(guān)重要,因?yàn)檫@可能會(huì)影響網(wǎng)站在搜索引擎(例如Google)上的排名。
可以使用網(wǎng)頁(yè)上的Selenium WebDriver完成斷開的鏈接測(cè)試,然后可以使用該Selenium WebDriver刪除站點(diǎn)的斷開的鏈接。
鏈接斷開和HTTP狀態(tài)代碼
當(dāng)用戶訪問網(wǎng)站時(shí),瀏覽器會(huì)將請(qǐng)求發(fā)送到該網(wǎng)站的服務(wù)器。服務(wù)器使用稱為“ HTTP狀態(tài)代碼”的三位數(shù)代碼來(lái)響應(yīng)瀏覽器的請(qǐng)求。
HTTP狀態(tài)代碼是服務(wù)器對(duì)Web瀏覽器發(fā)送的請(qǐng)求的響應(yīng)。這些HTTP狀態(tài)代碼被認(rèn)為等效于瀏覽器(從中發(fā)送URL請(qǐng)求)與服務(wù)器之間的對(duì)話。
盡管將不同的HTTP狀態(tài)代碼用于不同的目的,但是大多數(shù)代碼對(duì)于診斷站點(diǎn)中的問題,最大程度地減少站點(diǎn)停機(jī)時(shí)間,無(wú)效鏈接的數(shù)量等很有用。每三位狀態(tài)碼的第一位以數(shù)字1?5開頭。狀態(tài)代碼表示為1xx,2xx ..,5xx,用于指示該特定范圍內(nèi)的狀態(tài)代碼。由于這些范圍中的每一個(gè)都包含不同類別的服務(wù)器響應(yīng),因此我們將討論范圍限于為斷開的鏈接提供的HTTP狀態(tài)代碼。
以下是常見的狀態(tài)代碼類,可用于檢測(cè)Selenium斷開的鏈接:
| HTTP狀態(tài)碼的類別 | 描述 |
|---|---|
| 1xx | 服務(wù)器仍在考慮請(qǐng)求。 |
| 2xx | 瀏覽器發(fā)送的請(qǐng)求已成功完成,服務(wù)器已將預(yù)期的響應(yīng)發(fā)送到瀏覽器。 |
| 3xx | 這表明正在執(zhí)行重定向。例如,301重定向通常用于在網(wǎng)站上實(shí)施永久重定向。 |
| 4xx | 這表明特定頁(yè)面(或完整站點(diǎn))無(wú)法訪問。 |
| 5xx | 這表明即使瀏覽器發(fā)送了有效的請(qǐng)求,服務(wù)器也無(wú)法完成請(qǐng)求。 |
在檢測(cè)到斷開的鏈接時(shí)顯示的HTTP狀態(tài)代碼
以下是網(wǎng)絡(luò)服務(wù)器在遇到斷開的鏈接時(shí)顯示的一些常見HTTP狀態(tài)代碼:
| HTTP狀態(tài)碼 | 描述 |
|---|---|
| 400(錯(cuò)誤請(qǐng)求) | 服務(wù)器無(wú)法處理請(qǐng)求,因?yàn)樘岬降腢RL不正確。 |
| 400(錯(cuò)誤請(qǐng)求-錯(cuò)誤主機(jī)) | 這表明主機(jī)名無(wú)效,由于該主機(jī)名無(wú)法處理請(qǐng)求。 |
| 400(錯(cuò)誤請(qǐng)求-錯(cuò)誤URL) | 這表明服務(wù)器無(wú)法處理請(qǐng)求,因?yàn)檩斎氲腢RL格式不正確(例如,缺少括號(hào),斜杠等)。 |
| 400(錯(cuò)誤請(qǐng)求-超時(shí)) | 這表明HTTP請(qǐng)求已超時(shí)。 |
| 400(錯(cuò)誤請(qǐng)求-空) | 服務(wù)器返回的響應(yīng)為空,沒有內(nèi)容,也沒有響應(yīng)代碼。 |
| 400(錯(cuò)誤請(qǐng)求-重置) | 這表明服務(wù)器無(wú)法處理該請(qǐng)求,因?yàn)樗τ谔幚砥渌?qǐng)求或站點(diǎn)所有者對(duì)其進(jìn)行了錯(cuò)誤配置。 |
| 403(禁止) | 真正的請(qǐng)求已發(fā)送到服務(wù)器,但由于需要授權(quán),因此拒絕履行該請(qǐng)求。 |
| 404頁(yè)面不存在) | 資源(或頁(yè)面)在服務(wù)器上不可用。 |
| 408(請(qǐng)求超時(shí)) | 服務(wù)器已超時(shí)等待請(qǐng)求。客戶端(即瀏覽器)可以在服務(wù)器準(zhǔn)備等待的時(shí)間內(nèi)發(fā)送相同的請(qǐng)求。 |
| 410(已去) | HTTP狀態(tài)代碼比404(找不到頁(yè)面)更永久。410表示該頁(yè)面已消失。 該頁(yè)面在服務(wù)器上不可用,也未設(shè)置任何轉(zhuǎn)發(fā)(或重定向)機(jī)制。指向410頁(yè)的鏈接將訪問者發(fā)送到無(wú)效資源。 |
| 503服務(wù)不可用) | 這表明服務(wù)器暫時(shí)超載,因此服務(wù)器無(wú)法處理請(qǐng)求。這也可能意味著正在服務(wù)器上進(jìn)行維護(hù),從而指示搜索引擎有關(guān)站點(diǎn)的臨時(shí)停機(jī)時(shí)間。 |
如何使用Selenium WebDriver查找斷開的鏈接?
不論Selenium WebDriver使用哪種語(yǔ)言,使用Selenium進(jìn)行斷開鏈接測(cè)試的指導(dǎo)原則都保持不變。以下是使用Selenium WebDriver測(cè)試斷開的鏈接的步驟:
為每個(gè)鏈接發(fā)送一個(gè)HTTP請(qǐng)求。
驗(yàn)證為響應(yīng)上一步中發(fā)送的請(qǐng)求而收到的相應(yīng)響應(yīng)代碼。
根據(jù)服務(wù)器發(fā)送的響應(yīng)代碼驗(yàn)證鏈接是否斷開。
對(duì)頁(yè)面上存在的每個(gè)鏈接重復(fù)步驟(2-4)。
在本Selenium WebDriver教程中,我們將演示如何使用Selenium WebDriver在Python,Java,C#和PHP中執(zhí)行斷開的鏈接測(cè)試。測(cè)試是在(Chrome 85.0 + Windows 10)組合上進(jìn)行的,執(zhí)行是在LambdaTest提供的基于云的Selenium Grid上進(jìn)行的。
要開始使用LambdaTest,請(qǐng)?jiān)谄脚_(tái)上創(chuàng)建一個(gè)帳戶,并注意LambdaTest的個(gè)人資料部分中提供的用戶名和訪問密鑰。瀏覽器功能是使用LambdaTest功能生成器生成的。
這是用于使用Selenium查找網(wǎng)站上斷開鏈接的測(cè)試方案:
測(cè)試場(chǎng)景
轉(zhuǎn)到軟件測(cè)試test面試小程序后臺(tái),即Chrome 85.0上的https://www.test-1.com/
收集頁(yè)面上存在的所有鏈接
發(fā)送每個(gè)鏈接的HTTP請(qǐng)求
在終端上打印鏈接是否斷開
重要的是要注意,使用Selenium測(cè)試斷開的鏈接所花費(fèi)的時(shí)間取決于“被測(cè)網(wǎng)頁(yè)”上存在的鏈接數(shù)量。頁(yè)面上的鏈接數(shù)量越多,將花費(fèi)更多的時(shí)間來(lái)查找斷開的鏈接。例如,LambdaTest有大量的鏈接(?150 +);因此,查找斷開的鏈接的過(guò)程可能需要一些時(shí)間(大約幾分鐘)。
使用Selenium python的錯(cuò)誤鏈接測(cè)試
import requestsimport urllib3import pytestfrom requests.exceptions import MissingSchema, InvalidSchema, InvalidURLfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.keys import Keyscapabilities = {"build" : "[Python] 使用Selenium在網(wǎng)頁(yè)上查找錯(cuò)誤的鏈接","name" : "[Python] 使用Selenium在網(wǎng)頁(yè)上查找錯(cuò)誤的鏈接","platform" : "Windows 10","browserName" : "Chrome","version" : "85.0"}user_name = "user-name"app_key = "access-key"broken_links = 0valid_links = 0# options = webdriver.ChromeOptions()# options.add_argument("start-maximized")# options.add_argument('disable-infobars')# driver=webdriver.Chrome(options=options)urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)remote_url?=?"http://"?+?user_name?+?":"?+?app_key?+?"@test-1.top/login/"driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = capabilities)driver.maximize_window()driver.get('https://www.test-1.top/login/')# links = driver.find_elements_by_css_selector("a")links = driver.find_elements(By.CSS_SELECTOR, "a")for link in links:try:request = requests.head(link.get_attribute('href'), data ={'key':'value'})print("Status of " + link.get_attribute('href') + " is " + str(request.status_code))if (request.status_code == 404):broken_links = (broken_links + 1)else:valid_links = (valid_links + 1)except requests.exceptions.MissingSchema:print("Encountered MissingSchema Exception")except requests.exceptions.InvalidSchema:print("Encountered InvalidSchema Exception")except:print("Encountered Some other execption")print("Detection of broken links completed with " + str(broken_links) + " broken links and " + str(valid_links) + " valid links")
? ?
代碼遍歷
1.導(dǎo)入模塊
除了為Selenium WebDriver導(dǎo)入Python模塊之外,我們還導(dǎo)入了請(qǐng)求模塊。請(qǐng)求模塊使您可以發(fā)送各種HTTP請(qǐng)求。它也可以用于在URL中傳遞參數(shù),發(fā)送自定義標(biāo)頭等。
import requestsimport urllib3from requests.exceptions import MissingSchema, InvalidSchema, InvalidURL
? ? ?
2.收集頁(yè)面上存在的鏈接
通過(guò)CSS選擇器“ a”屬性找到Web元素,可以找到被測(cè)URL上存在的鏈接(即cnds博客)。
links = driver.find_elements(By.CSS_SELECTOR, "a")由于我們希望元素是可迭代的,因此我們使用find_elements方法(而不是find_element方法)。
3.遍歷URL以進(jìn)行驗(yàn)證
請(qǐng)求模塊的head方法用于將HEAD請(qǐng)求發(fā)送到指定的URL。該get_attribute方法的每一個(gè)環(huán)節(jié)上用于獲取“?HREF?”錨標(biāo)記的屬性。
該頭方法在僅場(chǎng)景主要用于STATUS_CODE是必需的或HTTP標(biāo)頭,和該文件的內(nèi)容(或URL)是不需要的。head方法返回request.Response對(duì)象,該對(duì)象還包含HTTP狀態(tài)代碼(即request.status_code)。
for link in links:try:request = requests.head(link.get_attribute('href'), data ={'key':'value'})print("Status of " + link.get_attribute('href') + " is " + str(request.status_code))
重復(fù)執(zhí)行同一組操作,直到用完頁(yè)面上所有的“鏈接”。
4.通過(guò)狀態(tài)碼驗(yàn)證鏈接
如果在步驟(3)中發(fā)送的HTTP請(qǐng)求的HTTP響應(yīng)代碼為404(即,找不到頁(yè)面),則表示該鏈接是斷開的鏈接。對(duì)于未斷開的鏈接,HTTP狀態(tài)代碼為200。
if (request.status_code == 404):broken_links = (broken_links + 1)else:valid_links = (valid_links + 1)
?
5.跳過(guò)無(wú)關(guān)的請(qǐng)求
當(dāng)head方法應(yīng)用于不包含“ href”屬性的鏈接(例如mailto,電話等)時(shí),將導(dǎo)致異常(即MissingSchema,InvalidSchema)。
except requests.exceptions.MissingSchema:print("Encountered MissingSchema Exception")except requests.exceptions.InvalidSchema:print("Encountered InvalidSchema Exception")except:print("Encountered Some other execption")
?
這些異常被捕獲,并且在終端上打印相同的內(nèi)容。
執(zhí)行
我在這里使用PyUnit(或unittest),它是Python中的默認(rèn)測(cè)試框架,用于使用Selenium進(jìn)行的斷開鏈接測(cè)試。在終端上運(yùn)行以下命令:
python Broken_Links.py結(jié)論

錯(cuò)誤的鏈接(也稱為無(wú)效鏈接或爛鏈接)可能會(huì)妨礙用戶體驗(yàn),如果它們存在于網(wǎng)站上。鏈接斷開也會(huì)影響搜索引擎的排名。因此,對(duì)于與網(wǎng)站開發(fā)和測(cè)試有關(guān)的活動(dòng),應(yīng)定期進(jìn)行斷開的鏈接測(cè)試。
往期推薦



