The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use strict;
my $driver = Brownie::Driver::SeleniumServer->new;
my $body = <<__HTTPD__;
<html>
<head><title>test title</title></head>
<body>
<ul>
<li>li 1</li>
<li class="even">li 2</li>
<li>li 3</li>
<li class="even">li 4</li>
<li>li 5</li>
</ul>
<p>outer paragraph</p>
<div id="parent">
<p>inner paragraph</p>
</div>
</body>
</html>
__HTTPD__
my $httpd = Test::Fake::HTTPD->new(timeout => 30);
$httpd->run(sub { [ 200, [ 'Content-Type' => 'text/html; charset=utf-8' ], [ $body ] ] });
my $base_url = $httpd->endpoint;
subtest 'Finder' => sub {
$driver->visit($base_url);
my $doc = $driver->find('/html');
subtest 'using XPath' => sub {
subtest 'all' => sub {
is scalar($doc->all('//li')) => 5;
is scalar($doc->all('//li[@class="even"]')) => 2;
subtest 'empty when not exist locator' => sub {
lives_ok {
my @elems = $doc->all('//span[@class="noexist"]');
is scalar(@elems) => 0;
};
};
};
subtest 'find' => sub {
is $doc->find('//li')->text => 'li 1';
is $doc->find('//li[@class="even"]')->text => 'li 2';
subtest 'child element' => sub {
my $base = $doc->find('//div[@id="parent"]');
my $child = $base->find('//p');
is $child->text => 'inner paragraph';
};
};
};
subtest 'using CSS Selector' => sub {
subtest 'all' => sub {
is scalar($doc->all('li')) => 5;
is scalar($doc->all('li.even')) => 2;
subtest 'empty when not exist locator' => sub {
lives_ok {
my @elems = $doc->all('span.noexist');
is scalar(@elems) => 0;
};
};
};
subtest 'find' => sub {
is $doc->find('li')->text => 'li 1';
is $doc->find('li.even')->text => 'li 2';
subtest 'child element' => sub {
my $base = $doc->find('#parent');
my $child = $base->find('p');
is $child->text => 'inner paragraph';
};
};
};
};
done_testing;