首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Selenium远程驱动程序查找断开的链接

使用Selenium远程驱动程序查找断开的链接
EN

Stack Overflow用户
提问于 2013-12-05 11:39:21
回答 3查看 667关注 0票数 0

我有一个登录的网站,我想测试在该网站存在的所有链接。

我尝试查找链接,并单击每个链接,以使用Selenium远程驱动程序进行验证。但我遇到的一个问题是返回到上一个URL并选择下一个链接。这个测试应该是递归的。

我们如何使用Selenium远程驱动来做到这一点呢?

下面的程序我试着检查断开的链接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    sub traverse {
      my ($self) = @_;
      my $links = find_links("//a");

      foreach my $index (1..$#$links) {
        my $url = $links->[$index]->get_attribute('href');
        my $result = $links->[$index]->click();
        if ($result) {
          traverse();
        } else {
          print "url is broken $url\n";
        }
      }
    }
EN

回答 3

Stack Overflow用户

发布于 2013-12-05 11:48:01

我知道在C#中可以通过检查返回的状态码来做到这一点。因此,您实际上并没有单击该链接,而是检索到了该链接将要给出的响应的头部。在此标题中,您可以找到HTTP状态代码,您可以检查该代码以查看链接是否给出了有效的响应。另外,您不能离开当前站点!

在C#中,获取状态代码的一种可能方法如下所示(不包括对HTTP状态代码的检查):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static HttpStatusCode GetStatusCode(string url)
{
    var result = default(HttpStatusCode);
    var request = WebRequest.Create(url);
    request.Method = "HEAD";
    HttpWebResponse response;

    try {
        response = request.GetResponse() as HttpWebResponse;
    } catch (WebException) {
        return HttpStatusCode.NotFound;
    }

    if (response != null)
    {
        result = response.StatusCode;
        response.Close();
        response.Dispose();
    }

    return result;
}

尽管这不是Perl代码,但我希望这能有所帮助

票数 2
EN

Stack Overflow用户

发布于 2013-12-05 14:45:31

你为什么不尝试使用一些工具,因为你的网站可以通过9000+网址,这是大量的时间和工作,你可以使用Xenu

  1. Install
  2. In选项选中使用Cookie
  3. 运行IE并通过它登录
  4. 运行Xenu

P.S.要测试站点的隐私部分,您必须通过IE登录,因为Xenu只使用IE cookie

票数 0
EN

Stack Overflow用户

发布于 2014-08-07 17:26:07

嗯,我以前也跨过这座桥,下面是我是如何解决它的。现在我应该说我在WebDriver :)之前跨越了这座桥,所以这是使用WWW::Selenium而不是S:R:D,但是概念是相同的,并且仍然适用。

对于测试工程师来说,最繁琐的任务之一就是手动验证链路。我们可以自动化大部分过程,只要我们有点击链接后预期登陆位置的URL,我们就可以使用Selenium和一些JS来验证这一功能。

在下面的示例中,我们首先导航到所需的网站,然后使用Selenium的getEval()函数执行JavaScript,该函数收集页面上的所有链接(锚点),并将它们保存在逗号分隔的列表中。然后,这个列表被拆分并推入一个数组。然后,我们遍历数组中的链接列表,单击每个链接,然后使用go_back导航回起始页面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use strict;
use warnings;
use Time::HiRes qw(sleep);
use Test::WWW::Selenium;
use Test::More "no_plan";

my $sel = Test::WWW::Selenium->new( host => "localhost",
                                    port => 4444,
                                    browser => "*iexplore",
                                    browser_url => "http://www.google.com/");

$sel->open_ok("/", "true");

$sel->set_speed("1000");

my $javascript = "var allLinks = this.browserbot.getCurrentWindow().document.getElementsByTagName('a');
                 var separator = ',';
                 var all_links_texts = '';

                 for(var i = 0; i < allLinks.length; i++) {
                       all_links_texts = all_links_texts+separator+allLinks[i].href;
                 }
               all_links_texts;";

# Get all of the links in the page and, using a comma to separate each one, add them to the all_links_texts var.
my $link_list = $sel->get_eval($javascript);

my @link_array = split /,/ , $link_list;

my $count = 0;

