如何使用Selenium WebDriver查找错误的链接?

2020-12-29 12:26:34 浏览数 (1)

当您在网站上遇到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测试断开的链接的步骤:

  1. 使用<a>标签收集网页上所有链接的详细信息。
  2. 为每个链接发送一个HTTP请求。
  3. 验证为响应上一步中发送的请求而收到的相应响应代码。
  4. 根据服务器发送的响应代码验证链接是否断开。
  5. 对页面上存在的每个链接重复步骤(2-4)。

在本Selenium WebDriver教程中,我们将演示如何使用Selenium WebDriver在Python,Java,C#和PHP中执行断开的链接测试。测试是在(Chrome 85.0 Windows 10)组合上进行的,执行是在LambdaTest提供的基于云的Selenium Grid上进行的。

要开始使用LambdaTest,请在平台上创建一个帐户,并注意LambdaTest的个人资料部分中提供的用户名和访问密钥。浏览器功能是使用LambdaTest功能生成器生成的。

这是用于使用Selenium查找网站上断开链接的测试方案:

测试场景

  1. 转到软件测试test面试小程序后台,即Chrome 85.0上的https://www.test-1.com/
  2. 收集页面上存在的所有链接
  3. 发送每个链接的HTTP请求
  4. 在终端上打印链接是否断开

重要的是要注意,使用Selenium测试断开的链接所花费的时间取决于“被测网页”上存在的链接数量。页面上的链接数量越多,将花费更多的时间来查找断开的链接。例如,LambdaTest有大量的链接(〜150 );因此,查找断开的链接的过程可能需要一些时间(大约几分钟)。

使用Selenium python的错误链接测试

代码语言:javascript复制
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中传递参数,发送自定义标头等。

代码语言:javascript复制
import requests
import urllib3
from requests.exceptions import MissingSchema, InvalidSchema, InvalidURL

2.收集页面上存在的链接

通过CSS选择器“ a”属性找到Web元素,可以找到被测URL上存在的链接(即cnds博客)。

代码语言:javascript复制
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)。

代码语言:javascript复制
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。

代码语言:javascript复制
if (request.status_code == 404):
    broken_links = (broken_links   1)
else:
    valid_links = (valid_links   1)

5.跳过无关的请求

当head方法应用于不包含“ href”属性的链接(例如mailto,电话等)时,将导致异常(即MissingSchema,InvalidSchema)。

代码语言:javascript复制
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进行的断开链接测试。在终端上运行以下命令:

代码语言:javascript复制
python Broken_Links.py

结论

錯誤的链接(也称为无效链接或烂链接)可能会妨碍用户体验,如果它们存在于网站上。链接断开也会影响搜索引擎的排名。因此,对于与网站开发和测试有关的活动,应定期进行断开的链接测试。

0 人点赞