如何获取网页的所有链接并使用selenium逐个点击

时间:2012-02-13 07:03:37

标签: selenium-rc selenium-webdriver

如何获取网页的所有链接并使用selenium逐一点击

//代码

  WebDriver driver = new FirefoxDriver();
    driver.get("http://www.HRS.com");
    List<WebElement> MyList = driver.findElements(By.xpath("//a")); 
    for(WebElement Element : MyList)
    {
    Element.click();  ----> m getting an error (IN 2 ITERATION) stating 
                           "Element not found in the cache - perhaps the page has 
                            changed since it was looked up" 

    }

任何人都可以帮助我吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

单击链接后,您将看到链接,这会使您找到的元素无效。您需要返回页面:

driver.navigate().back();

执行此操作后,您需要刷新列表中的元素,这意味着您当前的循环结构可能无法正常工作。

另一种选择是以下列方式检查:

//Might need to do some extra work if this is a relative link
HttpURLConnection httpConn = new HttpURLConnection(element.getAttribute("href"));
URLConnection = httpConn.openConnection();
if (conn instanceof HttpURLConnection) {
  HttpURLConnection http = (HttpURLConnection) conn;
  Assert.assertTrue("Invalid link on page.", http.getResponseCode() < 400);
}

答案 1 :(得分: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;

上述内容可以轻松修改,只需点击链接即可。当然,点击链接的目标着陆页上没有任何一双好眼睛。

我们的完整博客文章位于:Get all links and click on each one