Portál AbcLinuxu, 30. dubna 2025 10:15
package Test::Crawler; use Moose; use WWW::Mechanize; has client => ( is => 'ro', isa => 'WWW::Mechanize', default => sub { WWW::Mechanize->new }, ); has handler => ( is => 'ro', isa => 'CodeRef', default => sub {}, ); sub crawl { my ($self, $url, $visited) = (@_, {}); # Already seen that. return if $visited->{$url}++; # Not seen yet, get. $self->client->get($url); $self->handler->($url, $self->client); # Follow all links. my @uris = map { $_->URI } $self->client->links; for my $uri (@uris) { # Skip mailtos, ftp and such. next if $uri->scheme; # Skip external links. next if $uri->host; $self->crawl($uri->rel, $visited); } } 1;Pak už stačí crawler pustit v rámci testu a do handleru napsat kód pro validaci HTML a cokoliv dalšího. Pro začátek kontroluju visící odkazy:
use Test::More; use Test::Crawler; use Test::WWW::Mechanize::Catalyst; sub handle_link { my ($url, $mech) = @_; ok $mech->response->is_success, "failed to fetch: $url"; } my $mech = Test::WWW::Mechanize::Catalyst->new(catalyst_app => 'Foo'); Test::Crawler->new(client => $mech, handler => \&handle_link)->crawl('/'); done_testing;Už během psaní crawleru jsem našel pár chybných URL (dobře schovaných v dynamicky generovaném RSS feedu), takže podobný test se jistě užije. Jen pro tu validaci by asi doopravdy bylo dobré začít používat místní validátor, abych nespamoval online služby.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.