กรอบการทำงานอัตโนมัติของเบราว์เซอร์แบบออลอินวัน:
การรวบรวมข้อมูลเว็บ / การทดสอบ / การขูด / การซ่อนตัว
เริ่ม | - คุณสมบัติ | ️ ตัวเลือก | ตัวอย่าง | - สคริปต์ | มือถือ
API | - รูปแบบ | - เครื่องบันทึก | แดชบอร์ด | - สถานที่ | ฟาร์ม
️ GUI | - หน้าทดสอบ | - โหมด UC | - โหมด CDP | - แผนภูมิ | กริด
️อย่างไร | - โยกย้าย | แผนกรณี | ♻️ เทมเพลต | - ไฮบริด | - ทัวร์
- ซีไอ/ซีดี | ️ JSMgr | - นักแปล | พรีเซนเตอร์ | - กล่องโต้ตอบ | ️ ทัศนวิสัย
SeleniumBase เป็นชุดเครื่องมือระดับมืออาชีพสำหรับกิจกรรมระบบอัตโนมัติของเว็บ สร้างขึ้นเพื่อการทดสอบเว็บไซต์ ข้าม CAPTCHA เพิ่มประสิทธิภาพการทำงาน ทำงานให้เสร็จสิ้น และขยายขนาดธุรกิจของคุณ
เรียนรู้จาก ตัวอย่างมากกว่า 200 รายการ ในโฟลเดอร์ SeleniumBase/examples/
- โปรดทราบว่า โหมด SeleniumBase UC (โหมดซ่อนตัว) มี ReadMe ของตัวเอง
- โปรดทราบว่า โหมด CDP ของ Seleniumbase มี ReadMe แยกต่างหากของตัวเอง
สามารถเรียกสคริปต์ผ่าน python
ได้ แม้ว่ารูปแบบไวยากรณ์บางรูปแบบต้องการ pytest (เฟรมเวิร์กการทดสอบหน่วย Python ที่มาพร้อมกับ SeleniumBase ที่สามารถค้นพบ รวบรวม และรันการทดสอบได้โดยอัตโนมัติ)
- นี่คือ my_first_test.py ซึ่งทดสอบการเข้าสู่ระบบ การช็อปปิ้ง และการชำระเงิน:
pytest my_first_test.py
pytest
ใช้--chrome
เป็นค่าเริ่มต้น เว้นแต่จะตั้งค่าเป็นอย่างอื่น
- นี่คือ test_coffee_cart.py ซึ่งยืนยันไซต์อีคอมเมิร์ซ:
pytest test_coffee_cart.py --demo
(
--demo
โหมดสาธิตทำให้การทดสอบช้าลงและเน้นการดำเนินการ)
- นี่คือ test_demo_site.py ซึ่งครอบคลุมการดำเนินการหลายประการ:
pytest test_demo_site.py
พิมพ์ คลิก เลือก สลับ ลากและวาง และอื่นๆ ได้อย่างง่ายดาย
(สำหรับตัวอย่างเพิ่มเติม โปรดดูโฟลเดอร์ SeleniumBase/examples/)
สำรวจ README:
- เริ่มต้น / การติดตั้ง
- ตัวอย่างพื้นฐาน / การใช้งาน
- วิธีทดสอบทั่วไป
- ข้อมูลน่ารู้ / เรียนรู้เพิ่มเติม
- โหมดสาธิต / การดีบัก
- ตัวเลือกบรรทัดคำสั่ง
- การกำหนดค่าไดเรกทอรี
- แดชบอร์ด SeleniumBase
- การสร้างรายงานการทดสอบ
SeleniumBase เป็นเฟรมเวิร์ก Python สำหรับการทำงานอัตโนมัติและการทดสอบเบราว์เซอร์ SeleniumBase ใช้ Selenium/WebDriver API และรวมเอาตัวดำเนินการทดสอบ เช่น pytest
, pynose
และ behave
เพื่อให้มีโครงสร้างที่เป็นระเบียบ การค้นพบการทดสอบ การดำเนินการทดสอบ สถานะการทดสอบ ( เช่น ผ่าน ล้มเหลว หรือข้าม ) และตัวเลือกบรรทัดคำสั่งสำหรับการเปลี่ยนแปลง การตั้งค่าเริ่มต้น ( เช่น การเลือกเบราว์เซอร์ ) ด้วย Selenium แบบดิบ คุณจะต้องตั้งค่าตัวแยกวิเคราะห์ตัวเลือกของคุณเองสำหรับการกำหนดค่าการทดสอบจากบรรทัดคำสั่ง
ตัวจัดการไดรเวอร์ของ SeleniumBase ช่วยให้คุณควบคุมการดาวน์โหลดไดรเวอร์อัตโนมัติได้มากขึ้น (ใช้ --driver-version=VER
กับคำสั่ง pytest
run เพื่อระบุเวอร์ชัน) ตามค่าเริ่มต้น SeleniumBase จะดาวน์โหลดเวอร์ชันไดรเวอร์ที่ตรงกับเวอร์ชันเบราว์เซอร์หลักของคุณหากไม่ได้ตั้งค่าไว้
SeleniumBase ตรวจพบระหว่างตัวเลือก CSS และ XPath โดยอัตโนมัติ ซึ่งหมายความว่าคุณไม่จำเป็นต้องระบุประเภทของตัวเลือกในคำสั่งของคุณ ( แต่คุณสามารถเลือกได้ )
เมธอด SeleniumBase มักจะดำเนินการหลายอย่างในการเรียกเมธอดเดียว ตัวอย่างเช่น self.type(selector, text)
ทำสิ่งต่อไปนี้:
1. รอให้องค์ประกอบมองเห็นได้
2. รอให้องค์ประกอบโต้ตอบ
3. ล้างช่องข้อความ
4. พิมพ์ข้อความใหม่
5. กด Enter/Submit หากข้อความลงท้ายด้วย "n"
ด้วยซีลีเนียมดิบ การดำเนินการเหล่านั้นจำเป็นต้องมีการเรียกเมธอดหลายวิธี
SeleniumBase ใช้ค่าการหมดเวลาเริ่มต้นเมื่อไม่ได้ตั้งค่า:
✅ self.click("button")
ด้วย Selenium แบบดิบ วิธีการจะล้มเหลวทันที ( โดยค่าเริ่มต้น ) หากองค์ประกอบต้องใช้เวลาโหลดมากขึ้น:
self.driver.find_element(by="css selector", value="button").click()
(รหัสที่เชื่อถือได้ดีกว่ารหัสที่ไม่น่าเชื่อถือ)
SeleniumBase ให้คุณเปลี่ยนค่าการหมดเวลาที่ชัดเจนของวิธีการ:
✅ self.click("button", timeout=10)
ด้วย Selenium แบบดิบซึ่งต้องใช้โค้ดเพิ่มเติม:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable("css selector", "button")).click()
(โค้ดแบบง่ายดีกว่าโค้ดที่ซับซ้อน)
SeleniumBase ช่วยให้คุณล้างเอาต์พุตข้อผิดพลาดเมื่อการทดสอบล้มเหลว ด้วย Selenium แบบดิบ ข้อความแสดงข้อผิดพลาดอาจเลอะเทอะมาก
SeleniumBase ให้ตัวเลือกแก่คุณในการสร้างแดชบอร์ดและรายงานสำหรับการทดสอบ นอกจากนี้ยังบันทึกภาพหน้าจอจากการทดสอบที่ล้มเหลวไปยังโฟลเดอร์ ./latest_logs/
Raw Selenium ไม่มีตัวเลือกเหล่านี้ทันทีที่แกะกล่อง
SeleniumBase มีแอป GUI บนเดสก์ท็อปสำหรับการรันการทดสอบ เช่น SeleniumBase Commander สำหรับ pytest
และ SeleniumBase Behave GUI สำหรับ behave
SeleniumBase มีเครื่องบันทึก / ตัวสร้างการทดสอบของตัวเองสำหรับสร้างการทดสอบจากการดำเนินการของเบราว์เซอร์ด้วยตนเอง
SeleniumBase มาพร้อมกับซอฟต์แวร์การจัดการกรณีทดสอบ ("CasePlans") สำหรับการจัดระเบียบการทดสอบและคำอธิบายขั้นตอน
SeleniumBase มีเครื่องมือสำหรับสร้างแอปข้อมูล ("ChartMaker") ซึ่งสามารถสร้าง JavaScript จาก Python
เรียนรู้เกี่ยวกับวิธีการเขียนแบบทดสอบต่างๆ:
นี่คือ test_simple_login.py ซึ่งใช้การสืบทอดคลาส BaseCase
และรันด้วย pytest หรือ pynose (ใช้ self.driver
เพื่อเข้าถึง driver
Raw ของ Selenium)
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class TestSimpleLogin ( BaseCase ):
def test_simple_login ( self ):
self . open ( "seleniumbase.io/simple/login" )
self . type ( "#username" , "demo_user" )
self . type ( "#password" , "secret_pass" )
self . click ( 'a:contains("Sign in")' )
self . assert_exact_text ( "Welcome!" , "h1" )
self . assert_element ( "img#image1" )
self . highlight ( "#image1" )
self . click_link ( "Sign out" )
self . assert_text ( "signed out" , "#top_message" )
- นี่คือการทดสอบจาก sb_fixture_tests.py ซึ่งใช้ฟิกซ์เจอร์ sb
pytest
ทำงานด้วย pytest (ใช้ sb.driver
เพื่อเข้าถึง driver
Raw ของ Selenium)
def test_sb_fixture_with_no_class ( sb ):
sb . open ( "seleniumbase.io/simple/login" )
sb . type ( "#username" , "demo_user" )
sb . type ( "#password" , "secret_pass" )
sb . click ( 'a:contains("Sign in")' )
sb . assert_exact_text ( "Welcome!" , "h1" )
sb . assert_element ( "img#image1" )
sb . highlight ( "#image1" )
sb . click_link ( "Sign out" )
sb . assert_text ( "signed out" , "#top_message" )
- นี่คือ raw_login_sb.py ซึ่งใช้ SB
Context Manager ทำงานด้วย python
บริสุทธิ์ (ใช้ sb.driver
เพื่อเข้าถึง driver
Raw ของ Selenium)
from seleniumbase import SB
with SB () as sb :
sb . open ( "seleniumbase.io/simple/login" )
sb . type ( "#username" , "demo_user" )
sb . type ( "#password" , "secret_pass" )
sb . click ( 'a:contains("Sign in")' )
sb . assert_exact_text ( "Welcome!" , "h1" )
sb . assert_element ( "img#image1" )
sb . highlight ( "#image1" )
sb . click_link ( "Sign out" )
sb . assert_text ( "signed out" , "#top_message" )
- นี่คือ raw_login_context.py ซึ่งใช้ DriverContext
Manager ทำงานด้วย python
บริสุทธิ์ ( driver
เป็นเวอร์ชันปรับปรุงของ driver
Raw ของ Selenium พร้อมวิธีการเพิ่มเติม)
from seleniumbase import DriverContext
with DriverContext () as driver :
driver . open ( "seleniumbase.io/simple/login" )
driver . type ( "#username" , "demo_user" )
driver . type ( "#password" , "secret_pass" )
driver . click ( 'a:contains("Sign in")' )
driver . assert_exact_text ( "Welcome!" , "h1" )
driver . assert_element ( "img#image1" )
driver . highlight ( "#image1" )
driver . click_link ( "Sign out" )
driver . assert_text ( "signed out" , "#top_message" )
- นี่คือ raw_login_driver.py ซึ่งใช้ Driver
Manager ทำงานด้วย python
บริสุทธิ์ ( driver
เป็นเวอร์ชันปรับปรุงของ driver
Raw ของ Selenium พร้อมวิธีการเพิ่มเติม)
from seleniumbase import Driver
driver = Driver ()
try :
driver . open ( "seleniumbase.io/simple/login" )
driver . type ( "#username" , "demo_user" )
driver . type ( "#password" , "secret_pass" )
driver . click ( 'a:contains("Sign in")' )
driver . assert_exact_text ( "Welcome!" , "h1" )
driver . assert_element ( "img#image1" )
driver . highlight ( "#image1" )
driver . click_link ( "Sign out" )
driver . assert_text ( "signed out" , "#top_message" )
finally :
driver . quit ()
นี่คือ Login_app.feature ซึ่งใช้ไวยากรณ์ behave-BDD Gherkin วิ่งด้วย behave
(เรียนรู้เกี่ยวกับการบูรณาการ SeleniumBase behave-BDD )
Feature : SeleniumBase scenarios for the Simple App
Scenario : Verify the Simple App (Login / Logout)
Given Open "seleniumbase.io/simple/login"
And Type "demo_user" into "#username"
And Type "secret_pass" into "#password"
And Click 'a:contains("Sign in")'
And Assert exact text "Welcome!" in "h1"
And Assert element "img#image1"
And Highlight "#image1"
And Click link "Sign out"
And Assert text "signed out" in "#top_message"
- เพิ่ม Python และ Git ให้กับ System PATH ของคุณ
- แนะนำให้ใช้ Python virtual env
คุณสามารถติดตั้ง seleniumbase
ได้จาก PyPI หรือ GitHub:
- วิธีติดตั้ง seleniumbase
จาก PyPI:
pip install seleniumbase
--upgrade
หรือ -U
เพื่ออัพเกรด SeleniumBase)--force-reinstall
เพื่ออัพเกรดแพ็คเกจทางอ้อม)pip3
หากมี Python หลายเวอร์ชัน) - วิธีติดตั้ง seleniumbase
จากโคลน GitHub:
git clone https://github.com/seleniumbase/SeleniumBase.git
cd SeleniumBase/
pip install -e .
- วิธีอัปเกรดการติดตั้งที่มีอยู่จากโคลน GitHub:
git pull
pip install -e .
- พิมพ์ seleniumbase
หรือ sbase
เพื่อตรวจสอบว่าติดตั้ง SeleniumBase สำเร็จแล้ว:
___ _ _ ___
/ __ | ___ | | ___ _ _ (_)_ _ _ __ | _ ) __ _ ______
_ _ / -_) / -_) ' | | | | ' | _ / _ ` (_- < -_)
| ___/ _ __ | _ _ __ | _ || _ | _ | _ ,_ | _ | _ | _ | ___/ _ _,_/__ | ___ |
----------------------------------------------------
╭──────────────────────────────────────────────────╮
│ * USAGE: " seleniumbase [COMMAND] [PARAMETERS] " │
│ * OR: " sbase [COMMAND] [PARAMETERS] " │
│ │
│ COMMANDS: PARAMETERS / DESCRIPTIONS: │
│ get / install [DRIVER_NAME] [OPTIONS] │
│ methods (List common Python methods) │
│ options (List common pytest options) │
│ behave-options (List common behave options) │
│ gui / commander [OPTIONAL PATH or TEST FILE] │
│ behave-gui (SBase Commander for Behave) │
│ caseplans [OPTIONAL PATH or TEST FILE] │
│ mkdir [DIRECTORY] [OPTIONS] │
│ mkfile [FILE.py] [OPTIONS] │
│ mkrec / codegen [FILE.py] [OPTIONS] │
│ recorder (Open Recorder Desktop App.) │
│ record (If args: mkrec. Else: App.) │
│ mkpres [FILE.py] [LANG] │
│ mkchart [FILE.py] [LANG] │
│ print [FILE] [OPTIONS] │
│ translate [SB_FILE.py] [LANG] [ACTION] │
│ convert [WEBDRIVER_UNITTEST_FILE.py] │
│ extract-objects [SB_FILE.py] │
│ inject-objects [SB_FILE.py] [OPTIONS] │
│ objectify [SB_FILE.py] [OPTIONS] │
│ revert-objects [SB_FILE.py] [OPTIONS] │
│ encrypt / obfuscate │
│ decrypt / unobfuscate │
│ proxy (Start a basic proxy server) │
│ download server (Get Selenium Grid JAR file) │
│ grid-hub [start | stop] [OPTIONS] │
│ grid-node [start | stop] --hub=[HOST/IP] │
│ │
│ * EXAMPLE = > " sbase get chromedriver stable " │
│ * For command info = > " sbase help [COMMAND] " │
│ * For info on all commands = > " sbase --help " │
╰──────────────────────────────────────────────────╯
✅ SeleniumBase จะดาวน์โหลด webdriver อัตโนมัติตามต้องการ เช่น chromedriver
*** chromedriver to download = 121.0.6167.85 (Latest Stable)
Downloading chromedriver-mac-arm64.zip from:
https://storage.googleapis.com/chrome-for-testing-public/121.0.6167.85/mac-arm64/chromedriver-mac-arm64.zip ...
Download Complete !
Extracting [ ' chromedriver ' ] from chromedriver-mac-arm64.zip ...
Unzip Complete !
The file [chromedriver] was saved to:
/Users/michael/github/SeleniumBase/seleniumbase/drivers/chromedriver
Making [chromedriver 121.0.6167.85] executable ...
[chromedriver 121.0.6167.85] is now ready for use !
- หากคุณได้โคลน SeleniumBase คุณสามารถรันการทดสอบได้จากโฟลเดอร์ examples/
นี่คือ my_first_test.py:
cd examples/
pytest my_first_test.py
นี่คือโค้ดสำหรับ my_first_test.py:
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class MyTestClass ( BaseCase ):
def test_swag_labs ( self ):
self . open ( "https://www.saucedemo.com" )
self . type ( "#user-name" , "standard_user" )
self . type ( "#password" , "secret_sauce n " )
self . assert_element ( "div.inventory_list" )
self . assert_exact_text ( "Products" , "span.title" )
self . click ( 'button[name*="backpack"]' )
self . click ( "#shopping_cart_container a" )
self . assert_exact_text ( "Your Cart" , "span.title" )
self . assert_text ( "Backpack" , "div.cart_item" )
self . click ( "button#checkout" )
self . type ( "#first-name" , "SeleniumBase" )
self . type ( "#last-name" , "Automation" )
self . type ( "#postal-code" , "77123" )
self . click ( "input#continue" )
self . assert_text ( "Checkout: Overview" )
self . assert_text ( "Backpack" , "div.cart_item" )
self . assert_text ( "29.99" , "div.inventory_item_price" )
self . click ( "button#finish" )
self . assert_exact_text ( "Thank you for your order!" , "h2" )
self . assert_element ( 'img[alt="Pony Express"]' )
self . js_click ( "a#logout_sidebar_link" )
self . assert_element ( "div#login_button_container" )
self . open ( url ) # Navigate the browser window to the URL.
self . type ( selector , text ) # Update the field with the text.
self . click ( selector ) # Click the element with the selector.
self . click_link ( link_text ) # Click the link containing text.
self . go_back () # Navigate back to the previous URL.
self . select_option_by_text ( dropdown_selector , option )
self . hover_and_click ( hover_selector , click_selector )
self . drag_and_drop ( drag_selector , drop_selector )
self . get_text ( selector ) # Get the text from the element.
self . get_current_url () # Get the URL of the current page.
self . get_page_source () # Get the HTML of the current page.
self . get_attribute ( selector , attribute ) # Get element attribute.
self . get_title () # Get the title of the current page.
self . switch_to_frame ( frame ) # Switch into the iframe container.
self . switch_to_default_content () # Leave the iframe container.
self . open_new_window () # Open a new window in the same browser.
self . switch_to_window ( window ) # Switch to the browser window.
self . switch_to_default_window () # Switch to the original window.
self . get_new_driver ( OPTIONS ) # Open a new driver with OPTIONS.
self . switch_to_driver ( driver ) # Switch to the browser driver.
self . switch_to_default_driver () # Switch to the original driver.
self . wait_for_element ( selector ) # Wait until element is visible.
self . is_element_visible ( selector ) # Return element visibility.
self . is_text_visible ( text , selector ) # Return text visibility.
self . sleep ( seconds ) # Do nothing for the given amount of time.
self . save_screenshot ( name ) # Save a screenshot in .png format.
self . assert_element ( selector ) # Verify the element is visible.
self . assert_text ( text , selector ) # Verify text in the element.
self . assert_exact_text ( text , selector ) # Verify text is exact.
self . assert_title ( title ) # Verify the title of the web page.
self . assert_downloaded_file ( file ) # Verify file was downloaded.
self . assert_no_404_errors () # Verify there are no broken links.
self . assert_no_js_errors () # Verify there are no JS errors.
- สำหรับรายการวิธี SeleniumBase ทั้งหมด โปรดดูที่: สรุปวิธีการ
✅ SeleniumBase จัดการการกระทำของ WebDriver ทั่วไปโดยอัตโนมัติ เช่น การเปิดเว็บเบราว์เซอร์ก่อนการทดสอบ การบันทึกภาพหน้าจอระหว่างความล้มเหลว และการปิดเว็บเบราว์เซอร์หลังการทดสอบ
✅ SeleniumBase ให้คุณปรับแต่งการทดสอบผ่านตัวเลือกบรรทัดคำสั่ง
✅ SeleniumBase ใช้ไวยากรณ์ง่ายๆ สำหรับคำสั่ง ตัวอย่าง:
self . type ( "input" , "dogs n " ) # (The "n" presses ENTER)
สคริปต์ SeleniumBase ส่วนใหญ่สามารถรันด้วย pytest
, pynose
หรือ pure python
ผู้ทดสอบบางรายไม่สามารถเรียกใช้รูปแบบการทดสอบได้ทั้งหมด ตัวอย่างเช่น การทดสอบที่ใช้ฟิกซ์เจอร์ sb
pytest สามารถรันได้กับ pytest
เท่านั้น (ดูรูปแบบไวยากรณ์) นอกจากนี้ยังมีรูปแบบการทดสอบ Gherkin ที่ทำงานด้วยพฤติกรรม
pytest coffee_cart_tests.py --rs
pytest test_sb_fixture.py --demo
pytest test_suite.py --rs --html=report.html --dashboard
pynose basic_test.py --mobile
pynose test_suite.py --headless --report --show-report
python raw_sb.py
python raw_test_scripts.py
behave realworld.feature
behave calculator.feature -D rs -D dashboard
✅ pytest
รวมถึงการค้นพบการทดสอบอัตโนมัติ หากคุณไม่ได้ระบุไฟล์หรือโฟลเดอร์เฉพาะที่จะรัน pytest
จะค้นหาไดเร็กทอรีย่อยทั้งหมดโดยอัตโนมัติเพื่อให้การทดสอบทำงานตามเกณฑ์ต่อไปนี้:
test_
หรือลงท้ายด้วย _test.py
test_
ด้วยไฟล์ SeleniumBase pytest.ini คุณสามารถแก้ไขการตั้งค่าการค้นพบเริ่มต้นได้ ชื่อคลาส Python สามารถเป็นอะไรก็ได้เพราะ seleniumbase.BaseCase
สืบทอด unittest.TestCase
เพื่อทริกเกอร์การค้นหาอัตโนมัติ
✅ คุณสามารถตรวจสอบก่อนการบินเพื่อดูว่าการทดสอบใดที่ pytest
ค้นพบก่อนการรันจริง:
pytest --co -q
✅ คุณสามารถระบุให้เจาะจงมากขึ้นได้เมื่อเรียก pytest
หรือ pynose
ในไฟล์:
pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
✅ ไม่มีการทดสอบที่ไม่สม่ำเสมออีกต่อไป! วิธีการ SeleniumBase จะรอให้องค์ประกอบของหน้าโหลดเสร็จโดยอัตโนมัติก่อนที่จะโต้ตอบกับองค์ประกอบเหล่านั้น ( ไม่เกินขีดจำกัดการหมดเวลา ) ซึ่งหมายความว่า คุณไม่จำเป็นต้องใช้คำสั่ง Random time.sleep()
ในสคริปต์ของคุณอีกต่อไป
✅ SeleniumBase รองรับเบราว์เซอร์และระบบปฏิบัติการหลักทั้งหมด:
เบราว์เซอร์: Chrome, Edge, Firefox และ Safari
ระบบ: Linux/Ubuntu, macOS และ Windows
✅ SeleniumBase ทำงานบนแพลตฟอร์ม CI/CD ยอดนิยมทั้งหมด:
✅ SeleniumBase ประกอบด้วยโซลูชันไฮบริดแบบอัตโนมัติ/แบบแมนนวลที่เรียกว่า MasterQA เพื่อเร่งการทดสอบแบบแมนนวลด้วยระบบอัตโนมัติ ในขณะที่ผู้ทดสอบแบบแมนนวลจะจัดการการตรวจสอบ
✅ SeleniumBase รองรับการทดสอบขณะออฟไลน์ ( สมมติว่าดาวน์โหลดไดรเวอร์เว็บก่อนหน้านี้เมื่อออนไลน์ )
✅ สำหรับรายการคุณสมบัติ SeleniumBase ทั้งหมด คลิกที่นี่
- โหมดสาธิต ช่วยให้คุณเห็นว่าการทดสอบกำลังทำอะไรอยู่ หากการทดสอบดำเนินไปเร็วเกินไปสำหรับสายตาของคุณ ให้เรียกใช้ใน โหมดสาธิต เพื่อหยุดเบราว์เซอร์ชั่วคราวระหว่างการดำเนินการต่างๆ ไฮไลต์องค์ประกอบของหน้าที่กำลังดำเนินการอยู่ และแสดงการยืนยัน:
pytest my_first_test.py --demo
- time.sleep(seconds)
สามารถใช้เพื่อทำการทดสอบรอที่จุดเฉพาะ:
import time ; time . sleep ( 3 ) # Do nothing for 3 seconds.
- โหมดแก้ไขข้อบกพร่อง พร้อมไลบรารี pdb ในตัวของ Python ช่วยให้คุณแก้ไขข้อบกพร่องในการทดสอบ:
import pdb ; pdb . set_trace ()
import pytest ; pytest . set_trace ()
breakpoint () # Shortcut for "import pdb; pdb.set_trace()"
(คำสั่ง
pdb
:n
,c
,s
,u
,d
=>next
,continue
,step
,up
,down
)
- หากต้องการหยุดการทดสอบที่ทำงานอยู่ชั่วคราวซึ่งส่งข้อยกเว้นหรือข้อผิดพลาด ( และเปิดหน้าต่างเบราว์เซอร์ไว้ในขณะที่ โหมดดีบั๊ก เริ่มต้นในคอนโซล ) ให้เพิ่ม --pdb
เป็นตัวเลือก pytest
:
pytest test_fail.py --pdb
- หากต้องการเริ่มการทดสอบในโหมด Debug ให้เพิ่ม --trace
เป็นตัวเลือก pytest
:
pytest test_coffee_cart.py --trace
✅ นี่คือตัวเลือกบรรทัดคำสั่งที่มีประโยชน์ที่มาพร้อมกับ pytest
:
-v # Verbose mode. Prints the full name of each test and shows more details.
-q # Quiet mode. Print fewer details in the console output when running tests.
-x # Stop running the tests after the first failure is reached.
--html=report.html # Creates a detailed pytest-html report after tests finish.
--co | --collect-only # Show what tests would get run. (Without running them)
--co -q # (Both options together!) - Do a dry run with full test names shown.
-n=NUM # Multithread the tests using that many threads. (Speed up test runs!)
-s # See print statements. (Should be on by default with pytest.ini present.)
--junit-xml=report.xml # Creates a junit-xml report after tests finish.
--pdb # If a test fails, enter Post Mortem Debug Mode. (Don't use with CI!)
--trace # Enter Debug Mode at the beginning of each test. (Don't use with CI!)
-m=MARKER # Run tests with the specified pytest marker.
✅ SeleniumBase มีตัวเลือกบรรทัดคำสั่ง pytest
เพิ่มเติมสำหรับการทดสอบ:
--browser=BROWSER # (The web browser to use. Default: "chrome".)
--chrome # (Shortcut for "--browser=chrome". On by default.)
--edge # (Shortcut for "--browser=edge".)
--firefox # (Shortcut for "--browser=firefox".)
--safari # (Shortcut for "--browser=safari".)
--settings-file=FILE # (Override default SeleniumBase settings.)
--env=ENV # (Set the test env. Access with "self.env" in tests.)
--account=STR # (Set account. Access with "self.account" in tests.)
--data=STRING # (Extra test data. Access with "self.data" in tests.)
--var1=STRING # (Extra test data. Access with "self.var1" in tests.)
--var2=STRING # (Extra test data. Access with "self.var2" in tests.)
--var3=STRING # (Extra test data. Access with "self.var3" in tests.)
--variables=DICT # (Extra test data. Access with "self.variables".)
--user-data-dir=DIR # (Set the Chrome user data directory to use.)
--protocol=PROTOCOL # (The Selenium Grid protocol: http|https.)
--server=SERVER # (The Selenium Grid server/IP used for tests.)
--port=PORT # (The Selenium Grid port used by the test server.)
--cap-file=FILE # (The web browser's desired capabilities to use.)
--cap-string=STRING # (The web browser's desired capabilities to use.)
--proxy=SERVER:PORT # (Connect to a proxy server:port as tests are running)
--proxy=USERNAME:PASSWORD@SERVER:PORT # (Use an authenticated proxy server)
--proxy-bypass-list=STRING # (";"-separated hosts to bypass, Eg "*.foo.com")
--proxy-pac-url=URL # (Connect to a proxy server using a PAC_URL.pac file.)
--proxy-pac-url=USERNAME:PASSWORD@URL # (Authenticated proxy with PAC URL.)
--proxy-driver # (If a driver download is needed, will use: --proxy=PROXY.)
--multi-proxy # (Allow multiple authenticated proxies when multi-threaded.)
--agent=STRING # (Modify the web browser's User-Agent string.)
--mobile # (Use the mobile device emulator while running tests.)
--metrics=STRING # (Set mobile metrics: "CSSWidth,CSSHeight,PixelRatio".)
--chromium-arg= " ARG=N,ARG2 " # (Set Chromium args, ","-separated, no spaces.)
--firefox-arg= " ARG=N,ARG2 " # (Set Firefox args, comma-separated, no spaces.)
--firefox-pref=SET # (Set a Firefox preference:value set, comma-separated.)
--extension-zip=ZIP # (Load a Chrome Extension .zip|.crx, comma-separated.)
--extension-dir=DIR # (Load a Chrome Extension directory, comma-separated.)
--disable-features= " F1,F2 " # (Disable features, comma-separated, no spaces.)
--binary-location=PATH # (Set path of the Chromium browser binary to use.)
--driver-version=VER # (Set the chromedriver or uc_driver version to use.)
--sjw # (Skip JS Waits for readyState to be "complete" or Angular to load.)
--wfa # (Wait for AngularJS to be done loading after specific web actions.)
--pls=PLS # (Set pageLoadStrategy on Chrome: "normal", "eager", or "none".)
--headless # (The default headless mode. Linux uses this mode by default.)
--headless1 # (Use Chrome's old headless mode. Fast, but has limitations.)
--headless2 # (Use Chrome's new headless mode, which supports extensions.)
--headed # (Run tests in headed/GUI mode on Linux OS, where not default.)
--xvfb # (Run tests using the Xvfb virtual display server on Linux OS.)
--xvfb-metrics=STRING # (Set Xvfb display size on Linux: "Width,Height".)
--locale=LOCALE_CODE # (Set the Language Locale Code for the web browser.)
--interval=SECONDS # (The autoplay interval for presentations & tour steps)
--start-page=URL # (The starting URL for the web browser when tests begin.)
--archive-logs # (Archive existing log files instead of deleting them.)
--archive-downloads # (Archive old downloads instead of deleting them.)
--time-limit=SECONDS # (Safely fail any test that exceeds the time limit.)
--slow # (Slow down the automation. Faster than using Demo Mode.)
--demo # (Slow down and visually see test actions as they occur.)
--demo-sleep=SECONDS # (Set the wait time after Slow & Demo Mode actions.)
--highlights=NUM # (Number of highlight animations for Demo Mode actions.)
--message-duration=SECONDS # (The time length for Messenger alerts.)
--check-js # (Check for JavaScript errors after page loads.)
--ad-block # (Block some types of display ads from loading.)
--host-resolver-rules=RULES # (Set host-resolver-rules, comma-separated.)
--block-images # (Block images from loading during tests.)
--do-not-track # (Indicate to websites that you don't want to be tracked.)
--verify-delay=SECONDS # (The delay before MasterQA verification checks.)
--ee | --esc-end # (Lets the user end the current test via the ESC key.)
--recorder # (Enables the Recorder for turning browser actions into code.)
--rec-behave # (Same as Recorder Mode, but also generates behave-gherkin.)
--rec-sleep # (If the Recorder is enabled, also records self.sleep calls.)
--rec-print # (If the Recorder is enabled, prints output after tests end.)
--disable-cookies # (Disable Cookies on websites. Pages might break!)
--disable-js # (Disable JavaScript on websites. Pages might break!)
--disable-csp # (Disable the Content Security Policy of websites.)
--disable-ws # (Disable Web Security on Chromium-based browsers.)
--enable-ws # (Enable Web Security on Chromium-based browsers.)
--enable-sync # (Enable "Chrome Sync" on websites.)
--uc | --undetected # (Use undetected-chromedriver to evade bot-detection.)
--uc-cdp-events # (Capture CDP events when running in "--undetected" mode.)
--log-cdp # ("goog:loggingPrefs", {"performance": "ALL", "browser": "ALL"})
--remote-debug # (Sync to Chrome Remote Debugger chrome://inspect/#devices)
--ftrace | --final-trace # (Debug Mode after each test. Don't use with CI!)
--dashboard # (Enable the SeleniumBase Dashboard. Saved at: dashboard.html)
--dash-title=STRING # (Set the title shown for the generated dashboard.)
--enable-3d-apis # (Enables WebGL and 3D APIs.)
--swiftshader # (Chrome "--use-gl=angle" / "--use-angle=swiftshader-webgl")
--incognito # (Enable Chrome's Incognito mode.)
--guest # (Enable Chrome's Guest mode.)
--dark # (Enable Chrome's Dark mode.)
--devtools # (Open Chrome's DevTools when the browser opens.)
--rs | --reuse-session # (Reuse browser session for all tests.)
--rcs | --reuse-class-session # (Reuse session for tests in class.)
--crumbs # (Delete all cookies between tests reusing a session.)
--disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
--window-position=X,Y # (Set the browser's starting window position.)
--window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
--maximize # (Start tests with the browser window maximized.)
--screenshot # (Save a screenshot at the end of each test.)
--no-screenshot # (No screenshots saved unless tests directly ask it.)
--visual-baseline # (Set the visual baseline for Visual/Layout tests.)
--wire # (Use selenium-wire's webdriver for replacing selenium webdriver.)
--external-pdf # (Set Chromium "plugins.always_open_pdf_externally":True.)
--timeout-multiplier=MULTIPLIER # (Multiplies the default timeout values.)
--list-fail-page # (After each failing test, list the URL of the failure.)
(ดูรายการคำจำกัดความของตัวเลือกบรรทัดคำสั่งทั้งหมด ได้ที่นี่ สำหรับตัวอย่างโดยละเอียดของตัวเลือกบรรทัดคำสั่ง โปรดดูที่ customizing_test_runs.md )
- ในระหว่างการทดสอบล้มเหลว บันทึกและภาพหน้าจอจากการทดสอบครั้งล่าสุดจะถูกบันทึกไว้ในโฟลเดอร์ latest_logs/
บันทึกเหล่านั้นจะถูกย้ายไปยัง archived_logs/
หากคุณเพิ่ม --archive_logs ลงในตัวเลือกบรรทัดคำสั่ง หรือตั้งค่า ARCHIVE_EXISTING_LOGS
เป็น True ใน settings.py ไม่เช่นนั้น ไฟล์บันทึกจะถูกล้างเมื่อเริ่มการทดสอบครั้งถัดไป คอลเลก test_suite.py
มีการทดสอบที่ล้มเหลวโดยตั้งใจ เพื่อให้คุณสามารถดูวิธีการทำงานของการบันทึกได้
cd examples/
pytest test_suite.py --chrome
pytest test_suite.py --firefox
วิธีง่ายๆ ในการแทนที่ seleniumbase/config/settings.py คือการใช้ไฟล์การตั้งค่าแบบกำหนดเอง ต่อไปนี้คือตัวเลือกบรรทัดคำสั่งที่จะเพิ่มลงในการทดสอบ: (ดูตัวอย่าง/custom_settings.py) --settings_file=custom_settings.py
(การตั้งค่าประกอบด้วยค่าการหมดเวลาเริ่มต้น คีย์การรับรองความถูกต้องแบบสองปัจจัย ข้อมูลรับรอง DB ข้อมูลรับรอง S3 และการตั้งค่าที่สำคัญอื่นๆ ใช้โดยการทดสอบ)
- หากต้องการส่งข้อมูลเพิ่มเติมจากบรรทัดคำสั่งไปยังการทดสอบ ให้เพิ่ม --data="ANY STRING"
ภายในการทดสอบของคุณ คุณสามารถใช้ self.data
เพื่อเข้าถึงสิ่งนั้นได้
- เมื่อรันการทดสอบด้วย pytest
คุณจะต้องการสำเนาของ pytest.ini ในโฟลเดอร์รูทของคุณ เมื่อรันการทดสอบด้วย pynose
คุณจะต้องการสำเนาของ setup.cfg ในโฟลเดอร์รูทของคุณ ไฟล์เหล่านี้ระบุรายละเอียดการกำหนดค่าเริ่มต้นสำหรับการทดสอบ โฟลเดอร์ทดสอบควรมีไฟล์ init .py ว่างด้วย เพื่อให้ไฟล์ทดสอบของคุณสามารถนำเข้าไฟล์อื่นๆ จากโฟลเดอร์นั้นได้
- sbase mkdir DIR
สร้างโฟลเดอร์ที่มีไฟล์ปรับแต่งและการทดสอบตัวอย่าง:
sbase mkdir ui_tests
โฟลเดอร์ใหม่นั้นจะมีไฟล์เหล่านี้:
ui_tests/
├── __init__.py
├── my_first_test.py
├── parameterized_test.py
├── pytest.ini
├── requirements.txt
├── setup.cfg
├── test_demo_site.py
└── boilerplates/
├── __init__.py
├── base_test_case.py
├── boilerplate_test.py
├── classic_obj_test.py
├── page_objects.py
├── sb_fixture_test.py
└── samples/
├── __init__.py
├── google_objects.py
├── google_test.py
├── sb_swag_test.py
└── swag_labs_test.py
ProTip™: คุณสามารถสร้างโฟลเดอร์สำเร็จรูปได้โดยไม่ต้องมีการทดสอบตัวอย่างใดๆ ในโฟลเดอร์นั้น โดยเพิ่ม -b
หรือ --basic
ให้กับคำสั่ง sbase mkdir
:
sbase mkdir ui_tests --basic
โฟลเดอร์ใหม่นั้นจะมีไฟล์เหล่านี้:
ui_tests/
├── __init__.py
├── pytest.ini
├── requirements.txt
└── setup.cfg
ในบรรดาไฟล์เหล่านั้น ไฟล์กำหนดค่า pytest.ini
เป็นไฟล์ที่สำคัญที่สุด รองลงมาคือไฟล์ __init__.py
เปล่า นอกจากนี้ยังมีไฟล์ setup.cfg
(สำหรับ pynose) สุดท้ายนี้ ไฟล์ requirements.txt
สามารถใช้เพื่อช่วยคุณติดตั้ง seleniumbase ลงในสภาพแวดล้อมของคุณได้ (หากยังไม่ได้ติดตั้ง)
เรามาลองตัวอย่างการทดสอบที่ล้มเหลว:
""" test_fail.py """
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class MyTestClass ( BaseCase ):
def test_find_army_of_robots_on_xkcd_desert_island ( self ):
self . open ( "https://xkcd.com/731/" )
self . assert_element ( "div#ARMY_OF_ROBOTS" , timeout = 1 ) # This should fail
คุณสามารถรันได้จาก examples/
โฟลเดอร์ดังนี้:
pytest test_fail.py
- คุณจะสังเกตเห็นว่ามีการสร้างโฟลเดอร์บันทึก "latest_logs" เพื่อเก็บข้อมูลเกี่ยวกับการทดสอบที่ล้มเหลวและภาพหน้าจอ ในระหว่างการทดสอบการทำงาน ผลลัพธ์ที่ผ่านมาจะถูกย้ายไปยังโฟลเดอร์ archived_logs หากคุณตั้งค่า ARCHIVE_EXISTING_LOGS เป็น True ใน settings.py หรือหากคุณทดสอบการทำงานด้วย --archive-logs
หากคุณเลือกที่จะไม่เก็บถาวรบันทึกที่มีอยู่ บันทึกเหล่านั้นจะถูกลบและแทนที่ด้วยบันทึกของการทดสอบครั้งล่าสุด
- ตัวเลือก --dashboard
สำหรับ pytest จะสร้าง SeleniumBase Dashboard ซึ่งอยู่ที่ dashboard.html
ซึ่งจะอัปเดตโดยอัตโนมัติเมื่อการทดสอบทำงานและสร้างผลลัพธ์ ตัวอย่าง:
pytest --dashboard --rs --headless
- นอกจากนี้ คุณยังสามารถโฮสต์ SeleniumBase Dashboard Server ของคุณเองบนพอร์ตที่คุณเลือกได้ นี่คือตัวอย่างการใช้ http.server
ของ Python :
python -m http.server 1948
- ตอนนี้คุณสามารถไปที่ http://localhost:1948/dashboard.html
เพื่อดูแดชบอร์ดในรูปแบบเว็บแอป ซึ่งต้องใช้หน้าต่างเทอร์มินัลที่แตกต่างกันสองหน้าต่าง: หนึ่งหน้าต่างสำหรับการเรียกใช้เซิร์ฟเวอร์ และอีกหน้าต่างหนึ่งสำหรับการรันการทดสอบ ซึ่งควรเรียกใช้จากไดเร็กทอรีเดียวกัน (ใช้ Ctrl+C เพื่อหยุดเซิร์ฟเวอร์ http)
- นี่คือตัวอย่างแบบเต็มของสิ่งที่ SeleniumBase Dashboard อาจมีลักษณะดังนี้:
pytest test_suite.py test_image_saving.py --dashboard --rs --headless
pytest
: ✅ การใช้ --html=report.html
จะให้รายงานที่สวยงามเกี่ยวกับชื่อที่ระบุหลังจากชุดการทดสอบของคุณเสร็จสมบูรณ์
pytest test_suite.py --html=report.html
✅ เมื่อรวมรายงาน pytest html กับการใช้งาน SeleniumBase Dashboard แผนภูมิวงกลมจากแดชบอร์ดจะถูกเพิ่มลงในรายงาน html นอกจากนี้ หากคุณตั้งค่า URL รายงาน html ให้เหมือนกับ URL ของแดชบอร์ดเมื่อใช้แดชบอร์ดด้วย (ตัวอย่าง: --dashboard --html=dashboard.html
) แดชบอร์ดจะกลายเป็นรายงาน html ขั้นสูงเมื่อ การทดสอบเสร็จสมบูรณ์
✅ นี่คือตัวอย่างรายงาน html ที่อัปเกรดแล้ว:
pytest test_suite.py --dashboard --html=report.html
หากดูรายงาน pytest html ใน Jenkins คุณอาจต้องกำหนดการตั้งค่า Jenkins เพื่อให้ html แสดงผลได้อย่างถูกต้อง นี่เป็นเพราะการเปลี่ยนแปลงของ Jenkins CSP
คุณยังสามารถใช้ --junit-xml=report.xml
เพื่อรับรายงาน xml แทนได้ Jenkins สามารถใช้ไฟล์นี้เพื่อแสดงการรายงานที่ดีขึ้นสำหรับการทดสอบของคุณ
pytest test_suite.py --junit-xml=report.xml
pynose
: ตัวเลือก --report
จะให้รายงานที่สวยงามแก่คุณหลังจากที่ชุดการทดสอบของคุณเสร็จสมบูรณ์
pynose test_suite.py --report
(หมายเหตุ: คุณสามารถเพิ่ม --show-report
เพื่อแสดงรายงาน pynose ทันทีหลังจากชุดการทดสอบเสร็จสมบูรณ์ ใช้เฉพาะ --show-report
เมื่อรันการทดสอบในเครื่อง เนื่องจากเป็นการหยุดการทดสอบชั่วคราว)
behave
ตนแดชบอร์ดและรายงาน:(โฟลเดอร์ behave_bdd/ สามารถพบได้ใน examples/ โฟลเดอร์)
behave behave_bdd/features/ -D dashboard -D headless
คุณยังสามารถใช้ --junit
เพื่อรับรายงาน .xml
สำหรับแต่ละคุณลักษณะ behave
Jenkins สามารถใช้ไฟล์เหล่านี้เพื่อแสดงการรายงานที่ดีขึ้นสำหรับการทดสอบของคุณ
behave behave_bdd/features/ --junit -D rs -D headless
ดู: https://allurereport.org/docs/pytest/
SeleniumBase ไม่รวม allure-pytest
เป็นส่วนหนึ่งของการพึ่งพาที่ติดตั้งอีกต่อไป หากต้องการใช้งานให้ติดตั้งก่อน:
pip install allure-pytest
ตอนนี้การทดสอบของคุณสามารถสร้างไฟล์ผลลัพธ์ Allure ซึ่งสามารถประมวลผลได้โดย Allure Reports
pytest test_suite.py --alluredir=allure_results
หากคุณต้องการใช้พร็อกซีเซิร์ฟเวอร์สำหรับการทดสอบเบราว์เซอร์ของคุณ (Chromium หรือ Firefox) คุณสามารถเพิ่ม --proxy=IP_ADDRESS:PORT
เป็นอาร์กิวเมนต์บนบรรทัดคำสั่งได้
pytest proxy_test.py --proxy=IP_ADDRESS:PORT
หากพร็อกซีเซิร์ฟเวอร์ที่คุณต้องการใช้ต้องมีการตรวจสอบสิทธิ์ คุณสามารถดำเนินการต่อไปนี้ได้ (เฉพาะ Chromium เท่านั้น):
pytest proxy_test.py --proxy=USERNAME:PASSWORD@IP_ADDRESS:PORT
SeleniumBase ยังรองรับพร็อกซี SOCKS4 และ SOCKS5:
pytest proxy_test.py --proxy= " socks4://IP_ADDRESS:PORT "
pytest proxy_test.py --proxy= " socks5://IP_ADDRESS:PORT "
เพื่อให้สิ่งต่าง ๆ ง่ายขึ้น คุณสามารถเพิ่มพรอกซีที่ใช้บ่อยลงใน PROXY_LIST ใน proxy_list.py จากนั้นใช้ --proxy=KEY_FROM_PROXY_LIST
เพื่อใช้ IP_ADDRESS:PORT ของคีย์นั้น
pytest proxy_test.py --proxy=proxy1
- หากคุณต้องการเปลี่ยน User-Agent สำหรับการทดสอบเบราว์เซอร์ของคุณ (Chromium และ Firefox เท่านั้น) คุณสามารถเพิ่ม --agent="USER AGENT STRING"
เป็นอาร์กิวเมนต์ในบรรทัดคำสั่งได้
pytest user_agent_test.py --agent= " Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7412.EU "
- self.accept_alert()
จะรอและยอมรับป๊อปอัปแจ้งเตือนโดยอัตโนมัติ self.dismiss_alert()
จะรอและปิดป๊อปอัปการแจ้งเตือนโดยอัตโนมัติ ในบางครั้ง วิธีการบางอย่าง เช่น self.click(SELECTOR)
อาจปิดป๊อปอัปด้วยตัวเอง เนื่องจากเรียก JavaScript เพื่อให้แน่ใจว่า readyState
ของเพจนั้น complete
ก่อนที่จะดำเนินการต่อ หากคุณกำลังพยายามยอมรับป๊อปอัปที่ถูกปิดด้วยวิธีนี้ ให้ใช้วิธีแก้ปัญหาชั่วคราวนี้: โทร self.find_element(SELECTOR).click()
แทน (ซึ่งจะทำให้ป๊อปอัปยังคงอยู่บนหน้าจอ) จากนั้น ใช้ self.accept_alert()
เพื่อยอมรับป๊อปอัป (เพิ่มเติมเกี่ยวกับเรื่องนี้ ที่นี่ ) หากป๊อปอัปปรากฏขึ้นเป็นระยะๆ ให้ล้อมโค้ดไว้ในบล็อกลอง/ยกเว้น
- เรียนรู้เกี่ยวกับบทสรุปแบบโต้ตอบของ SeleniumBase (ในโฟลเดอร์ examples/tour_examples/
) เหมาะอย่างยิ่งสำหรับการสร้างต้นแบบประสบการณ์การเริ่มต้นใช้งานเว็บไซต์
--with-s3-logging
บนบรรทัดคำสั่งเมื่อรันการทดสอบของคุณต่อไปนี้คือตัวอย่างการดำเนินการทดสอบโดยเปิดใช้คุณลักษณะเพิ่มเติมบางอย่าง:
pytest [YOUR_TEST_FILE.py] --with-db-reporting --with-s3-logging
- การนำทางไปยังหน้าเว็บ: (และคำสั่งที่เกี่ยวข้อง)
self . open ( "https://xkcd.com/378/" ) # This method opens the specified page.
self . go_back () # This method navigates the browser to the previous page.
self . go_forward () # This method navigates the browser forward in history.
self . refresh_page () # This method reloads the current page.
self . get_current_url () # This method returns the current page URL.
self . get_page_source () # This method returns the current page source.
ProTip™: คุณสามารถใช้เมธอด self.get_page_source()
กับคำสั่ง find()
ของ Python เพื่อแยกวิเคราะห์ผ่าน HTML เพื่อค้นหาสิ่งที่เฉพาะเจาะจง (สำหรับการแยกวิเคราะห์ขั้นสูง โปรดดูตัวอย่าง BeautifulSoup)
source = self . get_page_source ()
head_open_tag = source . find ( '<head>' )
head_close_tag = source . find ( '</head>' , head_open_tag )
everything_inside_head = source [ head_open_tag + len ( '<head>' ): head_close_tag ]
- คลิก:
หากต้องการคลิกองค์ประกอบบนหน้า:
self . click ( "div#my_id" )
ProTip™: ในเว็บเบราว์เซอร์ส่วนใหญ่ คุณสามารถคลิกขวาที่หน้าเว็บแล้วเลือก Inspect Element
เพื่อดูรายละเอียดตัวเลือก CSS ที่คุณต้องใช้ในการสร้างสคริปต์ของคุณเอง
- พิมพ์ข้อความ:
self.type(selector, text)
# อัปเดตข้อความจากองค์ประกอบที่ระบุด้วยค่าที่ระบุ ข้อยกเว้นจะเกิดขึ้นหากองค์ประกอบหายไปหรือช่องข้อความไม่สามารถแก้ไขได้ ตัวอย่าง:
self . type ( "input#id_value" , "2012" )
คุณยังสามารถใช้ self.add_text()
หรือคำสั่ง WebDriver .send_keys()
ได้ แต่คำสั่งเหล่านั้นจะไม่ล้างกล่องข้อความก่อนหากมีข้อความอยู่ข้างในอยู่แล้ว
- รับข้อความจากองค์ประกอบบนหน้า:
text = self . get_text ( "header h2" )
- รับค่าแอตทริบิวต์จากองค์ประกอบบนหน้า:
attribute = self . get_attribute ( "#comic img" , "title" )
- การยืนยันการมีอยู่ขององค์ประกอบบนเพจภายในจำนวนวินาที:
self . wait_for_element_present ( "div.my_class" , timeout = 10 )
(หมายเหตุ: คุณยังสามารถใช้: self.assert_element_present(ELEMENT)
)
- การยืนยันการมองเห็นองค์ประกอบบนเพจภายในจำนวนวินาที:
self . wait_for_element_visible ( "a.my_class" , timeout = 5 )
(หมายเหตุ: เวอร์ชันสั้นของนั่นคือ self.find_element(ELEMENT)
และ self.assert_element(ELEMENT)
เวอร์ชัน find_element()
ส่งคืนองค์ประกอบ)
เนื่องจากบรรทัดด้านบนส่งคืนองค์ประกอบ คุณสามารถรวมสิ่งนั้นเข้ากับ .click()
ดังที่แสดงด้านล่าง:
self . find_element ( "a.my_class" , timeout = 5 ). click ()
# But you're better off using the following statement, which does the same thing:
self . click ( "a.my_class" ) # DO IT THIS WAY!
ProTip™: คุณสามารถใช้จุดเพื่อแสดงชื่อคลาส (เช่น div.class_name
) เป็นเวอร์ชันที่เรียบง่ายของ div[class="class_name"]
ภายในตัวเลือก CSS
คุณยังสามารถใช้ *=
เพื่อค้นหาค่าบางส่วนในตัวเลือก CSS ดังที่แสดงด้านล่าง:
self . click ( 'a[name*="partial_name"]' )
- การยืนยันการมองเห็นข้อความภายในองค์ประกอบบนเพจภายในไม่กี่วินาที:
self . assert_text ( "Make it so!" , "div#trek div.picard div.quotes" )
self . assert_text ( "Tea. Earl Grey. Hot." , "div#trek div.picard div.quotes" , timeout = 3 )
(หมายเหตุ: self.find_text(TEXT, ELEMENT)
และ self.wait_for_text(TEXT, ELEMENT)
ก็ทำเช่นนี้เช่นกัน สำหรับความเข้ากันได้แบบย้อนหลัง ชื่อวิธีการเก่าจะถูกเก็บไว้ แต่การหมดเวลาเริ่มต้นอาจแตกต่างกัน)
- ยืนยันสิ่งใด:
self . assert_true ( var1 == var2 )
self . assert_false ( var1 == var2 )
self . assert_equal ( var1 , var2 )
- ข้อความเงื่อนไขที่เป็นประโยชน์: (พร้อมตัวอย่างที่สร้างสรรค์)
❓ is_element_visible(selector):
(มองเห็นได้บนหน้า)
if self . is_element_visible ( 'div#warning' ):
print ( "Red Alert: Something bad might be happening!" )
❓ is_element_present(selector):
(นำเสนอในรูปแบบ HTML)
if self . is_element_present ( 'div#top_secret img.tracking_cookie' ):
self . contact_cookie_monster () # Not a real SeleniumBase method
else :
current_url = self . get_current_url ()
self . contact_the_nsa ( url = current_url , message = "Dark Zone Found" ) # Not a real SeleniumBase method
def is_there_a_cloaked_klingon_ship_on_this_page ():
if self . is_element_present ( "div.ships div.klingon" ):
return not self . is_element_visible ( "div.ships div.klingon" )
return False
❓ is_text_visible(text, selector):
(ข้อความปรากฏบนองค์ประกอบ)
if self . is_text_visible ( "You Shall Not Pass!" , "h1" ):
self . open ( "https://www.youtube.com/watch?v=3xYXUeSmb-Y" )
is_text_visible():
def get_mirror_universe_captain_picard_superbowl_ad ( superbowl_year ):
selector = "div.superbowl_%s div.commercials div.transcript div.picard" % superbowl_year
if self . is_text_visible ( "Yes, it was I who summoned you all here." , selector ):
return "Picard Paramount+ Superbowl Ad 2020"
elif self . is_text_visible ( "Commander, signal the following: Our Network is Secure!" ):
return "Picard Mirror Universe iboss Superbowl Ad 2018"
elif self . is_text_visible ( "For the Love of Marketing and Earl Grey Tea!" , selector ):
return "Picard Mirror Universe HubSpot Superbowl Ad 2015"
elif self . is_text_visible ( "Delivery Drones... Engage" , selector ):
return "Picard Mirror Universe Amazon Superbowl Ad 2015"
elif self . is_text_visible ( "Bing it on Screen!" , selector ):
return "Picard Mirror Universe Microsoft Superbowl Ad 2015"
elif self . is_text_visible ( "OK Glass, Make it So!" , selector ):
return "Picard Mirror Universe Google Superbowl Ad 2015"
elif self . is_text_visible ( "Number One, I've Never Seen Anything Like It." , selector ):
return "Picard Mirror Universe Tesla Superbowl Ad 2015"
elif self . is_text_visible ( "Let us make sure history never forgets the name ... Facebook" , selector ):
return "Picard Mirror Universe Facebook Superbowl Ad 2015"
elif self . is_text_visible ( """With the first link, the chain is forged.
The first speech censored, the first thought forbidden,
the first freedom denied, chains us all irrevocably.""" , selector ):
return "Picard Mirror Universe Wikimedia Superbowl Ad 2015"
else :
raise Exception ( "Reports of my assimilation are greatly exaggerated." )
❓ is_link_text_visible(link_text):
if self . is_link_text_visible ( "Stop! Hammer time!" ):
self . click_link ( "Stop! Hammer time!" )
หากการทดสอบของคุณเปิดแท็บ/หน้าต่างใหม่ คุณสามารถสลับไปใช้การทดสอบนั้นได้ (SeleniumBase จะสลับไปที่แท็บใหม่ที่ไม่เปิดเป็น about:blank
URL โดยอัตโนมัติ)
self . switch_to_window ( 1 ) # This switches to the new tab (0 is the first one)
- iframes เป็นไปตามหลักการเดียวกันกับหน้าต่างใหม่: คุณต้องเปลี่ยนไปใช้ iframe ก่อนหากคุณต้องการดำเนินการในนั้น:
self . switch_to_frame ( "iframe" )
# ... Now perform actions inside the iframe
self . switch_to_parent_frame () # Exit the current iframe
หากต้องการออกจากหลาย iframe ให้ใช้ self.switch_to_default_content()
(หากอยู่ใน iframe เดียว สิ่งนี้จะมีผลเช่นเดียวกับ self.switch_to_parent_frame()
)
self . switch_to_frame ( 'iframe[name="frame1"]' )
self . switch_to_frame ( 'iframe[name="frame2"]' )
# ... Now perform actions inside the inner iframe
self . switch_to_default_content () # Back to the main page
- คุณยังสามารถใช้ตัวจัดการบริบทเพื่อดำเนินการภายใน iframe:
with self . frame_switch ( "iframe" ):
# ... Now perform actions while inside the code block
# You have left the iframe
นอกจากนี้ยังใช้งานได้กับ iframe ที่ซ้อนกัน:
with self . frame_switch ( 'iframe[name="frame1"]' ):
with self . frame_switch ( 'iframe[name="frame2"]' ):
# ... Now perform actions while inside the code block
# You are now back inside the first iframe
# You have left all the iframes
jQuery เป็นไลบรารี JavaScript ที่ทรงพลังที่ให้คุณดำเนินการขั้นสูงในเว็บเบราว์เซอร์ หากหน้าเว็บที่คุณเปิดอยู่มีการโหลด jQuery ไว้แล้ว คุณสามารถเริ่มรันสคริปต์ jQuery ได้ทันที คุณจะทราบสิ่งนี้เนื่องจากหน้าเว็บจะมีสิ่งต่อไปนี้ใน HTML:
< script src =" https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js " > </ script >
- ไม่เป็นไรถ้าคุณต้องการใช้ jQuery บนหน้าที่ยังไม่ได้โหลด โดยรันคำสั่งต่อไปนี้ก่อน:
self . activate_jquery ()
self . execute_script ( "jQuery, window.scrollTo(0, 600)" ) # Scrolling the page
self . execute_script ( "jQuery('#annoying-widget').hide()" ) # Hiding elements on a page
self . execute_script ( "jQuery('#hidden-widget').show(0)" ) # Showing hidden elements on a page
self . execute_script ( "jQuery('#annoying-button a').remove()" ) # Removing elements on a page
self . execute_script ( "jQuery('%s').mouseover()" % ( mouse_over_item )) # Mouse-over elements on a page
self . execute_script ( "jQuery('input#the_id').val('my_text')" ) # Fast text input on a page
self . execute_script ( "jQuery('div#dropdown a.link').click()" ) # Click elements on a page
self . execute_script ( "return jQuery('div#amazing')[0].text" ) # Returns the css "text" of the element given
self . execute_script ( "return jQuery('textarea')[2].value" ) # Returns the css "value" of the 3rd textarea element on the page
(คำสั่งข้างต้นส่วนใหญ่สามารถทำได้โดยตรงด้วยเมธอด SeleniumBase ในตัว)
❗ เว็บไซต์บางแห่งมีนโยบายการรักษาความปลอดภัยของเนื้อหาที่เข้มงวดเพื่อป้องกันไม่ให้ผู้ใช้โหลด jQuery และไลบรารีภายนอกอื่น ๆ ลงบนเว็บไซต์ของตน หากคุณต้องการใช้ jQuery หรือไลบรารี JS อื่นบนเว็บไซต์เหล่านั้น ให้เพิ่ม --disable-csp
เป็นตัวเลือกบรรทัดคำสั่ง pytest
เพื่อโหลดส่วนขยาย Chromium ที่ข้าม CSP
start_page = "https://xkcd.com/465/"
destination_page = "https://github.com/seleniumbase/SeleniumBase"
self . open ( start_page )
referral_link = '''<a class='analytics test' href='%s'>Free-Referral Button!</a>''' % destination_page
self . execute_script ( '''document.body.innerHTML = " %s " ''' % referral_link )
self . click ( "a.analytics" ) # Clicks the generated button
(เนื่องจากความต้องการที่ได้รับความนิยม ตัวอย่างการสร้างการเข้าชมนี้จึงรวมอยู่ใน SeleniumBase พร้อมด้วยเมธอด self.generate_referral(start_page, end_page)
และ self.generate_traffic(start_page, end_page, loops)
)
สมมติว่าคุณต้องการตรวจสอบองค์ประกอบที่แตกต่างกันหลายรายการบนหน้าเว็บในการทดสอบครั้งเดียว แต่คุณไม่ต้องการให้การทดสอบล้มเหลวจนกว่าคุณจะตรวจสอบองค์ประกอบหลายรายการพร้อมกัน เพื่อที่คุณจะได้ไม่ต้องทำการทดสอบอีกครั้งเพื่อค้นหาส่วนที่ขาดหายไป องค์ประกอบในหน้าเดียวกัน นั่นคือที่มาของการยืนยันที่เลื่อนออกไป นี่คือตัวอย่าง:
from seleniumbase import BaseCase
BaseCase . main ( __name__ , __file__ )
class DeferredAssertTests ( BaseCase ):
def test_deferred_asserts ( self ):
self . open ( "https://xkcd.com/993/" )
self . wait_for_element ( "#comic" )
self . deferred_assert_element ( 'img[alt="Brand Identity"]' )
self . deferred_assert_element ( 'img[alt="Rocket Ship"]' ) # Will Fail
self . deferred_assert_element ( "#comicmap" )
self . deferred_assert_text ( "Fake Item" , "ul.comicNav" ) # Will Fail
self . deferred_assert_text ( "Random" , "ul.comicNav" )
self . deferred_assert_element ( 'a[name="Super Fake !!!"]' ) # Will Fail
self . deferred_assert_exact_text ( "Brand Identity" , "#ctitle" )
self . deferred_assert_exact_text ( "Fake Food" , "#comic" ) # Will Fail
self . process_deferred_asserts ()
deferred_assert_element()
และ deferred_assert_text()
จะบันทึกข้อยกเว้นใด ๆ ที่จะเกิดขึ้น หากต้องการล้างการยืนยันที่เลื่อนออกไปที่ล้มเหลวทั้งหมดออกเป็นข้อยกเว้นเดียว ตรวจสอบให้แน่ใจว่าได้เรียก self.process_deferred_asserts()
ที่ส่วนท้ายของวิธีทดสอบของคุณ หากการทดสอบของคุณเข้าถึงหลายหน้า คุณสามารถเรียก self.process_deferred_asserts()
ก่อนที่จะนำทางไปยังหน้าใหม่ เพื่อให้ภาพหน้าจอจากไฟล์บันทึกของคุณตรงกับ URL ที่สร้างการยืนยันที่เลื่อนออกไป
หากคุณต้องการเข้าถึงคำสั่งใดๆ ที่มาพร้อมกับ WebDriver มาตรฐาน คุณสามารถเรียกคำสั่งเหล่านั้นได้โดยตรงดังนี้:
self . driver . delete_all_cookies ()
capabilities = self . driver . capabilities
self . driver . find_elements ( "partial link text" , "GitHub" )
(โดยทั่วไป คุณจะต้องใช้เมธอดเวอร์ชัน SeleniumBase หากมี)
คุณสามารถใช้ pytest --reruns=NUM
เพื่อลองการทดสอบที่ล้มเหลวอีกครั้งได้หลายครั้ง เพิ่ม --reruns-delay=SECONDS
เพื่อรอหลายวินาทีระหว่างการลองใหม่ ตัวอย่าง:
pytest --reruns=1 --reruns-delay=1
คุณสามารถใช้ตัวตกแต่ง @retry_on_exception()
เพื่อลองวิธีที่ล้มเหลวอีกครั้ง (นำเข้าครั้งแรก: from seleniumbase import decorators
) หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับอุปกรณ์ตกแต่ง SeleniumBase คลิกที่นี่
"จับจุดบกพร่องใน QA ก่อนที่จะปรับใช้โค้ดกับการผลิต!"