---
name: "Weasel"
section: "3pm"
platform: "linux"
package: "libweasel-perl"
version: "0.32-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Weasel"
---

# Weasel(3pm)

Perl's php/Mink-inspired abstracted web-driver framework

## NAME

Weasel - Perl's php/Mink-inspired abstracted web-driver framework

## VERSION

version 0.32

## SYNOPSIS

```
  use Weasel;
  use Weasel::Session;
  use Weasel::Driver::Selenium2;
  my $weasel = Weasel->new(
       default_session => 'default',
       sessions => {
          default => Weasel::Session->new(
            driver => Weasel::Driver::Selenium2->new(%opts),
          ),
       });
  $weasel->session->get('http://localhost/index');
```

## DESCRIPTION

This module abstracts away the differences between the various web-driver protocols, like the Mink project does for PHP.

While heavily inspired by Mink, `"Weasel"` aims to improve over it by being extensible, providing not just access to the underlying browser, yet to provide building blocks for further development and abstraction.

Pherkin::Extension::Weasel provides integration with Test::BDD::Cucumber (aka pherkin), for BDD testing.

For the actual page interaction, this module needs a driver to be installed.  Currently, that means Weasel::Driver::Selenium2. Other driver implementations, such as Sahi \<http://sahipro.com/\> can be independently developed and uploaded to CPAN, or contributed. (We welcome and encourage both!)

### Differences with other frameworks

- Mnemonics for element lookup patterns

  The central registry of xpath expressions to find common page elements helps to keep page access code clean. E.g. compare:

  ```
     use Weasel::FindExpanders::HTML;
     $session->page->find('*contains', text => 'Some text');
  ```

  With

  ```
     $session->page->find(".//*[contains(.,'Some text')]
                                [not(.//*[contains(.,'Some text')])]");
  ```

  Multiple patterns can be registered for a single mnemonic, which will be concatenated to a single xpath expression to find the matching tags in a single driver query.

  Besides good performance, this has the benefit that the following

  ```
     $session->page->find('*button', text => 'Click!');
  ```

  can be easily extended to match Dojo toolkit's \<http://dojotoolkit.org/documentation/\> buttons, which on the HTML level don't contain visible button or input tags, simply by using the widget support set:

  ```
     use Weasel::Widgets::Dojo;
  ```

- Widgets encapsulate specific behaviours

  All elements in `"Weasel"` are of the base type `"Weasel::Element"`, which encapsulates the regular element interactions (click, find children, etc).

  While most elements will be represented by `"Weasel::Element"`, it's possible to implement other wrappers.  These offer a logical extension point to implement tag-specific utility functions.  E.g. `"Weasel::Widgets::HTML::Select"`, which adds the utility function `"select_option"`.

  These widgets also offer a good way to override default behaviours.  One such case is the Dojo implementation of a 'select' element.  This element replaces the select tag entirely and in contrast with the original, doesn't keep the options as child elements of the 'select'-replacing tag.  By using the Dojo widget library

  ```
     use Weasel::Widget::Dojo;
  ```

  the lack of the parent/child relation between the the select and its options is transparently handled by overriding the widget's `"find"` and `"find_all"` methods.

### PageObject architecture pattern support

The functionality to encapsulate behaviours in widgets, enables intuitive integration of the Page Object architectural pattern \<https://www.selenium.dev/documentation/test\_practices/encouraged/page\_object\_models/\> for design of test code. This pattern allows reduction of test code due and separation of concerns between the functional test and the page interaction.

## DEPENDENCIES

- KEYS

  Returns a reference to a hash with names of the keys in the hash keys and single-character strings containing the key codes as the values.

## ATTRIBUTES

- default\_session

  The name of the default session to return from `"session"`, in case no name argument is provided.

- sessions

  Holds the sessions registered with the `"Weasel"` instance.

## SUBROUTINES/METHODS

- session(\[$name \[, $value\]\])

  Returns the session identified by `$name`.

  If `$value` is specified, it's associated with the given `$name`.

## AUTHOR

```
  Erik Huelsmann
```

## CONTRIBUTORS

```
  Erik Huelsmann
  Yves Lavoie
```

## MAINTAINERS

```
  Erik Huelsmann
```

## BUGS AND LIMITATIONS

Bugs can be filed in the GitHub issue tracker for the Weasel project:\
  \<https://github.com/perl-weasel/weasel/issues\>

## SOURCE

The source code repository for Weasel is at\
  https://github.com/perl-weasel/weasel

## SUPPORT

Community support is available through perl-weasel@googlegroups.com \<mailto:perl-weasel@googlegroups.com\>.

## BUGS

Bugs can be filed in the GitHub issue tracker for the Weasel project:\
  \<https://github.com/perl-weasel/weasel/issues\>

## SOURCE

The source code repository for Weasel is at\
  \<https://github.com/perl-weasel/weasel\>

## SUPPORT

Community support is available through perl-weasel@googlegroups.com \<mailto:perl-weasel@googlegroups.com\>.

## LICENSE AND COPYRIGHT

```
 (C) 2016-2023  Erik Huelsmann
```

Licensed under the same terms as Perl.
