2016-03-03 1 views
1

Я пытаюсь просканировать все ссылки на внутреннем сайте, используя WWW :: Mechanize :: Firefox. Сайт загружает некоторый контент через javascript, поэтому я должен сначала щелкнуть по некоторым элементам того же класса «expand». Структура сайта такова:WWW :: Mechanize :: Firefox, щелкнув все изображения класса

<table> 
    <tr> 
    <td> 
    <a id="xyz" href="somesite"> Content </a> 
    </td> 
    </tr> 
    <tr> 
    <td> 
     <div> 
     <a id="twistie" onclick="expand_this"> 
      <img class="expand" border="0" width="13" height="13" alt="Show All" title="Show All" src="images/plus.gif"> 
     </a> 
     </div> 
    </td> 
    </tr> 
</table> 

щелчок по изображению загружает больше контента в контейнер-контейнер. На сайте несколько кратных изображений класса расширяются, и я должен щелкнуть их по всем для доступа ко всему контенту. Здесь я терплю неудачу.

То, что я пытался до сих пор:

$mech->click({ xpath => '//img[@class="expand"]', synchronize => 0 }); 

Это щелкает только первый из образов-элементов.

my @images = $mech->xpath('//img[@class="expand"]', synchronize => 0); 

возвращает столько элементов массива, сколько я могу считать вручную на своей странице. Тем не менее, я немного потерял, как вставить элементы массива, возвращенные в действие click.

Я могу открыть первый элемент с

$mech->click({ xpath => '//img[@class="expand"][0]', synchronize => 0 }); 

Но

$mech->click({ xpath => '//img[@class="expand"][1]', synchronize => 0 }); 

возвращает мне

No elements found for //img[@class="expand"][1] at (eval 1377)[/usr/share/perl/5.18/perl5db.pl:732] line 2. 

Я попробовал этот подход дальше:

foreach my $id (0 .. scalar @images) { 
    print $id, "\n"; 
    $mech->click({ xpath => qq(//img[\@class="expand"]["$id"]), synchronize => 0 }); 

} 

, но это не открывает никаких элементов (не знаю почему).

Я что-то упустил? Что мне нужно сделать, чтобы щелкнуть все img-теги общего класса, поскольку изображения, к сожалению, не имеют идентификатора?

ответ

1

У вас уже есть массив Perl с объектами изображения - просто перебирайте его, вместо того чтобы просить mech итерировать его коллекцию.

foreach (@images) { $mech->click($_) } 
+0

Благодарим за предложение! Я думаю, мне нужно синхронизировать клик снова, но пытаюсь «$ mech-> click ($ plusses [0], {synchronize => 0});' также зависает в моем отладчике. – yulivee