# Click on each link contained in the array and then go_back
# You can add other logic here like capture and store a screenshot for example
foreach my $link_name (@link_array) {

    unless ($link_name =~ /^$/){

        $sel->click_ok("css=a[href $= $link_name]");

        $sel->wait_for_page_to_load("30000");

        print "Clicked Link href: $link_name \n";

        $sel->go_back();

        $count++;
    }
}
print "Clicked $count URL's";
pass;

这可以很容易地修改为做更多的事情,而不仅仅是点击链接。当然,没有什么能比得上一双眼睛对所点击的链接的预期登录页面。在您的组织中实现类似的解决方案可能会简化手动测试。这是我过去的做法:不是每件事都可以自动化,但我们肯定可以让审查大量链接变得更容易。上面的逻辑可以很容易地扩展为捕获屏幕截图并将其添加到“待查看”图像的队列中。这些由软件图像正确标记的图像是您在测试的最后阶段使用的;视觉验证阶段。

使用这种方法,您将立即知道链接是否断开(假设您更新了上面的逻辑以包含此功能,同样,此示例可以轻松扩展以包含此功能)。此外,您将有能力在视觉上验证的屏幕截图的预期链接登录页面。

实际上,我在这里有一篇关于这个问题的博客文章:get all links and click on each one

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20399009

