前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用Selenium WebDriver查找错误的链接?

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

作者头像
用户7466307
发布2020-12-29 12:26:34
6.5K0
发布2020-12-29 12:26:34
举报

当您在网站上遇到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

结论

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试test 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Web测试中的断开链接简介
    • 链接断开的主要原因
      • 为什么要检查断开的链接?
        • 链接断开和HTTP状态代码
          • 在检测到断开的链接时显示的HTTP状态代码
          • 如何使用Selenium WebDriver查找断开的链接?
          • 使用Selenium python的错误链接测试
            • 执行
            • 结论
            相关产品与服务
            云开发 CloudBase
            云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档