我有一个登录网站,我想测试该网站上的所有链接 我尝试找到链接并单击每个链接以使用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";
}
}
}
答案 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
P.S。要测试您网站的privete部分,您必须登录IE浏览器,因为Xenu仅使用IE Cookie
答案 2 :(得分:0)
对于测试工程师来说,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
希望有所帮助。