Selene是在Python编写浏览器UI测试的简洁库。它是在Java World的流行硒化项目中建造的。 Selene帮助开发人员编写可读和可维护的测试,这些测试以通用英语“说话”,使它们更易于理解和跨团队共享。
Selene的核心强度是其面向用户的API,它抽象了与Selenium Webdriver合作的复杂性。可以使用简单的,表达的语法和支持功能(例如懒惰的元素)编写测试,自动重试机制,用于智能隐式等待ajax样负载。借助内置的PageObject支持,它可以通过小部件可以重复使用Web元素。
By.*类似元组的定位器上构成元素,还允许为不同组件创建可重复使用的元素。ActionChains编写自定义命令的需求。Selene目前支持两个主要版本:
最新推荐的预发行版本(v2.0.0rc9) :
3.8+>=4.12.0稳定版本(v1.0.2) :
2.7, 3.5, 3.6, 3.7<4.0.0对于从v1.x到v2.x的迁移,请遵循迁移指南。
从1.0.2到2.0.0rc<LATEST> :
2.0.0rc<LATEST>collection.first() .first()方法到.firsttext('foo')之类的所有条件使用be.*或have.*语法迁移过程中潜在重构的例子:
(text('foo'))至(have.text('foo'))(visible)到(be.visible).should(x, timeout=y) .with_(timeout=y).should(x).should_not(be.*) .should(be.not_.*) )to .should(be.*.not_).should(have.*.not_) .should_not(have.*) .should(have.no.*).should_each(condition)至.should(condition.each)from selene import be, have 需要Python 3.8+。
给定Pyenv安装了,安装所需版本的Python很简单:
$ pyenv install 3.8.13
$ pyenv global 3.8.13
$ python -V
Python 3.8.13然后确保安装诗歌和Pyenv,然后:
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 install对于预发行版本(推荐用于新项目):
pip install selene --pre对于最新稳定版本:
pip install selene如果您希望直接从源代码安装Selene:
git clone https://github.com/yashaka/selene.git
cd selene
python setup.py install或使用诗歌:
poetry add git+https://github.com/yashaka/selene.git或使用PIP:
pip install git+https://github.com/yashaka/selene.git使用Selene自动化一个简单的Google搜索:
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提供了一种直观的API,用于使用be , have或by模块与Web元素进行交互。
懒惰而动态的元素:Selene元素是懒惰而动态的,这意味着每次执行动作时它们都位于它们。这样可以确保与最新元素的互动。
这是一个基本元素交互:
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 ()选择正确的元素定位器对于可靠的测试至关重要。这里有一些提示:
检查元素:右键单击Web元素,然后选择“检查”以在浏览器的开发人员工具中查看其HTML。
使用唯一的属性:查找在选择器中使用的唯一属性,例如ID,名称或自定义属性。最佳实践是与开发人员谈判使用独特的data-*属性专门用于测试需求,例如data-test-id 。
构造CSS或XPATH选择器:构建独特识别元素的选择器。例如,使用Conciser css-selector #elementId , .className或[name="q"] ,或使用XPath用于CSS无法处理的内容: //*[text()="Submit"]/.. Selene将自动检测您是提供CSS还是XPath选择器。
利用Selene的选择器帮助器(可选):如果您需要大多数人类可读代码,则可以使用by.name('q') , by.text('Submit')和其他by.* helpers。请注意,出于亲吻原则的目的,某人会喜欢[name=q]而不是[name = by.name('q') 。
将长选择器分解为较小的零件,以提高可读性和可维护性:如果找到一个元素,则具有复杂的选择器,例如: 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]')以下需要仔细检查每个潜在的故障原因。
创建自定义选择器策略(可选):想象一下您的前端开发人员遵循最佳实践,并对所有需要在测试中覆盖的元素使用data-test-id属性,并且有一个命名约定,以使此类元素成为Snake_case_case_or-kebab-case-case-words。借助Selene的browser.config.selector_to_by_strategy选项,您可以定义自定义选择器策略,以自动检测所有此类"snake_kebab-words"作为选择器传递的所有[data-test-id="snake_kebab-words"]然后像browser.all('[data-testid=result]').first.element('[data-testid=result-title-a]').click()可以简化为browser.all('result').first.element('result-title-a').click()查看如何通过测试ID简化搜索?指南以获取更多详细信息。
this功能将在Selene的下一个版本中提供。️
Selene可以自动为您管理浏览器驱动程序,但是您可以在需要时自定义。
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' )使用可读且稳定的选择器:针对独特,表现力且最小与DOM结构的选择器的目标,以使您的测试更加可维护。
封装可重复使用的组件:利用页面对象模型封装元素和操作,促进代码重复使用。
杠杆内置等待: Selene会自动等待元素处于所需状态,从而减少了明确等待的需求。
探索API:潜入Selene的源代码或文档,以更好地了解可用的方法和配置。
我们欢迎对Selene的贡献!这是您可以参与的方式:
有关更多详细信息,请参阅我们的贡献指南。
有关最近更新的更多详细信息,请参见ChangElog。