---
name: "WWW::Mechanize::TreeBuilder"
section: "3pm"
platform: "linux"
package: "libwww-mechanize-treebuilder-perl"
version: "1.20000-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/WWW::Mechanize::TreeBuilder"
---

# WWW::Mechanize::TreeBuilder(3pm)

combine WWW::Mechanize and HTML::TreeBuilder in nice ways

## NAME

WWW::Mechanize::TreeBuilder - combine WWW::Mechanize and HTML::TreeBuilder in nice ways

## SYNOPSIS

```
 use Test::More tests => 2;
 use Test::WWW::Mechanize;
 use WWW::Mechanize::TreeBuilder;
 # 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:

```
 with 'WWW::Mechanize::TreeBuilder' => {
   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.
