vlambda博客
学习文章列表

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

 今日互动话题 

今年的圣诞节你想怎么过?

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

当您在网站上遇到404 /页面未找到/无效超链接时,会想到什么想法?啊!当您遇到损坏的超链接时,您会感到烦恼,这是为什么您应继续专注于消除Web产品(或网站)中损坏的链接的唯一原因。您可以使用Selenium WebDriver来利用自动化进行錯誤的链接测试,而无需进行人工检查。

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

当特定链接断开并且访问者登陆页面时,它将影响该页面的功能并导致不良的用户体验。无效链接可能会损害您产品的信誉,因为它“可能”使您的访问者感到对体验的关注程度最低。


如果您的Web产品包含许多页面(或链接),导致404错误(或找不到页面),则搜索引擎(例如Google)上的产品排名也将受到严重影响。删除无效链接是SEO(搜索引擎优化)活动的组成部分之一。

在Selenium WebDriver教程系列的这一部分中,我们将深入研究如何使用Selenium WebDriver查找断开的链接。我将演示了使用Selenium Python进行的断开链接测试。


Web测试中的断开链接简介

简单来说,网站(或Web应用程序)中的损坏链接(或无效链接)是指无法访问且无法按预期工作的链接。链接可能由于服务器问题而暂时断开,或者在后端配置不正确。



除了导致404错误的页面外,断开链接的其他主要示例是格式错误的URL,指向已移动或删除的内容(例如,文档,pdf,图像等)的链接。


链接断开的主要原因


以下是发生链接断开(死链接或链接腐烂)的一些常见原因:


  • 用户输入的网址不正确或拼写错误。

  • 网站中具有URL重定向或内部重定向的结构更改(即永久链接)未正确配置。

  • 链接到已移动或删除的内容,如视频,文档等。如果内容被移动,则“内部链接”应重定向到指定的链接。

  • 网站维护导致网站暂时停机,导致该网站暂时无法访问。

  • 页面顶部的HTML标记损坏,JavaScript错误,错误的HTML / CSS自定义,嵌入式元素损坏等都可能导致链接断开。


为什么要检查断开的链接?

链接断开对于访问您网站的访问者来说是个很大的麻烦。这是您应检查网站上损坏的链接的一些主要原因:

  • 链接断开可能会损害用户体验。

  • 对于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的错误链接测试


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在网页上查找错误的链接","name" : "[Python] 使用Selenium在网页上查找错误的链接","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.导入模块

除了为Selenium WebDriver导入Python模块之外,我们还导入了请求模块。请求模块使您可以发送各种HTTP请求。它也可以用于在URL中传递参数,发送自定义标头等。

import requestsimport urllib3from 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.跳过无关的请求

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


结论


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

往期推荐