复制
相关文章
使用 React 和 ethers.js 构建DApp
scaffold-eth[2] 因为引入内容太多了,对于我来说太复杂了, 不知道大家有没有同感,找到一篇使用 React 开发 DApp 的非常简单入门教程。翻译一下.
Tiny熊
2022/11/07
5.5K0
使用 React 和 ethers.js 构建DApp
数字藏品NFT的开发框架
数字藏品NFT(非同质化代币)的开发框架涉及区块链技术、智能合约、存储解决方案、用户交互等多个方面。以下是一个完整的数字藏品NFT开发框架,涵盖从技术选型到部署上线的关键步骤。
数字孪生开发者
2025/01/26
1030
数字藏品NFT的开发框架
浅谈如何定义和调用Python的函数
本文主要介绍了如何定义和调用Python函数。首先介绍了函数的概念和作用,然后详细讲解了如何定义函数和调用函数,最后列举了一个例子来加深理解。
企鹅号小编
2018/01/03
2K0
浅谈如何定义和调用Python的函数
shell中调用python函数,发送邮件
一、shell中调用python函数1.邮件正文是框架自带的生成的报告 2.邮件附件是第三方类库生成的炫酷的报告看板 send_email.pyimport refrom email.mime.application import MIMEApplicationfrom email.mime.multipart import MIMEMultipartfrom smtplib import SMTP_SSLfrom email.header import Headerimport schedulefr
懿曲折扇情
2022/08/24
8420
shell中调用python函数,发送邮件
如何使用 ethers.js 监听待处理交易
如果你喜欢观看而不是阅读,这里有一个视频指南:https://www.youtube.com/embed/YjQj6uk9M98
Tiny熊
2022/11/07
2.8K0
如何使用 ethers.js 监听待处理交易
Js 使用new关键字调用函数和直接调用函数的区别
var friend=new Person("Nicholas",29,"Software Engineer");
大道七哥
2019/09/10
3.7K0
Js   使用new关键字调用函数和直接调用函数的区别
solidity智能合约如何实现跨合约调用函数
比如现在有一个需求、我需要通过外部合约获取BRC20 token的总交易量。那么我需要在brc20的转账函数里面做一些调整,主要是两个函数内统计转移量。然后再提供外部获取函数。
终有链响
2024/07/29
1180
solidity智能合约如何实现跨合约调用函数
云函数之间互相调用实现邮件发送
很多时候,我们会面临在小程序的后台实现多重功能,比如用户管理、日志分析、数据排序等,不同的功能之间还会相互调用。如果把这些功能都写到一个云函数里,会造成云函数逻辑过于复杂,执行速度较慢等问题。此时,我们可以使用微信提供的SDK “wx-server-sdk” ,很方便的实现函数之间的调用。把功能函数拆分成一个个独立的云函数,会有很多好处:
Mason-Serverless
2018/11/20
11.7K1
如何在React.js中使用Shadcn/UI
学习如何在React.js中使用Shadcn/UI构建可自定义且轻量的界面。了解如何将其与Apipost集成,以实现高效的API管理和测试。非常适合希望提升React.js项目的开发者!
用户11531559
2025/02/28
1050
函数的定义和调用
Golang是一门强类型语言,函数是Golang中的基本构建块之一。在Golang中,函数可以定义返回值、参数、变量和常量等内容,并通过调用来执行特定的任务。本文将全面介绍Golang中函数的定义和调用,包括函数签名、不定长参数、闭包和匿名函数等,同时提供完整的代码示例。
用户1413827
2023/11/28
1400
函数的定义和调用
1.函数的定义和调用 1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = function(){ 方式3 new Function() var f = new Function('a', 'b', 'console.log(a + b)'); f(1, 2); ​ var fn = new Function('参数1','参数2'..., '函数体') 1.2函数的调用方式 普通函数
梨涡浅笑
2020/10/27
8810
函数的定义和调用
image.png
清出于兰
2022/05/11
9640
函数的定义和调用
函数的定义和调用
1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = function(){} 方式3 new Function( '参数1', '参数2',' 函数体'); var f = new Function('a', 'b', 'console.log(a + b)'); f(1, 2); console.1og(f instanceof Object ); //instanceof
星辰_大海
2020/10/26
1.5K0
函数的定义和调用
Solidity 智能合约开发 - 玩转 ethers.js
在之前的《Solidity 智能合约开发 - 基础》中,我们学习了 Solidity 的基本语法,并且了解了可以通过 Brownie 与 HardHat 等框架进行调试。而另一篇《Solidity 智能合约开发 - 玩转 Web3.py》中我们也通过 Web3.py 直接与我们本地的 Ganache 节点进行交互了。
pseudoyu
2023/04/11
1.1K0
Solidity 智能合约开发 - 玩转 ethers.js
Lua函数的冒号调用和点调用
冒号定义函数中的self指向函数所属表对象,即self是table类型,通过self表可以:访问挂载在该表下的所有冒号定义函数 如,有定义A={},A:b() A:c();函数b,c都是冒号定义函数,在b,c函数内部self是地址指向A的表,在b函数中可以通过self:c()来调用c函数,同理在c函数中也可以通过self:b()来调用b函数 代码示例:
bering
2020/03/19
3.4K0
oracle函数的调用应使用execute命令_matlab函数调用
之前一直使用的MySQL数据库,第一次接触Oracle就用到了函数和存储过程,今天跟大家分享一下使用过程.
全栈程序员站长
2022/10/04
2.2K0
oracle函数的调用应使用execute命令_matlab函数调用
RISC-V 函数调用约定和Stack使用
不同的处理器指令集不一样,而汇编语言中都是一条条指令,所以不同处理器对应的汇编语言必然不一样。
大忽悠爱学习
2023/10/11
1.1K0
RISC-V 函数调用约定和Stack使用
如何禁止函数的传值调用
按照参数形式的不同,C++应该有三种函数调用方式:传值调用、引用调用和指针调用。对于基本数据类型的变量作为实参进行参数传递时,采用传值调用与引用调用和指针调用的效率相差不大。但是,对于类类型来说,传值调用和引用调用之间的区别很大,类对象的尺寸越大,这种差别越大。
恋喵大鲤鱼
2018/08/03
2.8K0
如何在Vue中使用云开发的云函数,实现邮件发送
云开发的云函数能够让我们无需购买和管理服务器,就能够实现一些前端做不了,必须在服务端做的复杂操作,让我们大大降低了运维成本。本篇将会为您讲解,如何在前端主流框架Vue中使用云开发的云函数。 通过本篇您将可以学习到: 如何创建云开发环境 如何在Vue中使用云开发 如何在Vue中利用云开发的云函数,实现邮件的发送 1.创建云开发环境 打开云开发控制台地址:https://console.cloud.tencent.com/tcb,点击新建云开发环境 创建云开发环境 创建后进入控制台首页,复制环境ID保
腾讯云开发TCB
2020/09/14
3.7K0
Web3.0对前端很友好?
最近 web3.0 的呼声真的是越来越高,也越来越疯狂。对于我们前端来说,我们需要具备什么技术呢?
程序猿川子
2022/12/13
1.1K0
Web3.0对前端很友好?

相似问题

搜索大小写不敏感

13

大小写敏感的PHP搜索?

12

使用敏感替换进行不区分大小写的vim搜索

20

不区分大小写,但敏感

10

如何搜索elasticsearch大小写不敏感

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文