The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Firefox::Marionette::Element - Represents a Firefox element retrieved using the Marionette protocol

VERSION

Version 1.55

SYNOPSIS

    use Firefox::Marionette();
    use v5.10;

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $element = $firefox->find('//input[@id="metacpan_search-input"]');

    $element->type('Test::More');

DESCRIPTION

This module handles the implementation of a Firefox Element using the Marionette protocol

CONSTANTS

IDENTIFIER

returns the web element identifier

SUBROUTINES/METHODS

aria_label

returns the ARIA label for the element.

aria_role

returns the ARIA role for the element.

attribute

accepts a scalar name a parameter. It returns the initial value of the attribute with the supplied name. Compare with the current value returned by property method.

clear

clears any user supplied input from the element

click

sends a 'click' to the element. The browser will wait for any page load to complete or the session's page_load duration to elapse before returning, which, by default is 5 minutes. The click method is also used to choose an option in a select dropdown.

    use Firefox::Marionette();

    my $firefox = Firefox::Marionette->new(visible => 1)->go('https://ebay.com');
    my $select = $firefox->find_tag('select');
    foreach my $option ($select->find_tag('option')) {
        if ($option->property('value') == 58058) { # Computers/Tablets & Networking
            $option->click();
        }
    }

css

accepts a scalar CSS property name as a parameter. It returns the value of the computed style for that property.

find

accepts an xpath expression expression> as the first parameter and returns the first element that matches this expression.

This method is subject to the implicit timeout.

    use Firefox::Marionette();
    use v5.10;

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    $div->find('//input[@id="metacpan_search-input"]')->type('Test::More');

    # OR in list context

    my $div = $firefox->find_class('page-content');
    foreach my $element ($div->find('//input[@id="metacpan_search-input"]')) {
        $element->type('Test::More');
    }

If no elements are found, a not found exception will be thrown. For the same functionality that returns undef if no elements are found, see the has method.

find_id

accepts an id as the first parameter and returns the first element with a matching 'id' property.

This method is subject to the implicit timeout.

    use Firefox::Marionette();
    use v5.10;

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    $div->find_id('metacpan_search-input')->type('Test::More');

    # OR in list context

    my $div = $firefox->find_class('page-content');
    foreach my $element ($div->find_id('metacpan_search-input')) {
        $element->type('Test::More');
    }

If no elements are found, a not found exception will be thrown. For the same functionality that returns undef if no elements are found, see the has_id method.

find_name

This method returns the first element with a matching 'name' property.

This method is subject to the implicit timeout.

    use Firefox::Marionette();
    use v5.10;

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    $div->find_name('q')->type('Test::More');

    # OR in list context

    my $div = $firefox->find_class('page-content');
    foreach my $element ($div->find_name('q')) {
        $element->type('Test::More');
    }

If no elements are found, a not found exception will be thrown. For the same functionality that returns undef if no elements are found, see the has_name method.

find_class

accepts a class name as the first parameter and returns the first element with a matching 'class' property.

This method is subject to the implicit timeout.

    use Firefox::Marionette();
    use v5.10;

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    $div->find_class('form-control home-metacpan_search-input')->type('Test::More');

    # OR in list context

    my $div = $firefox->find_class('page-content');
    foreach my $element ($div->find_class('form-control home-metacpan_search-input')) {
        $element->type('Test::More');
    }

If no elements are found, a not found exception will be thrown. For the same functionality that returns undef if no elements are found, see the has_class method.

find_selector

accepts a CSS Selector as the first parameter and returns the first element that matches that selector.

This method is subject to the implicit timeout.

    use Firefox::Marionette();
    use v5.10;

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    $div->find_selector('input.home-metacpan_search-input')->type('Test::More');

    # OR in list context

    my $div = $firefox->find_class('page-content');
    foreach my $element ($div->find_selector('input.home-metacpan_search-input')) {
        $element->type('Test::More');
    }

