NAME
WWW::Mechanize::TreeBuilder - combine WWW::Mechanize and HTML::TreeBuilder in nice ways
SYNOPSIS
use
Test::WWW::Mechanize;
# or
# use WWW::Mechanize;
# or
# use Test::WWW::Mechanize::Catalyst 'MyApp';
my
$mech
= Test::WWW::Mechanize->new;
# or
#my $mech = Test::WWW::Mechanize::Catalyst->new;
# etc. etc.
WWW::Mechanize::TreeBuilder->meta->apply(
$mech
);
$mech
->get_ok(
'/'
);
is(
$mech
->look_down(
_tag
=>
'p'
)->as_trimmed_text,
'Some text'
,
'It worked'
);
DESCRIPTION
This module combines WWW::Mechanize and HTML::TreeBuilder. Why? Because I've seen too much code like the following:
like(
$mech
->content,
qr{<p>some text</p>}
,
"Found the right tag"
);
Which is just all flavours of wrong - its akin to processing XML with regexps. Instead, do it like the following:
ok(
$mech
->look_down(
_tag
=>
'p'
,
sub
{
$_
[0]->as_trimmed_text eq
'some text'
})
The anon-sub there is a bit icky, but this means that anyone should happen to add attributes to the <p>
tag (such as an id or a class) it will still work and find the right tag.
All of the methods available on HTML::Element (that aren't 'private' - i.e. that don't begin with an underscore) such as look_down
or find
are automatically delegated to $mech->tree
through the magic of Moose.
METHODS
Everything in WWW::Mechanize (or which ever sub class you apply it to) and all public methods from HTML::Element except those where WWW::Mechanize and HTML::Element overlap. In the case where the two classes both define a method, the one from WWW::Mechanize will be used (so that the existing behaviour of Mechanize doesn't break.)
USING XPATH OR OTHER SUBCLASSES
HTML::TreeBuilder::XPath allows you to use xpath selectors to select elements in the tree. You can use that module by providing parameters to the moose role:
tree_class
=>
'HTML::TreeBuilder::XPath'
};
# or
# NOTE: No hashref using this method
WWW::Mechanize::TreeBuilder->meta->apply(
$mech
,
tree_class
=>
'HTML::TreeBuilder::XPath'
;
);
and class will be automatically loaded for you. This class will be used to construct the tree in the following manner:
$tree
=
$tree_class
->new_from_content(
$req
->decoded_content)->elementify;
You can also specify a element_class
parameter which is the (HTML::Element sub)class that methods are proxied from. This module provides defaults for element_class when tree_class
is "HTML::TreeBuilder" or "HTML::TreeBuilder::XPath" - it will warn otherwise.
AUTHOR
Ash Berlin <ash@cpan.org>
LICENSE
Same as Perl 5.8, or at your option any later version of Perl.