如何使用Selenium WebDriver查找错误的链接?
今日互动话题
今年的圣诞节你想怎么过?
当您在网站上遇到404 /页面未找到/无效超链接时,会想到什么想法?啊!当您遇到损坏的超链接时,您会感到烦恼,这是为什么您应继续专注于消除Web产品(或网站)中损坏的链接的唯一原因。您可以使用Selenium WebDriver来利用自动化进行錯誤的链接测试,而无需进行人工检查。
当特定链接断开并且访问者登陆页面时,它将影响该页面的功能并导致不良的用户体验。无效链接可能会损害您产品的信誉,因为它“可能”使您的访问者感到对体验的关注程度最低。
如果您的Web产品包含许多页面(或链接),导致404错误(或找不到页面),则搜索引擎(例如Google)上的产品排名也将受到严重影响。删除无效链接是SEO(搜索引擎优化)活动的组成部分之一。
在Selenium WebDriver教程系列的这一部分中,我们将深入研究如何使用Selenium WebDriver查找断开的链接。我将演示了使用Selenium Python进行的断开链接测试。
Web测试中的断开链接简介
简单来说,网站(或Web应用程序)中的损坏链接(或无效链接)是指无法访问且无法按预期工作的链接。链接可能由于服务器问题而暂时断开,或者在后端配置不正确。
除了导致404错误的页面外,断开链接的其他主要示例是格式错误的URL,指向已移动或删除的内容(例如,文档,pdf,图像等)的链接。
链接断开的主要原因
以下是发生链接断开(死链接或链接腐烂)的一些常见原因:
用户输入的网址不正确或拼写错误。
网站中具有URL重定向或内部重定向的结构更改(即永久链接)未正确配置。
链接到已移动或删除的内容,如视频,文档等。如果内容被移动,则“内部链接”应重定向到指定的链接。
网站维护导致网站暂时停机,导致该网站暂时无法访问。
页面顶部的HTML标记损坏,JavaScript错误,错误的HTML / CSS自定义,嵌入式元素损坏等都可能导致链接断开。
地理位置限制会阻止从某些IP地址(如果将其列入黑名单)或世界上特定国家/地区访问网站。使用Selenium进行地理位置测试有助于确保为访问站点的位置(或国家/地区)量身定制体验。
为什么要检查断开的链接?
链接断开对于访问您网站的访问者来说是个很大的麻烦。这是您应检查网站上损坏的链接的一些主要原因:
链接断开可能会损害用户体验。
对于SEO(搜索引擎优化)来说,删除断开(或失效)的链接至关重要,因为这可能会影响网站在搜索引擎(例如Google)上的排名。
可以使用网页上的Selenium WebDriver完成断开的链接测试,然后可以使用该Selenium WebDriver删除站点的断开的链接。
链接断开和HTTP状态代码
当用户访问网站时,浏览器会将请求发送到该网站的服务器。服务器使用称为“ HTTP状态代码”的三位数代码来响应浏览器的请求。
HTTP状态代码是服务器对Web浏览器发送的请求的响应。这些HTTP状态代码被认为等效于浏览器(从中发送URL请求)与服务器之间的对话。
尽管将不同的HTTP状态代码用于不同的目的,但是大多数代码对于诊断站点中的问题,最大程度地减少站点停机时间,无效链接的数量等很有用。每三位状态码的第一位以数字1〜5开头。状态代码表示为1xx,2xx ..,5xx,用于指示该特定范围内的状态代码。由于这些范围中的每一个都包含不同类别的服务器响应,因此我们将讨论范围限于为断开的链接提供的HTTP状态代码。
以下是常见的状态代码类,可用于检测Selenium断开的链接:
HTTP状态码的类别 | 描述 |
---|---|
1xx | 服务器仍在考虑请求。 |
2xx | 浏览器发送的请求已成功完成,服务器已将预期的响应发送到浏览器。 |
3xx | 这表明正在执行重定向。例如,301重定向通常用于在网站上实施永久重定向。 |
4xx | 这表明特定页面(或完整站点)无法访问。 |
5xx | 这表明即使浏览器发送了有效的请求,服务器也无法完成请求。 |
在检测到断开的链接时显示的HTTP状态代码
以下是网络服务器在遇到断开的链接时显示的一些常见HTTP状态代码:
HTTP状态码 | 描述 |
---|---|
400(错误请求) | 服务器无法处理请求,因为提到的URL不正确。 |
400(错误请求-错误主机) | 这表明主机名无效,由于该主机名无法处理请求。 |
400(错误请求-错误URL) | 这表明服务器无法处理请求,因为输入的URL格式不正确(例如,缺少括号,斜杠等)。 |
400(错误请求-超时) | 这表明HTTP请求已超时。 |
400(错误请求-空) | 服务器返回的响应为空,没有内容,也没有响应代码。 |
400(错误请求-重置) | 这表明服务器无法处理该请求,因为它正忙于处理其他请求或站点所有者对其进行了错误配置。 |
403(禁止) | 真正的请求已发送到服务器,但由于需要授权,因此拒绝履行该请求。 |
404页面不存在) | 资源(或页面)在服务器上不可用。 |
408(请求超时) | 服务器已超时等待请求。客户端(即浏览器)可以在服务器准备等待的时间内发送相同的请求。 |
410(已去) | HTTP状态代码比404(找不到页面)更永久。410表示该页面已消失。 该页面在服务器上不可用,也未设置任何转发(或重定向)机制。指向410页的链接将访问者发送到无效资源。 |
503服务不可用) | 这表明服务器暂时超载,因此服务器无法处理请求。这也可能意味着正在服务器上进行维护,从而指示搜索引擎有关站点的临时停机时间。 |
如何使用Selenium WebDriver查找断开的链接?
不论Selenium WebDriver使用哪种语言,使用Selenium进行断开链接测试的指导原则都保持不变。以下是使用Selenium WebDriver测试断开的链接的步骤:
使用<a>标签收集网页上所有链接的详细信息。
为每个链接发送一个HTTP请求。
验证为响应上一步中发送的请求而收到的相应响应代码。
根据服务器发送的响应代码验证链接是否断开。
对页面上存在的每个链接重复步骤(2-4)。
在本Selenium WebDriver教程中,我们将演示如何使用Selenium WebDriver在Python,Java,C#和PHP中执行断开的链接测试。测试是在(Chrome 85.0 + Windows 10)组合上进行的,执行是在LambdaTest提供的基于云的Selenium Grid上进行的。
要开始使用LambdaTest,请在平台上创建一个帐户,并注意LambdaTest的个人资料部分中提供的用户名和访问密钥。浏览器功能是使用LambdaTest功能生成器生成的。
这是用于使用Selenium查找网站上断开链接的测试方案:
测试场景
转到软件测试test面试小程序后台,即Chrome 85.0上的https://www.test-1.com/
收集页面上存在的所有链接
发送每个链接的HTTP请求
在终端上打印链接是否断开
重要的是要注意,使用Selenium测试断开的链接所花费的时间取决于“被测网页”上存在的链接数量。页面上的链接数量越多,将花费更多的时间来查找断开的链接。例如,LambdaTest有大量的链接(〜150 +);因此,查找断开的链接的过程可能需要一些时间(大约几分钟)。
使用Selenium python的错误链接测试
import requests
import urllib3
import pytest
from requests.exceptions import MissingSchema, InvalidSchema, InvalidURL
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
capabilities = {
"build" : "[Python] 使用Selenium在网页上查找错误的链接",
"name" : "[Python] 使用Selenium在网页上查找错误的链接",
"platform" : "Windows 10",
"browserName" : "Chrome",
"version" : "85.0"
}
user_name = "user-name"
app_key = "access-key"
broken_links = 0
valid_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.导入模块
除了为Selenium WebDriver导入Python模块之外,我们还导入了请求模块。请求模块使您可以发送各种HTTP请求。它也可以用于在URL中传递参数,发送自定义标头等。
import requests
import urllib3
from requests.exceptions import MissingSchema, InvalidSchema, InvalidURL
2.收集页面上存在的链接
通过CSS选择器“ a”属性找到Web元素,可以找到被测URL上存在的链接(即cnds博客)。
links = driver.find_elements(By.CSS_SELECTOR, "a")
由于我们希望元素是可迭代的,因此我们使用find_elements方法(而不是find_element方法)。
3.遍历URL以进行验证
请求模块的head方法用于将HEAD请求发送到指定的URL。该get_attribute方法的每一个环节上用于获取“ HREF ”锚标记的属性。
该头方法在仅场景主要用于STATUS_CODE是必需的或HTTP标头,和该文件的内容(或URL)是不需要的。head方法返回request.Response对象,该对象还包含HTTP状态代码(即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))
重复执行同一组操作,直到用完页面上所有的“链接”。
4.通过状态码验证链接
如果在步骤(3)中发送的HTTP请求的HTTP响应代码为404(即,找不到页面),则表示该链接是断开的链接。对于未断开的链接,HTTP状态代码为200。
if (request.status_code == 404):
broken_links = (broken_links + 1)
else:
valid_links = (valid_links + 1)
5.跳过无关的请求
当head方法应用于不包含“ href”属性的链接(例如mailto,电话等)时,将导致异常(即MissingSchema,InvalidSchema)。
except requests.exceptions.MissingSchema:
print("Encountered MissingSchema Exception")
except requests.exceptions.InvalidSchema:
print("Encountered InvalidSchema Exception")
except:
print("Encountered Some other execption")
这些异常被捕获,并且在终端上打印相同的内容。
执行
我在这里使用PyUnit(或unittest),它是Python中的默认测试框架,用于使用Selenium进行的断开链接测试。在终端上运行以下命令:
python Broken_Links.py
结论
錯誤的链接(也称为无效链接或烂链接)可能会妨碍用户体验,如果它们存在于网站上。链接断开也会影响搜索引擎的排名。因此,对于与网站开发和测试有关的活动,应定期进行断开的链接测试。