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') 。
Break down long selectors into smaller parts for better readability and maintainability: If to find an element you have a complex selector like in: browser.element('//*[@role="row" and contains(.,"Jon")]//*[@data-field="select-row"]') , decomposing it utilizing Selene's filtering collections API to 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。