Selene es una biblioteca concisa y poderosa para escribir pruebas de interfaz de usuario del navegador en Python. Fue construido como un puerto pitónico del popular proyecto Selenide del mundo de Java. Selene ayuda a los desarrolladores a escribir pruebas legibles y mantenibles que "hablan" en inglés común, haciéndolos más fáciles de entender y compartir en todos los equipos.
La fuerza central de Selene es su API orientada a los usuarios, que abstrae la complejidad de trabajar con Selenium WebDriver. Las pruebas se pueden escribir utilizando una sintaxis simple y expresiva y características de soporte como elementos de evaluación perezosa, mecanismos de reintento automático para una espera implícita más inteligente de carga similar a AJAX. Con soporte de PageObject incorporado, permite la reutilización de los elementos web a través de widgets.
By.* Locadores tipo tupla, lo que permite crear elementos reutilizables para diferentes componentes.ActionChains .Selene actualmente admite dos versiones principales:
Última versión recomendada de prelanzamiento (v2.0.0rc9) :
3.8+>=4.12.0Versión estable (v1.0.2) :
2.7, 3.5, 3.6, 3.7<4.0.0Para la migración de v1.x a v2.x, siga la guía de migración.
De 1.0.2 a 2.0.0rc<LATEST> :
2.0.0rc<LATEST>collection.first() de .first() a .firsttext('foo') usen el be.* O have.* SintaxisEjemplos de refactorización potencial durante la migración:
(text('foo')) a (have.text('foo'))(visible) para (be.visible).should(x, timeout=y) a .with_(timeout=y).should(x).should_not(be.*) para .should(be.not_.*) o .should(be.*.not_).should_not(have.*) para .should(have.no.*) o .should(have.*.not_).should_each(condition) para .should(condition.each)from selene import be, have Se requiere Python 3.8+.
Dado que se instala pyenv, instalar la versión necesaria de Python es simple:
$ pyenv install 3.8.13
$ pyenv global 3.8.13
$ python -V
Python 3.8.13Asegúrese de que se instalen poesía y pyenv, luego:
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 installPara la versión previa a la liberación (recomendado para nuevos proyectos):
pip install selene --prePara la última versión estable:
pip install seleneSi prefiere instalar Selene directamente desde el código fuente:
git clone https://github.com/yashaka/selene.git
cd selene
python setup.py installO usar poesía:
poetry add git+https://github.com/yashaka/selene.gitO usando PIP:
pip install git+https://github.com/yashaka/selene.gitAutomatice una búsqueda simple de Google usando 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 proporciona una API intuitiva para interactuar con elementos web que usan módulos como be , have o by .
Elementos perezosos y dinámicos: los elementos Selene son perezosos y dinámicos, lo que significa que se encuentran cada vez que se realiza una acción. Esto garantiza la interacción con el elemento más actualizado.
Aquí hay una interacción de elementos básicos:
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 ()Elegir los localizadores de elementos correctos es crucial para pruebas confiables. Aquí hay algunos consejos:
Inspeccione el elemento: haga clic derecho en el elemento web y seleccione Inspeccione para ver su HTML en las herramientas de desarrollador del navegador.
Use atributos únicos: busque atributos únicos como ID, nombre o atributos personalizados para usar en sus selectores. La mejor práctica es negociar con los desarrolladores sobre el uso data-* atributos específicamente para las necesidades de prueba, como data-test-id .
Construya selectores CSS o XPATH: cree selectores que identifiquen de manera única elementos. Por ejemplo, utilizando Conciser CSS-Selectores #elementId , .className o [name="q"] , o usando XPATH para cosas que CSS no puede manejar: //*[text()="Submit"]/.. Selene detectará automáticamente si proporciona un selector CSS o XPath.
Utilice los ayudantes selectores de Selene (opcional): si necesita la mayoría del código legible por humanos, puede usar by.name('q') , by.text('Submit') y otros ayudantes. by.* Observe que alguien preferiría el selector de CSS crudo como [name=q] by.name('q') con el propósito del principio de beso.
Desglose los selectores largos en partes más pequeñas para una mejor legibilidad y capacidad de mantenimiento: si para encontrar un elemento tiene un selector complejo como en: browser.element('//*[@role="row" and contains(.,"Jon")]//*[@data-field="select-row"]') para las colecciones de selene para las colecciones de filtraciones de selene para las colecciones de selene para las colecciones de Selene para las colecciones de filtraciones de Selene para browser.all('[role=row]').element_by(have.text('Jon')).element('[data-field=select-row]') hará que sea más fácil de entender y mantener, porque si algo cambia en la estructura de la página, y su prueba falla, verá exactamente dónde falla entre las "partes descompuestas" del selector, mientras que en el caso de más tiempo, solo verá que solo verá en el que falla el lugar de la mitad de la mitad de la mitad de la mitad de la mitad de la mitad de la mitad de la mitad de la mitad de la selección. Selector con la siguiente necesidad de verificar cada doble razón de falla.
Cree una estrategia selectora personalizada (opcional): imagine que sus desarrolladores frontend siguen las mejores prácticas y usan atributos de data-test-id para todos los elementos que deben cubrirse en las pruebas, y hay una convención de nombres seguida para que dicho elemento sea Snake_Case_or-KeBab-Case-Words. Con la opción de Selene's browser.config.selector_to_by_strategy , puede definir una estrategia selectora personalizada para detectar automáticamente todos los localizadores "snake_kebab-words" pasados como selectores y transformarlos en [data-test-id="snake_kebab-words"] . Luego, un ejemplo como browser.all('[data-testid=result]').first.element('[data-testid=result-title-a]').click() puede simplificarse para browser.all('result').first.element('result-title-a').click() . ¿Vea cómo simplificar la búsqueda por IDS de prueba? Guía para más detalles.
❗ Esta característica estará disponible en el próximo lanzamiento de Selene. fue
Selene puede administrar automáticamente el controlador del navegador para usted, pero puede personalizarlo si es necesario.
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' )Use selectores legibles y estables: apunte a selectores que sean únicos, expresivos y mínimamente junto con la estructura DOM para que sus pruebas sean más mantenibles.
Componentes reutilizables de encapsulación: utilice el modelo de objeto de página para encapsular elementos y acciones, promoviendo la reutilización del código.
Aproveche la espera incorporada: Selene espera automáticamente a que los elementos estén en el estado deseado, reduciendo la necesidad de esperas explícitas.
Explore la API: sumérjase en el código fuente o documentación de Selene para comprender mejor los métodos y configuraciones disponibles.
¡Agradecemos las contribuciones a Selene! Así es como puedes involucrarte:
Para obtener más detalles, consulte nuestra Guía de contribución.
Vea el ChangeLog para obtener más detalles sobre actualizaciones recientes.