올인원 브라우저 자동화 프레임워크:
웹 크롤링/테스트/스크래핑/스텔스
시작 | ? 특징 | ?️ 옵션 | 예 | ? 스크립트 | 이동하는
API | ? 형식 | ? 녹음기 | 대시보드 | ? 로케일 | 농장
?️ GUI | ? 테스트 페이지 | ? UC 모드 | ? CDP 모드 | ? 차트 | 그리드
?️ 어떻게 | ? 마이그레이션 | 케이스플랜 | ♻️ 템플릿 | ? 하이브리드 | ? 투어
? CI/CD | ?️ JSMgr | ? 번역가 | 발표자 | ? 대화 | ?️ 비주얼
SeleniumBase는 웹 자동화 활동을 위한 전문 툴킷입니다. 웹사이트 테스트, CAPTCHA 우회, 생산성 향상, 작업 완료 및 비즈니스 확장을 위해 제작되었습니다.
SeleniumBase/examples/ 폴더에 있는 200개가 넘는 예제를 통해 알아보세요.
? SeleniumBase UC 모드 (스텔스 모드)에는 자체 ReadMe가 있습니다.
? 또한 Seleniumbase CDP 모드 에는 별도의 ReadMe가 있습니다.
python
통해 스크립트를 호출할 수 있지만 일부 구문 형식에서는 pytest (테스트를 자동으로 검색, 수집 및 실행할 수 있는 SeleniumBase에 포함된 Python 단위 테스트 프레임워크)가 필요합니다.
? 로그인, 쇼핑, 체크아웃을 테스트하는 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/ 폴더를 참조하세요.)
추가 정보 살펴보기:
- 시작하기 / 설치
- 기본 예 / 사용법
- 일반적인 테스트 방법
- 재미있는 사실 / 자세히 알아보기
- 데모 모드/디버깅
- 명령줄 옵션
- 디렉터리 구성
- SeleniumBase 대시보드
- 테스트 보고서 생성
SeleniumBase는 브라우저 자동화 및 테스트를 위한 Python 프레임워크입니다. SeleniumBase는 Selenium/WebDriver API를 사용하고 pytest
, pynose
및 behave
와 같은 테스트 실행기를 통합하여 조직화된 구조, 테스트 검색, 테스트 실행, 테스트 상태( 예: 통과, 실패 또는 건너뛰기 ) 및 변경을 위한 명령줄 옵션을 제공합니다. 기본 설정( 예: 브라우저 선택 ). 원시 Selenium을 사용하면 명령줄에서 테스트를 구성하기 위해 고유한 옵션 파서를 설정해야 합니다.
SeleniumBase의 드라이버 관리자를 사용하면 자동 드라이버 다운로드를 더 효과적으로 제어할 수 있습니다. (버전을 지정하려면 pytest
실행 명령과 함께 --driver-version=VER
사용하십시오.) 기본적으로 SeleniumBase는 설정되지 않은 경우 주요 브라우저 버전과 일치하는 드라이버 버전을 다운로드합니다.
SeleniumBase는 CSS 선택기와 XPath 사이를 자동으로 감지합니다. 즉, 명령에서 선택기 유형을 지정할 필요가 없습니다( 그러나 선택적으로 지정할 수 있음 ).
SeleniumBase 메서드는 단일 메서드 호출에서 여러 작업을 수행하는 경우가 많습니다. 예를 들어 self.type(selector, text)
다음을 수행합니다.
1. 요소가 표시될 때까지 기다립니다.
2. 요소가 상호 작용할 때까지 기다립니다.
3. 텍스트 필드를 지웁니다.
4. 새 텍스트를 입력합니다.
5. 텍스트가 "n"
으로 끝나는 경우 Enter/Submit을 누릅니다.
원시 Selenium을 사용하면 이러한 작업에는 여러 메서드 호출이 필요합니다.
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에는 pytest
용 SeleniumBase Commander 및 behave
용 SeleniumBase Behave GUI와 같이 테스트 실행을 위한 데스크톱 GUI 앱이 포함되어 있습니다.
SeleniumBase에는 수동 브라우저 작업에서 테스트를 생성하기 위한 자체 레코더/테스트 생성기가 있습니다.
SeleniumBase에는 테스트 및 단계 설명을 구성하기 위한 테스트 사례 관리 소프트웨어("CasePlans")가 함께 제공됩니다.
SeleniumBase에는 Python에서 JavaScript를 생성할 수 있는 데이터 앱("ChartMaker")을 구축하기 위한 도구가 포함되어 있습니다.
테스트를 작성하는 다양한 방법에 대해 알아보세요.
다음은 BaseCase
클래스 상속을 사용하고 pytest 또는 pynose로 실행되는 test_simple_login.py입니다. (Selenium의 원시 driver
에 액세스하려면 self.driver
사용하십시오.)
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
pytest
고정 장치를 사용하는 sb_fixture_tests.py의 테스트입니다. pytest로 실행됩니다. (Selenium의 원시 driver
에 액세스하려면 sb.driver
사용하십시오.)
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" )
? 다음은 SB
Context Manager를 사용하는 raw_login_sb.py입니다. 순수한 python
으로 실행됩니다. (Selenium의 원시 driver
에 액세스하려면 sb.driver
사용하십시오.)
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" )
? 다음은 DriverContext
Manager를 사용하는 raw_login_context.py입니다. 순수한 python
으로 실행됩니다. ( driver
더 많은 방법을 갖춘 Selenium 원시 driver
의 향상된 버전입니다.)
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" )
? 다음은 Driver
관리자를 사용하는 raw_login_driver.py입니다. 순수한 python
으로 실행됩니다. ( driver
더 많은 방법을 갖춘 Selenium 원시 driver
의 향상된 버전입니다.)
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 ()
다음은 Behavior-BDD Gherkin 구문을 사용하는 login_app.feature입니다. behave
와 함께 실행됩니다. ( SeleniumBase Behavior-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"
? 시스템 PATH에 Python 과 Git을 추가합니다.
? Python 가상 환경을 사용하는 것이 좋습니다.
PyPI 또는 GitHub에서 seleniumbase
설치할 수 있습니다.
? PyPI에서 seleniumbase
설치하는 방법:
pip install seleniumbase
--upgrade
또는 -U
추가하세요.)--force-reinstall
추가하세요.)pip3
사용하십시오.) ? GitHub 클론에서 seleniumbase
설치하는 방법:
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는 필요에 따라 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를 복제한 경우 example/ 폴더에서 테스트를 실행할 수 있습니다.
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
로만 실행할 수 있습니다. (구문 형식 참조) Behavior로 실행되는 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
로 끝나는 Python 파일입니다.test_
로 시작하는 Python 메서드. SeleniumBase pytest.ini 파일이 있으면 기본 검색 설정을 수정할 수 있습니다. seleniumbase.BaseCase
자동 검색을 트리거하기 위해 unittest.TestCase
상속하므로 Python 클래스 이름은 무엇이든 될 수 있습니다.
✅ 실제 실행 전에 pytest
에서 어떤 테스트가 발견되는지 사전 확인을 통해 확인할 수 있습니다.
pytest --co -q
✅ 파일에서 pytest
또는 pynose
호출할 때 더 구체적으로 지정할 수 있습니다.
pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
✅ 불안정한 테스트는 더 이상 없습니다! SeleniumBase 메서드는 페이지 요소와 상호 작용하기 전에 페이지 요소 로드가 완료될 때까지 자동으로 기다립니다( 최대 시간 제한까지 ). 이는 더 이상 스크립트에 임의의 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.
? Python에 내장된 pdb 라이브러리가 포함된 디버그 모드는 테스트 디버깅에 도움이 됩니다.
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
? 디버그 모드에서 테스트를 시작하려면 --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/
폴더에 저장됩니다. --archive_logs를 명령줄 옵션에 추가하거나 settings.py에서 ARCHIVE_EXISTING_LOGS
True로 설정하면 해당 로그는 archived_logs/
로 이동됩니다. 그렇지 않으면 다음 테스트 실행 시작 시 로그 파일이 정리됩니다. test_suite.py
컬렉션에는 로깅이 어떻게 작동하는지 확인할 수 있도록 의도적으로 실패한 테스트가 포함되어 있습니다.
cd examples/
pytest test_suite.py --chrome
pytest test_suite.py --firefox
seleniumbase/config/settings.py를 재정의하는 쉬운 방법은 사용자 정의 설정 파일을 사용하는 것입니다. 테스트에 추가할 명령줄 옵션은 다음과 같습니다. (examples/custom_settings.py 참조) --settings_file=custom_settings.py
(설정에는 기본 제한 시간 값, 2단계 인증 키, 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™: sbase mkdir
명령에 -b
또는 --basic
추가하여 샘플 테스트 없이 상용구 폴더를 생성할 수도 있습니다.
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"가 생성되었음을 알 수 있습니다. 테스트 실행 중에 settings.py에서 ARCHIVE_EXISTING_LOGS가 True로 설정되어 있거나 --archive-logs
사용하여 테스트를 실행하는 경우 과거 결과가 archived_logs 폴더로 이동됩니다. 기존 로그를 보관하지 않기로 선택하면 기존 로그가 삭제되고 최신 테스트 실행 로그로 대체됩니다.
? pytest의 --dashboard
옵션은 dashboard.html
에 있는 SeleniumBase 대시보드를 생성합니다. 이 대시보드는 테스트가 실행되고 결과가 생성될 때 자동으로 업데이트됩니다. 예:
pytest --dashboard --rs --headless
? 또한 선택한 포트에서 자체 SeleniumBase 대시보드 서버를 호스팅할 수 있습니다. 다음은 Python의 http.server
사용한 예입니다.
python -m http.server 1948
? 이제 http://localhost:1948/dashboard.html
로 이동하여 대시보드를 웹 앱으로 볼 수 있습니다. 이를 위해서는 두 개의 서로 다른 터미널 창이 필요합니다. 하나는 서버를 실행하기 위한 것이고 다른 하나는 동일한 디렉터리에서 실행되어야 하는 테스트를 실행하기 위한 것입니다. (http 서버를 중지하려면 Ctrl+C를 사용하세요.)
? 다음은 SeleniumBase 대시보드의 전체 예입니다.
pytest test_suite.py test_image_saving.py --dashboard --rs --headless
pytest
HTML 보고서: ✅ --html=report.html
사용하면 테스트 스위트가 완료된 후 지정된 이름에 대한 멋진 보고서를 얻을 수 있습니다.
pytest test_suite.py --html=report.html
✅ pytest html 보고서를 SeleniumBase Dashboard 사용법과 결합하면 대시보드의 원형 차트가 html 보고서에 추가됩니다. 또한 대시보드를 사용할 때 html 보고서 URL을 대시보드 URL과 동일하게 설정하면(예: --dashboard --html=dashboard.html
) 대시보드는 모든 작업이 수행될 때 고급 html 보고서가 됩니다. 테스트가 완료되었습니다.
✅ 업그레이드된 HTML 보고서의 예는 다음과 같습니다.
pytest test_suite.py --dashboard --html=report.html
Jenkins에서 pytest html 보고서를 보는 경우 html이 올바르게 렌더링되도록 Jenkins 설정을 구성해야 할 수도 있습니다. 이는 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
:(behavior_bdd/ 폴더는 example/ 폴더에서 찾을 수 있습니다.)
behave behave_bdd/features/ -D dashboard -D headless
--junit
사용하여 각 behave
기능에 대한 .xml
보고서를 가져올 수도 있습니다. Jenkins는 이러한 파일을 사용하여 테스트에 대한 더 나은 보고를 표시할 수 있습니다.
behave behave_bdd/features/ --junit -D rs -D headless
참조: https://allurereport.org/docs/pytest/
SeleniumBase에는 더 이상 설치된 종속 항목의 일부로 allure-pytest
포함되지 않습니다. 사용하려면 먼저 설치하세요.
pip install allure-pytest
이제 테스트에서는 Allure 보고서에서 처리할 수 있는 Allure 결과 파일을 생성할 수 있습니다.
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.py의 PROXY_LIST에 추가한 다음 --proxy=KEY_FROM_PROXY_LIST
사용하여 해당 키의 IP_ADDRESS:PORT를 사용할 수 있습니다.
pytest proxy_test.py --proxy=proxy1
? 브라우저 테스트(Chromium 및 Firefox에만 해당)를 위해 User-Agent를 변경하려면 명령줄에서 --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)
과 같은 일부 메소드는 진행하기 전에 페이지의 readyState
가 complete
되었는지 확인하기 위해 JavaScript를 호출하기 때문에 자체적으로 팝업을 닫을 수 있습니다. 이런 식으로 닫힌 팝업을 수락하려는 경우 다음 해결 방법을 사용하십시오. 대신 self.find_element(SELECTOR).click()
호출한 다음(팝업이 화면에 남아 있게 됨) 팝업을 수락하려면 self.accept_alert()
사용하세요(자세한 내용은 여기에서 확인하세요). 팝업이 간헐적으로 나타나는 경우 코드를 try/exc 블록으로 래핑하세요.
? 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™: Python의 find()
명령과 함께 self.get_page_source()
메서드를 사용하여 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™: 점을 사용하여 CSS 선택기 내에서 div[class="class_name"]
의 단순화된 버전으로 클래스 이름(예: div.class_name
)을 나타낼 수 있습니다.
아래와 같이 *=
사용하여 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)
? iframe은 새 창과 동일한 원칙을 따릅니다. 즉, iframe에서 작업을 수행하려면 먼저 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
명령줄 옵션으로 추가하여 CSP를 우회하는 Chromium 확장 프로그램을 로드하세요.
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
(대중적인 요구로 인해 이 트래픽 생성 예제는 self.generate_referral(start_page, end_page)
및 self.generate_traffic(start_page, end_page, loops)
메소드와 함께 SeleniumBase에 포함되었습니다.)
단일 테스트로 웹 페이지의 여러 다른 요소를 확인하고 싶지만 한 번에 여러 요소를 확인할 때까지 테스트가 실패하지 않도록 하여 더 많은 누락 항목을 찾기 위해 테스트를 다시 실행할 필요가 없다고 가정해 보겠습니다. 같은 페이지의 요소. 이것이 바로 지연된 어설션이 들어오는 곳입니다. 예는 다음과 같습니다.
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에서 버그를 잡아보세요!"