If no elements are found, a not found exception will be thrown. For the same functionality that returns undef if no elements are found, see the has_selector method.

find_tag

accepts a tag name as the first parameter and returns the first element with this tag name.

This method is subject to the implicit timeout.

    use Firefox::Marionette();
    use v5.10;

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    my $input = $div->find_tag('input');

    # OR in list context

    my $div = $firefox->find_class('page-content');
    foreach my $element ($div->find_tag('input')) {
        # do something
    }

If no elements are found, a not found exception will be thrown. For the same functionality that returns undef if no elements are found, see the has_tag method.

accepts a text string as the first parameter and returns the first link element that has a matching link text.

This method is subject to the implicit timeout.

    use Firefox::Marionette();
    use v5.10;

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('footer-links');
    $div->find_link('API')->click();

    # OR in list context

    my $div = $firefox->find_class('footer-links');
    foreach my $element ($div->find_link('API')) {
        $element->click();
    }

If no elements are found, a not found exception will be thrown. For the same functionality that returns undef if no elements are found, see the has_link method.

find_partial

accepts a text string as the first parameter and returns the first link element that has a partially matching link text.

This method is subject to the implicit timeout.

    use Firefox::Marionette();
    use v5.10;

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('footer-links');
    $div->find_partial('AP')->click();

    # OR in list context

    my $div = $firefox->find_class('footer-links');
    foreach my $element ($div->find_partial('AP')) {
        $element->click();
    }

If no elements are found, a not found exception will be thrown. For the same functionality that returns undef if no elements are found, see the has_partial method.

has

accepts an xpath expression as the first parameter and returns the first element that matches this expression.

This method is subject to the implicit timeout, which, by default is 0 seconds.

    use Firefox::Marionette();

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    if (my $element = $div->has('//input[@id="metacpan_search-input"]')) {
        $element->type('Test::More');
    }

If no elements are found, this method will return undef. For the same functionality that throws a not found exception, see the find method.

has_id

accepts an id as the first parameter and returns the first element with a matching 'id' property.

This method is subject to the implicit timeout, which, by default is 0 seconds.

    use Firefox::Marionette();

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    if (my $element = $div->has_id('metacpan_search-input')) {
        $element->type('Test::More');
    }

If no elements are found, this method will return undef. For the same functionality that throws a not found exception, see the find_id method.

has_name

This method returns the first element with a matching 'name' property.

This method is subject to the implicit timeout, which, by default is 0 seconds.

    use Firefox::Marionette();

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    if (my $element = $div->has_name('q')) {
        $element->type('Test::More');
    }

If no elements are found, this method will return undef. For the same functionality that throws a not found exception, see the find_name method.

has_class

accepts a class name as the first parameter and returns the first element with a matching 'class' property.

This method is subject to the implicit timeout, which, by default is 0 seconds.

    use Firefox::Marionette();

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    if (my $element = $div->has_class('form-control home-metacpan_search-input')) {
        $element->type('Test::More');
    }

If no elements are found, this method will return undef. For the same functionality that throws a not found exception, see the find_class method.

has_selector

accepts a CSS Selector as the first parameter and returns the first element that matches that selector.

This method is subject to the implicit timeout, which, by default is 0 seconds.

    use Firefox::Marionette();

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    if (my $element = $div->has_selector('input.home-metacpan_search-input')) {
        $element->type('Test::More');
    }

If no elements are found, this method will return undef. For the same functionality that throws a not found exception, see the find_selector method.

has_tag

accepts a tag name as the first parameter and returns the first element with this tag name.

This method is subject to the implicit timeout, which, by default is 0 seconds.

    use Firefox::Marionette();

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('page-content');
    if (my $element = $div->has_tag('input');
        # do something
    }

If no elements are found, this method will return undef. For the same functionality that throws a not found exception, see the find_tag method.

accepts a text string as the first parameter and returns the first link element that has a matching link text.

