Selenium-Screenshot
view release on metacpan or search on metacpan
lib/Selenium/Screenshot.pm view on Meta::CPAN
with 'Selenium::Screenshot::CanPad';
around BUILDARGS => sub {
my ($orig, $self, %args) = @_;
if ($args{target} && $self->_coerce_target($args{target})) {
my $cropped_png = $self->_crop_to_target($args{png}, $args{target});
return $self->$orig(%args, png => $cropped_png);
}
else {
return $self->$orig(%args);
}
};
sub compare {
my ($self, $opponent) = @_;
$opponent = $self->_set_opponent($opponent);
if (not defined $opponent) {
carp 'No reference was provided or found, so no comparison was done. We\'ve saved a reference at ' . $self->reference;
return $self->save_reference;
}
else {
$self->_cmp->set_method(
method => &Image::Compare::AVG_THRESHOLD,
args => {
type => &Image::Compare::AVG_THRESHOLD::MEAN,
value => $self->threshold,
}
);
return $self->_cmp->compare;
}
}
sub difference {
my ($self, $opponent) = @_;
$opponent = $self->_set_opponent($opponent);
# We want to range from transparent (no difference) to fuschia at
# 100% change.
my $white = Imager::Color->new(255, 255, 255);
my $fuschia = Imager::Color->new(240, 18, 190);
my $scale = Imager::Fountain->simple(
positions => [ 0.0, 1.0 ],
colors => [ $white, $fuschia ]
);
$self->_cmp->set_method(
method => &Image::Compare::IMAGE,
args => $scale
);
# Do the actual pixel by pixel comparison. This can take a while.
my $diff = $self->_cmp->compare;
# Post processing to overlay the difference onto the
# opponent. First, subtract a white box from our difference image;
# to make everything white transparent instead.
my $work = Imager->new(
xsize => $diff->getwidth,
ysize => $diff->getheight,
channels => $diff->getchannels
);
$work->box(filled => 1, color => $white );
$diff = $work->difference(other => $diff);
# Place the transparent diff image on top of our opponent -
# anything changed will show up on top of the opponent image in
# varying degrees of pink.
$opponent->compose(src => $diff);
my $name = $self->_diff_filename;
$opponent->write(file => $name);
return $name;
}
sub find_opponent {
my ($self) = @_;
my $default_reference = $self->reference;
if (-e $default_reference) {
return Imager->new(file => $default_reference);
}
}
sub _diff_filename {
my ($self) = @_;
my $diff = $self->filename;
$diff =~ s/\.png$/-diff.png/;
return $diff;
}
sub _set_opponent {
my ($self, $opponent) = @_;
$opponent //= $self->find_opponent;
# No opponent was provided, and we can't find one.
return unless $opponent;
$opponent = $self->_extract_image( $opponent );
# Before setting this $opponent as our image2, we must ensure that
# our $self->png image and this $opponent are the same size.
if (! $self->cmp_image_dims( $self->png, $opponent )) {
my ($new_png, $new_opp) = $self->coerce_image_size( $self->png, $opponent );
$self->_set_png( $new_png );
$opponent = $new_opp;
}
$opponent = $self->_img_exclude( $opponent ) if $self->has_exclude;
$self->_cmp->set_image2( img => $opponent );
( run in 0.358 second using v1.01-cache-2.11-cpan-df04353d9ac )