MarketSquare / robotframework-browser

Robot Framework Browser library powered by Playwright.
Apache License 2.0
527 stars 106 forks source link

robotframework-browser

All Contributors

Version Actions Status License


Robot Framework Browser library powered by Playwright. Moving browser automation to year 2023!

Aiming for :rocket: speed, :white_check_mark: reliability and :microscope: visibility.

See keyword documentation and web page for more details.

Installation instructions

Only Python 3.9 or newer is supported. From Node side 18, 20 and 22 LTS versions are supported.

  1. Install node.js e.g. from https://nodejs.org/en/download/
  2. Update pip pip install -U pip to ensure latest version is used
  3. Install robotframework-browser from the commandline: pip install robotframework-browser
  4. Install the node dependencies: run rfbrowser init in your shell
    • if rfbrowser is not found, try python -m Browser.entry init

Please note that by default Chromium, Firefox and WebKit browser are installed, even those would be already installed in the system. The installation size depends on the operating system, but usually is +700Mb. It is possible to skip browser binaries installation with rfbrowser init --skip-browsers command, but then user is responsible for browser binary installation. It is possible to install only selected browser binaries by adding chromium, firefox or webkit as arguments to init command. Example rfbrowser init firefox would install only Firefox binaries and rfbrowser init firefox chromium would install both Firefox and Chromium binaries.

Or use the docker images. Documented at docker/README.md.

Install with transformer

Starting from release 18.3.0 Browser library has optional dependency with Robotidy. Install library with Robotidy, run install with: pip install robotframework-browser[tidy]. Starting from 18.3.0 release, library will provide external Robotidy transformer. Transformer provided by Browser library can be run with command: rfbrowser transform --transformer-name /path/to/tests. Example: rfbrowser transform --wait-until-network-is-idle /path/to/tests would transform deprecated Wait Until Network Is Idle keyword to Wait For Load State keyword. To see full list of transformers provided by Browser library, run command: rfbrowser transform --help.

Update instructions

To upgrade your already installed robotframework-browser library

  1. Update from commandline: pip install -U robotframework-browser
  2. Clean old node side dependencies and browser binaries: rfbrowser clean-node
  3. Install the node dependencies for the newly installed version: rfbrowser init

Uninstall instructions

To completely uninstall library, including the browser binaries installed by Playwright, run following commands:

  1. Clean old node side dependencies and browser binaries: rfbrowser clean-node
  2. Uninstall with pip: pip uninstall robotframework-browser

Examples

Testing with Robot Framework

*** Settings ***
Library   Browser

*** Test Cases ***
Example Test
    New Page    https://playwright.dev
    Get Text    h1    contains    Playwright

and testing with Python.

import Browser
browser = Browser.Browser()
browser.new_page("https://playwright.dev")
assert 'Playwright' in browser.get_text("h1")
browser.close_browser()

and extending with JavaScript

async function myGoToKeyword(url, page, logger) {
    logger("Going to " + url)
    return await page.goto(url);
}
myGoToKeyword.rfdoc = "This is my own go to keyword";
exports.__esModule = true;
exports.myGoToKeyword = myGoToKeyword;
*** Settings ***
Library   Browser  jsextension=${CURDIR}/mymodule.js

*** Test Cases ***
Example Test
   New Page
   myGoToKeyword   https://www.robotframework.org

See example. Ready made extensions and a place to share your own at robotframework-browser-extensions.

Ergonomic selector syntax, supports chaining of text, css and xpath selectors

# Select element containing text "Login" with text selector strategy
# and select it's parent `input` element with xpath
Click    "Login" >> xpath=../input
# Select element with CSS strategy and select button in it with text strategy
Click    div.dialog >> "Ok"

Evaluate in browser page

New Page   ${LOGIN_URL}
${ref}=    Get Element    h1
Get Property    ${ref}    innerText    ==    Login Page
Evaluate JavaScript    ${ref}    (elem) => elem.innerText = "abc"
Get Property    ${ref}    innerText    ==    abc

Asynchronously waiting for HTTP requests and responses

# The button with id `delayed_request` fires a delayed request. We use a promise to capture it.
${promise}=    Promise To    Wait For Response    matcher=    timeout=3s
Click    \#delayed_request
${body}=    Wait For    ${promise}

Device Descriptors

${device}=  Get Device  iPhone X
New Context  &{device}
New Page
Get Viewport Size  # returns { "width": 375, "height": 812 }

Sending HTTP requests and parsing their responses

${response}=    HTTP    /api/post    POST    {"name": "John"}
Should Be Equal    ${response.status}    ${200}

Parallel test execution using Pabot

