Selene เป็นห้องสมุดที่กระชับและทรงพลังสำหรับการเขียนการทดสอบ UI ของเบราว์เซอร์ใน Python มันถูกสร้างขึ้นเป็นพอร์ต Pythonic ของโครงการ Selenide ยอดนิยมจาก Java World Selene ช่วยให้นักพัฒนาซอฟต์แวร์เขียนการทดสอบที่อ่านได้และสามารถบำรุงรักษาได้ว่า "พูด" เป็นภาษาอังกฤษทั่วไปทำให้ง่ายต่อการเข้าใจและแบ่งปันข้ามทีม
ความแข็งแกร่งหลักของ Selene คือ API ที่เน้นผู้ใช้ซึ่งเป็นนามธรรมของความซับซ้อนของการทำงานกับ Selenium WebDriver การทดสอบสามารถเขียนได้โดยใช้ไวยากรณ์ที่เรียบง่ายและแสดงออกเช่นคุณลักษณะเช่นองค์ประกอบที่ขี้เกียจที่ได้รับการประเมินโดยอัตโนมัติกลไกการลองใหม่โดยอัตโนมัติเพื่อรอการโหลดเหมือน Ajax ด้วยการสนับสนุน PageObject ในตัวช่วยให้สามารถใช้องค์ประกอบเว็บได้ผ่านวิดเจ็ต
By.* locator-like tuple ซึ่งช่วยให้สามารถสร้างองค์ประกอบที่นำกลับมาใช้ใหม่ได้สำหรับส่วนประกอบที่แตกต่างกัน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.* ไวยากรณ์ตัวอย่างของการ refactoring ที่มีศักยภาพในระหว่างการย้ายถิ่น:
(text('foo')) ถึง (have.text('foo'))(visible) ถึง (be.visible).should(x, timeout=y) ถึง .with_(timeout=y).should(x).should_not(be.*) ถึง .should(be.not_.*) หรือ .should(be.*.not_).should_not(have.*) ถึง .should(have.no.*) หรือ .should(have.*.not_).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ทำการค้นหา Google อย่างง่ายโดยอัตโนมัติโดยใช้ 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 จัดเตรียม API ที่ใช้งานง่ายสำหรับการโต้ตอบกับองค์ประกอบเว็บโดยใช้โมดูลเช่น be have by
องค์ประกอบที่ขี้เกียจและไดนามิก: องค์ประกอบ 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 ()การเลือกตัวระบุตำแหน่งองค์ประกอบที่ถูกต้องเป็นสิ่งสำคัญสำหรับการทดสอบที่เชื่อถือได้ นี่คือเคล็ดลับบางอย่าง:
ตรวจสอบองค์ประกอบ: คลิกขวาที่องค์ประกอบเว็บและเลือกตรวจสอบเพื่อดู HTML ในเครื่องมือนักพัฒนาของเบราว์เซอร์
ใช้แอตทริบิวต์ที่ไม่ซ้ำกัน: ค้นหาแอตทริบิวต์ที่ไม่ซ้ำกันเช่น ID ชื่อหรือแอตทริบิวต์ที่กำหนดเองเพื่อใช้ในตัวเลือกของคุณ แนวปฏิบัติที่ดีที่สุดคือการเจรจากับนักพัฒนาซอฟต์แวร์เกี่ยวกับการใช้ data-* คุณลักษณะเฉพาะสำหรับการทดสอบความต้องการเช่น data-test-id
สร้างตัวเลือก CSS หรือ XPATH: สร้างตัวเลือกที่ระบุองค์ประกอบที่ไม่ซ้ำกัน ตัวอย่างเช่นการใช้ CSS-SELECTORS CSSSING #elementId , .className หรือ [name="q"] หรือใช้ XPATH สำหรับสิ่งที่ CSS ไม่สามารถจัดการได้: //*[text()="Submit"]/.. Selene จะตรวจจับโดยอัตโนมัติว่าคุณให้ตัวเลือก CSS หรือ XPath
ใช้ประโยชน์จากผู้ช่วยตัวเลือกของ Selene (เป็นทางเลือก): หากคุณต้องการรหัสที่มนุษย์อ่านได้ส่วนใหญ่คุณสามารถใช้ by.name('q') , by.text('Submit') และอื่น ๆ by.* ผู้ช่วย ขอให้สังเกตว่ามีคนชอบตัวเลือก CSS ดิบเช่น [name=q] มากกว่า 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 สำหรับองค์ประกอบทั้งหมดที่ต้องครอบคลุมในการทดสอบและมีการประชุมการตั้งชื่อตามมา ด้วย browser.config.selector_to_by_strategy ของ Selene.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() ดูวิธีการทำให้การค้นหาง่ายขึ้นด้วยรหัสทดสอบ? คำแนะนำสำหรับรายละเอียดเพิ่มเติม
❗คุณสมบัตินี้จะพร้อมใช้งานในรุ่นถัดไปของ 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! นี่คือวิธีที่คุณสามารถมีส่วนร่วม:
สำหรับรายละเอียดเพิ่มเติมโปรดดูคู่มือการบริจาคของเรา
ดูการเปลี่ยนแปลงสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการอัปเดตล่าสุด