使用Selenium Remote Driver查找损坏的链接

时间:2013-12-05 11:39:21

标签: perl selenium selenium-webdriver

我有一个登录网站,我想测试该网站上的所有链接 我尝试找到链接并单击每个链接以使用Selenium Remote Driver进行验证。但我遇到的一个问题是回到以前的URL并选择下一个链接。这个测试应该是递归的 我们如何使用Selenium Remote Driver做到这一点?

按照程序我试图查看损坏的链接

    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";
        }
      }
    }

3 个答案:

答案 0 :(得分:2)

我知道通过检查返回的状态代码可以在C#中完成。所以你实际上没有点击链接,但是你正在检索链接将要提供的响应的标题。在此标头中,您可以找到HTTP状态代码,您可以检查该代码以查看链接是否提供有效响应。另外,您还没有离开现有网站!

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

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;
}

Altough这不是Perl代码,我希望这有帮助

答案 1 :(得分:0)

为什么不尝试使用某种工具,因为您的网站可以有超过9000多个网址,这需要大量的时间和工作,您可以使用Xenu

  1. 安装
  2. 在选项检查中使用Cookie
  3. 运行IE并登录
  4. 运行Xenu
  5. P.S。要测试您网站的privete部分,您必须登录IE浏览器,因为Xenu仅使用IE Cookie

答案 2 :(得分:0)

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

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

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

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;

这可以轻松修改,只需点击链接即可。当然,点击链接的目标登录页面上没有任何一双好眼睛。通过手动测试可以简化在组织中实施类似的解决方案。以下是我过去的做法: 并非所有内容都可以自动化,但我们当然可以更轻松地查看大量链接。上面的逻辑可以很容易地扩展到捕获屏幕截图并将其添加到&#34;以进行审查的队列中。图片。这些正确标记[由软件]图像是您在测试的最后阶段使用的图像;视觉验证阶段。

使用这种方法,您可以立即知道链接是否被破坏(假设您更新上面的逻辑也包括此内容,同样可以轻松扩展此示例以包含该功能)。此外,您还可以直观地验证预期链接登录页面的屏幕截图。

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

希望有所帮助。