Как я могу получить все ссылки на веб-странице и нажать одну за другой, используя селен - PullRequest
1 голос
/ 13 февраля 2012

Как я могу получить все ссылки на веб-странице и щелкнуть одну за другой, используя селен

// Код

  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 голосов
/ 26 февраля 2012

Одной из самых утомительных задач, IMO, для инженера-тестировщика является ручная проверка ссылок.Мы можем автоматизировать большую часть процесса и до тех пор, пока у нас есть URL-адреса, по которым мы должны попасть после нажатия на ссылку, мы можем проверить эту функцию, используя Selenium и немного JS.

В приведенном нижеНапример, сначала мы переходим на нужный веб-сайт, а затем используем функцию getEval() Selenium для выполнения 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;

Выше может бытьлегко изменить, чтобы сделать гораздо больше, чем просто нажать на ссылки.И, конечно, ничто не сравнится с целевыми целевыми страницами по ссылкам, по которым щелкнули ссылки.

Наш полный пост в блоге находится здесь: Получить все ссылки и нажать на каждую

0 голосов
/ 13 февраля 2012

Когда вы нажимаете на ссылку, вы переходите по ссылке, которая делает недействительными найденные вами элементы.Вам нужно либо вернуться на страницу:

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