我有一个登录的网站,我想测试在该网站存在的所有链接。
我尝试查找链接,并单击每个链接,以使用Selenium远程驱动程序进行验证。但我遇到的一个问题是返回到上一个URL并选择下一个链接。这个测试应该是递归的。
我们如何使用Selenium远程驱动来做到这一点呢?
下面的程序我试着检查断开的链接
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";
}
}
}
发布于 2013-12-05 11:48:01
我知道在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;
}
尽管这不是Perl代码,但我希望这能有所帮助
发布于 2013-12-05 14:45:31
你为什么不尝试使用一些工具,因为你的网站可以通过9000+网址,这是大量的时间和工作,你可以使用Xenu
P.S.要测试站点的隐私部分,您必须通过IE登录,因为Xenu只使用IE cookie
发布于 2014-08-07 17:26:07
嗯,我以前也跨过这座桥,下面是我是如何解决它的。现在我应该说我在WebDriver :)之前跨越了这座桥,所以这是使用WWW::Selenium而不是S:R:D,但是概念是相同的,并且仍然适用。
对于测试工程师来说,最繁琐的任务之一就是手动验证链路。我们可以自动化大部分过程,只要我们有点击链接后预期登陆位置的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;
这可以很容易地修改为做更多的事情,而不仅仅是点击链接。当然,没有什么能比得上一双眼睛对所点击的链接的预期登录页面。在您的组织中实现类似的解决方案可能会简化手动测试。这是我过去的做法:不是每件事都可以自动化,但我们肯定可以让审查大量链接变得更容易。上面的逻辑可以很容易地扩展为捕获屏幕截图并将其添加到“待查看”图像的队列中。这些由软件图像正确标记的图像是您在测试的最后阶段使用的;视觉验证阶段。
使用这种方法,您将立即知道链接是否断开(假设您更新了上面的逻辑以包含此功能,同样,此示例可以轻松扩展以包含此功能)。此外,您将有能力在视觉上验证的屏幕截图的预期链接登录页面。
实际上,我在这里有一篇关于这个问题的博客文章:get all links and click on each one
希望这能有所帮助。
https://stackoverflow.com/questions/20399009
复制