You can let RF Browser spawn separate processes for every pabot process. This is very simple, just run the tests normally using pabot (see https://github.com/mkorpela/pabot#basic-use ). However if you have small tests do not use --testlevelsplit, it will cause lots of overhead because tests cannot share the browsers in any case.

You can share the node side RF Browser processes by using the ROBOT_FRAMEWORK_BROWSER_NODE_PORT environment variable, and from Browser.utils import spawn_node_process helper (see the docs for the helper ). This saves some overhead based on how many splits of tests you are running. Clean up the process afterwards.

Re-using authentication credentials

Development

See CONTRIBUTING.md for development instructions.

Core team

In order of appearance.

Contributors

This project is community driven and becomes a reality only through the work of all the people who contribute. Supported by Robocorp through Robot Framework Foundation.

Mikko Korpela
Mikko Korpela

πŸ’»
Tatu Aalto
Tatu Aalto

πŸ’»
Antti Karjalainen
Antti Karjalainen

πŸ”
Ismo Aro
Ismo Aro

πŸ”
Janne HΓ€rkΓΆnen
Janne HΓ€rkΓΆnen

πŸ’»
Kerkko Pelttari
Kerkko Pelttari

πŸ’»
Robocorp
Robocorp

πŸ’΅
RenΓ©
RenΓ©

πŸ’»
Bryan Oakley
Bryan Oakley

πŸ€”
Tanakiat Srisaranyakul
Tanakiat Srisaranyakul

πŸ€”
Maaret PyhΓ€jΓ€rvi
Maaret PyhΓ€jΓ€rvi

πŸ““
Karlo Smid
Karlo Smid

πŸ““
Frank Schimmel
Frank Schimmel

πŸ““
Christoph
Christoph

⚠️
Mika HΓ€nninen
Mika HΓ€nninen

πŸ’¬
imbus
imbus

πŸ’΅
Niklas
Niklas

πŸ“–
gdroes
gdroes

⚠️
Reaktor
Reaktor

πŸ’΅
Adrian Yorke
Adrian Yorke

πŸ“– πŸ‘€
Nanakawa
Nanakawa

⚠️
Ed Manlove
Ed Manlove

πŸ“– πŸ›
Brian Tsao
Brian Tsao

πŸ› πŸ““
charis
charis

πŸ’» πŸ›
s-galante
s-galante

πŸ›
Simon Meggle
Simon Meggle

πŸ““ πŸ› ⚠️ πŸ€”
Anna-Gunda
Anna-Gunda

πŸ›
anton264
anton264

πŸ““
emakaay
emakaay

πŸ›
Nea Ohvo
Nea Ohvo

πŸ›
Elout van Leeuwen
Elout van Leeuwen

πŸ“– πŸ€” πŸ’»
LDerikx
LDerikx

πŸ“–
olga-
olga-

πŸ“– πŸ›
Nicholas Bollweg
Nicholas Bollweg

πŸ“–
Ville Salonen
Ville Salonen

πŸ›
Jani Mikkonen
Jani Mikkonen

πŸ› πŸ“–
Aleh Borysiewicz
Aleh Borysiewicz

πŸ›
JΓΌrgen Knauth
JΓΌrgen Knauth

πŸ›
dalaakso
dalaakso

πŸ›
msirkka
msirkka

πŸ€”
Ossi R.
Ossi R.

πŸ’»
Adrian V.
Adrian V.

πŸ’» πŸ› πŸ€”
Sami SallmΓ©n
Sami SallmΓ©n

πŸ› ⚠️
Pekka KlΓ€rck
Pekka KlΓ€rck

πŸ’» πŸ›
Jani PalsamΓ€ki
Jani PalsamΓ€ki

πŸ›
AllanMedeiros
AllanMedeiros

πŸ›
Emmanuel Alap
Emmanuel Alap

πŸ› πŸ’»
ankurbhalla-gmail
ankurbhalla-gmail

πŸ€”
UliSei
UliSei

πŸ€” πŸ› πŸ’» πŸ““
Tomasz Pawlak
Tomasz Pawlak

πŸ›
mtoskamp
mtoskamp

πŸ›
zastress
zastress

πŸ›
Juga Paazmaya
Juga Paazmaya

πŸ’»
Raphael Smadja
Raphael Smadja

πŸ€” πŸ’» πŸ›
Antti Pakkanen
Antti Pakkanen

πŸ›
Luis A Gomez-Tinoco
Luis A Gomez-Tinoco

πŸ› πŸ’‘ πŸ’»
ePlanLori
ePlanLori

πŸ›
laguna357
laguna357

πŸ›
Gavin Rodgers
Gavin Rodgers

πŸ›
pokaalinkanssayohon
pokaalinkanssayohon

πŸ€”
Ryan Sandbach
Ryan Sandbach

πŸ› πŸ’»
Niko Kahilainen
Niko Kahilainen

πŸ›
Guillaume Gautier
Guillaume Gautier

πŸ“–
Robin Matz
Robin Matz

πŸ€”
Stavros Ntentos
Stavros Ntentos

πŸ“–
Massukio
Massukio

πŸ› πŸ€”
Atihinen
Atihinen

πŸ›
gvrkumar
gvrkumar

πŸ€”
Lauri Helkkula
Lauri Helkkula

πŸ›
rlall07
rlall07

πŸ› πŸ€”
Eldad Uzman
Eldad Uzman

πŸ€”
mgarcibu
mgarcibu

πŸ›
DominikG
DominikG

πŸ€”
jokinr
jokinr

⚠️ πŸ›
Jier Chen
Jier Chen

πŸ’»
IDvoe
IDvoe

πŸ›
Cosmin Poieana
Cosmin Poieana

πŸ›
Shenthil
Shenthil

πŸ›
Marduk BolaΓ±os
Marduk BolaΓ±os

πŸ› πŸ€”
amodzelewski
amodzelewski

πŸ›
TimDicos
TimDicos

πŸ›
vinismarques
vinismarques

πŸ›
nizwiz
nizwiz

πŸ›
Reddriver
Reddriver

πŸ€”
Seppo
Seppo

πŸ›
rousku
rousku

πŸ›
tomaspekarovic
tomaspekarovic

πŸ€”
Robin Mackaij
Robin Mackaij

πŸ›
nixuewei
nixuewei

πŸ€”
Slava
Slava

πŸ€” πŸ› πŸ’»
Kari Harju
Kari Harju

πŸ›
you
you

πŸ›
axiom41
axiom41

πŸ›
amankul
amankul

πŸ›
jcb-entrnce
jcb-entrnce

πŸ›
Remppa
Remppa

πŸ›
Tomasz Pawlak
Tomasz Pawlak

πŸ›
Timo Stordell
Timo Stordell

πŸ›
Marcin Gmurczyk
Marcin Gmurczyk

πŸ’»
Daniel Biehl
Daniel Biehl

πŸ› πŸ€”
rarajabs
rarajabs

πŸ›
Sandeep Vaidya
Sandeep Vaidya

πŸ€”
falk
falk

πŸ“–
ciadoh
ciadoh

πŸ›
Johan van Iperen
Johan van Iperen

πŸ’»
Fabio Zadrozny
Fabio Zadrozny

πŸ›
BCGST
BCGST

πŸ“–
Wilfried van Asten
Wilfried van Asten

πŸ› πŸ’»
Mikal H Henriksen
Mikal H Henriksen

πŸ›
alexinoDr
alexinoDr

πŸ›
trybuskrzysztof
trybuskrzysztof

πŸ›
Aino1980
Aino1980

πŸ›
BjornAhmark
BjornAhmark

πŸ›
Mezohren
Mezohren

πŸ›
Zoupers Zou
Zoupers Zou

πŸ€”
lasselindqvist
lasselindqvist

πŸ›
David Nieto Sanz
David Nieto Sanz

πŸ›
Gil Forcada Codinachs
Gil Forcada Codinachs

πŸ“– πŸ›
Nathan Hannig
Nathan Hannig

πŸ›
Martin Kjellstrand
Martin Kjellstrand

πŸ›
Anton Medvedev
Anton Medvedev

πŸ’»
martamedovova-ext91522
martamedovova-ext91522

πŸ› πŸ€”
Dr. Dirk Richter
Dr. Dirk Richter

πŸ€”
RatexMak
RatexMak

πŸ€”
horzuff
horzuff

πŸ’»
naibra
naibra

πŸ›
Antti Pekka Vilkko
Antti Pekka Vilkko

πŸ›
SerafΓ­n MartΓ­n
SerafΓ­n MartΓ­n

πŸ›
JoostW21111
JoostW21111

πŸ›
Camatius
Camatius

πŸ›
terckert
terckert

πŸ›
Maksim Bondarew
Maksim Bondarew

πŸ›
HenrikSchuette
HenrikSchuette

πŸ›
Gurunatharudh Bhandarkavathe(Infosys)
Gurunatharudh Bhandarkavathe(Infosys)

πŸ›
alpip1997
alpip1997

πŸ›
terolindfors
terolindfors

πŸ›
Thisara Wijesundera
Thisara Wijesundera

πŸ€”
masudparvez
masudparvez

πŸ€”
gitkatsi
gitkatsi

πŸ› πŸ’»
Many Kasiriha
Many Kasiriha

πŸ›
Thulasi Raju
Thulasi Raju

πŸ“–
Giancarlo Soverini
Giancarlo Soverini

πŸ€”
lennartq
lennartq

πŸ’»
Lukas Boekenoogen
Lukas Boekenoogen

πŸ“–
anacomparada
anacomparada

πŸ› πŸ“–
siongwai
siongwai

πŸ€”
nfaustin
nfaustin

πŸ›
Guido Schmitz
Guido Schmitz

πŸ’»
Chris Nesbitt-Smith
Chris Nesbitt-Smith

πŸ’»
vmmattila
vmmattila

πŸ›
Andre-A-AtGithub
Andre-A-AtGithub

πŸ›
PaweΕ‚
PaweΕ‚

πŸ›
Raphael CAMUS
Raphael CAMUS

πŸ›
Markus
Markus

πŸ€”
wojtekwp
wojtekwp

πŸ›
Rudolf
Rudolf

πŸ› πŸ€”
Henrique Branco
Henrique Branco

πŸ›
mika-b
mika-b

πŸ›
okraus-ari
okraus-ari

πŸ’»