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

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

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

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

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

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

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

代码语言:javascript
运行
复制
    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 19:48:01

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

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

代码语言:javascript
运行
复制
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 22: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-08 01:26:07

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

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

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

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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档