This method is subject to the implicit timeout, which, by default is 0 seconds.

    use Firefox::Marionette();

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('footer-links');
    if (my $element = $div->has_link('API')->click();
        $element->click();
    }

If no elements are found, this method will return undef. For the same functionality that throws a not found exception, see the find_link method.

has_partial

accepts a text string as the first parameter and returns the first link element that has a partially matching link text.

This method is subject to the implicit timeout, which, by default is 0 seconds.

    use Firefox::Marionette();

    my $firefox = Firefox::Marionette->new()->go('https://metacpan.org/');

    my $div = $firefox->find_class('footer-links');
    if (my $element = $div->has_partial('AP')->click();
        $element->click();
    }

If no elements are found, this method will return undef. For the same functionality that throws a not found exception, see the find_partial method.

is_enabled

returns true or false if the element is enabled.

is_selected

returns true or false if the element is selected.

is_displayed

returns true or false if the element is displayed.

new

returns a new element.

property

accepts a scalar name a parameter. It returns the current value of the property with the supplied name. Compare with the initial value returned by attribute method.

rect

returns the current position and size of the element

scroll

accepts an optional parameter which is the same as for the scrollInfoView method.

    use Firefox::Marionette();

    my $firefox = Firefox::Marionette->new(visible => 1)->go('https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView');
    $firefox->find_id('content')->find_link('Examples')->scroll({ behavior => 'smooth', block => 'center' });

send_keys

*** DEPRECATED - see type. ***

selfie

returns a File::Temp object containing a lossless PNG image screenshot of the element.

accepts the following optional parameters as a hash;

  • hash - return a SHA256 hex encoded digest of the PNG image rather than the image itself

  • full - take a screenshot of the whole document unless the first element parameter has been supplied.

  • scroll - scroll to the element supplied

  • highlights - a reference to a list containing elements to draw a highlight around

shadow_root

returns the element's ShadowRoot as a shadow root object or throws an exception.

    use Firefox::Marionette();
    use Cwd();

    my $firefox = Firefox::Marionette->new()->go('file://' . Cwd::cwd() . '/t/data/elements.html');

    $firefox->find_class('add')->click();
    my $shadow_root = $firefox->find_tag('custom-square')->shadow_root();

    foreach my $element (@{$firefox->script('return arguments[0].children', args => [ $shadow_root ])}) {
        warn $element->tag_name();
    }

shadowy

returns true if the element has a ShadowRoot or false otherwise.

    use Firefox::Marionette();
    use Cwd();

    my $firefox = Firefox::Marionette->new()->go('file://' . Cwd::cwd() . '/t/data/elements.html');

    $firefox->find_class('add')->click();
    if ($firefox->find_tag('custom-square')->shadowy()) {
        my $shadow_root = $firefox->find_tag('custom-square')->shadow_root();
        warn $firefox->script('return arguments[0].innerHTML', args => [ $shadow_root ]);
        ...
    }

This function will probably be used to see if the shadow_root method can be called on this element without raising an exception.

switch_to_frame

switches to this frame within the current window.

tag_name

returns the relevant tag name. For example 'a' or 'input'.

text

returns the text that is contained by that element (if any)

type

accepts a scalar string as a parameter. It sends the string to this element, such as filling out a text box. This method returns the browser to aid in chaining methods.

uuid

returns the browser generated UUID connected with this element.

DIAGNOSTICS

None.

CONFIGURATION AND ENVIRONMENT

Firefox::Marionette::Element requires no configuration files or environment variables.

DEPENDENCIES

None.

INCOMPATIBILITIES

None reported.

BUGS AND LIMITATIONS

To report a bug, or view the current list of bugs, please visit https://github.com/david-dick/firefox-marionette/issues

AUTHOR

David Dick <ddick@cpan.org>

LICENSE AND COPYRIGHT

Copyright (c) 2024, David Dick <ddick@cpan.org>. All rights reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See "perlartistic" in perlartistic.

DISCLAIMER OF WARRANTY

BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR CORRECTION.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.