Selene est une bibliothèque concise et puissante pour écrire des tests d'interface utilisateur de navigateur dans Python. Il a été construit comme un port pythonique du projet de séléniure populaire du monde Java. Selene aide les développeurs à écrire des tests lisibles et maintenables qui "parlent" en anglais commun, ce qui les rend plus faciles à comprendre et à partager entre les équipes.
La force centrale de Sélène est son API orientée utilisateur, ce qui résume la complexité de travailler avec Selenium WebDriver. Les tests peuvent être écrits en utilisant des fonctionnalités de syntaxe et de support expressives simples telles que des éléments évalués paresseux, des mécanismes de réessayer automatiquement pour une attente implicite plus intelligente pour le chargement de type Ajax. Avec la prise en charge de PageObject intégrée, il permet la réutilisabilité des éléments Web via des widgets.
By.* Locateurs de type tuple, permettant également de créer des éléments réutilisables pour différents composants.ActionChains .Selene prend actuellement en charge deux versions majeures:
Dernière version pré-libérée recommandée (v2.0.0rc9) :
3.8+>=4.12.0Version stable (v1.0.2) :
2.7, 3.5, 3.6, 3.7<4.0.0Pour la migration de v1.x à v2.x, suivez le guide de migration.
De 1.0.2 à 2.0.0rc<LATEST> :
2.0.0rc<LATEST>collection.first() de .first() à .firsttext('foo') utilisent le be.* Ou have.* SyntaxeExemples de refactorisation potentielle pendant la migration:
(text('foo')) à (have.text('foo'))(visible) à (be.visible).should(x, timeout=y) to .with_(timeout=y).should(x).should_not(be.*) to .should(be.not_.*) ou .should(be.*.not_).should_not(have.*) to .should(have.no.*) ou .should(have.*.not_).should_each(condition) à .should(condition.each)from selene import be, have Python 3.8+ est requis.
Étant donné que PYENV est installé, l'installation de la version nécessaire de Python est simple:
$ pyenv install 3.8.13
$ pyenv global 3.8.13
$ python -V
Python 3.8.13Assurez-vous que la poésie et le pyenv sont installés, puis:
poetry new my-tests-with-selene
cd my-tests-with-selene
pyenv local 3.8.13
poetry add selene --allow-prereleases # for pre-release version
poetry installPour la version pré-libération (recommandée pour les nouveaux projets):
pip install selene --prePour la dernière version stable:
pip install seleneSi vous préférez installer Sélène directement à partir du code source:
git clone https://github.com/yashaka/selene.git
cd selene
python setup.py installOu en utilisant la poésie:
poetry add git+https://github.com/yashaka/selene.gitOu en utilisant PIP:
pip install git+https://github.com/yashaka/selene.gitAutomatiser une simple recherche Google à l'aide de Selene:
from selene import browser , be , have
browser . open ( 'https://google.com/ncr' )
browser . element ( '[name=q]' ). should ( be . blank )
. type ( 'selenium' ). press_enter ()
browser . all ( '#rso>div' ). should ( have . size_greater_than ( 5 ))
. first . should ( have . text ( 'Selenium automates browsers' ))
# not mandatory, because will be closed automatically:
# browser.quit() Selene fournit une API intuitive pour interagir avec les éléments Web à l'aide de modules comme be , have ou by .
Éléments paresseux et dynamiques: les éléments de selene sont paresseux et dynamiques, ce qui signifie qu'ils sont situés à chaque fois qu'une action est effectuée. Cela garantit l'interaction avec l'élément le plus à jour.
Voici une interaction d'élément de base:
from selene import browser , by , be
# because elements are "lazy",
# you can store them in variable:
search_box = browser . element ( by . name ( 'q' ))
# – even before the actual page will be loaded:
browser . open ( 'https://google.com/ncr' )
search_box . should ( be . blank ). type ( 'Selenium' ). press_enter ()Le choix des localisateurs d'éléments corrects est crucial pour les tests fiables. Voici quelques conseils:
Inspectez l'élément: cliquez avec le bouton droit sur l'élément Web et sélectionnez Inspecter pour afficher son HTML dans les outils de développeur du navigateur.
Utilisez des attributs uniques: recherchez des attributs uniques comme l'ID, le nom ou les attributs personnalisés à utiliser dans vos sélecteurs. La meilleure pratique consiste à négocier avec les développeurs sur l'utilisation d'attributs data-* uniques spécifiquement pour les besoins de test, comme data-test-id .
Construire des sélecteurs CSS ou XPATH: construire des sélecteurs qui identifient uniquement les éléments. Par exemple, en utilisant Conmiser CSS-Selectors #elementId , .className ou [name="q"] , ou en utilisant XPath pour des choses que CSS ne peut pas gérer: //*[text()="Submit"]/.. Selene détectera automatiquement si vous fournissez un sélecteur CSS ou XPATH.
Utilisez les assistants sélecteurs de Sélène (facultatif): si vous avez besoin de la plupart des code lisibles par l'homme, vous pouvez utiliser by.name('q') , by.text('Submit') et autres by.* Aiders. Remarquez que quelqu'un préférerait le sélecteur CSS brut comme [name=q] by.name('q') à des fins de principe de baiser.
Décomposer de longs sélecteurs en parties plus petites pour une meilleure lisibilité et maintenabilité: Si pour trouver un élément, vous avez un sélecteur complexe comme dans: browser.element('//*[@role="row" and contains(.,"Jon")]//*[@data-field="select-row"]') browser.all('[role=row]').element_by(have.text('Jon')).element('[data-field=select-row]') facilitera la compréhension et la maintenance, car si quelque chose change dans la structure de la page, et votre test échoue, vous verrez exactement où il échoue parmi les "parties décomposées" Les besoins suivants doivent revérifier chaque raison potentielle de défaillance.
Créez une stratégie de sélecteur personnalisée (facultatif): Imaginez que vos développeurs de frontend suivent les meilleures pratiques et utilisez des attributs data-test-id pour tous les éléments qui doivent être couverts dans les tests, et il existe une convention de dénomination suivie pour que un tel élément soit Snake_Case_OR-Kebab-Case-Words. Avec l'option browser.config.selector_to_by_strategy de Selene, vous pouvez définir une stratégie de sélecteur personnalisée pour détecter automatiquement tous ces "snake_kebab-words" passés en tant que sélecteurs et les transformer en localisateurs [data-test-id="snake_kebab-words"] . Alors un exemple comme browser.all('[data-testid=result]').first.element('[data-testid=result-title-a]').click() peut être simplifié à browser.all('result').first.element('result-title-a').click() . Voyez comment simplifier la recherche par les identifiants de test? Guide pour plus de détails.
Cette fonctionnalité sera disponible dans la prochaine version de Selene.
Selene peut gérer automatiquement le pilote de navigateur pour vous, mais vous pouvez le personnaliser si nécessaire.
from selene import browser
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' ) from selenium import webdriver
from selene import browser
options = webdriver . ChromeOptions ()
options . add_argument ( '--headless' )
# Add other options as needed
# Selene will automatically detect the browser type (Chrome, Firefox, etc.)
# based on the options passed
browser . config . driver_options = options
browser . config . driver_remote_url = 'http://localhost:4444/wd/hub'
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' ) from selenium import webdriver
from selene import browser
options = webdriver . ChromeOptions ()
options . add_argument ( '--headless' )
# Add other options as needed
browser . config . driver = webdriver . Remote (
command_executor = 'http://localhost:4444/wd/hub' ,
options = options
)
browser . config . base_url = 'https://google.com'
browser . config . timeout = 2
browser . open ( '/ncr' )Utilisez des sélecteurs lisibles et stables: Visez les sélecteurs uniques, expressifs et minimalement couplés à la structure DOM pour rendre vos tests plus maintenables.
Encapsulez les composants réutilisables: utilisez le modèle d'objet Page pour encapsuler les éléments et les actions, promouvant la réutilisation du code.
Levier d'attente intégrée: Selene attend automatiquement que les éléments soient dans l'état souhaité, réduisant le besoin d'attentions explicites.
Explorez l'API: Plongez dans le code source ou la documentation de Selene pour mieux comprendre les méthodes et configurations disponibles.
Nous accueillons les contributions à Selene! Voici comment vous pouvez vous impliquer:
Pour plus de détails, reportez-vous à notre guide de contribution.
Voir le Changelog pour plus de détails sur les mises à jour récentes.