webdriver listeners selenium
WebDriver 리스너 란 무엇입니까? Selenium 자동화 테스트에서 리스너가 필요한 이유는 무엇입니까? 이 자습서에서는 샘플 코드 예제를 통해 이러한 질문에 대해 자세히 설명합니다.
청취자는 이름에서 알 수 있듯이 Selenium 코드에 규정 된 모든 이벤트를 '듣습니다'. 예를 들어 요소를 클릭하기 전에 어떤 일이 발생하는지 알고 싶다면; 요소로 이동하기 전후 또는 예외가 발생하고 테스트가 실패 할 때 어떤 일이 발생하는지 리스너가 유용합니다.
Selenium Automation Testing에서 리스너의 실제 사용은 작업 순서를 기록하고 예외가 발생할 때 스크린 샷을 찍는 것입니다. 이렇게하면 테스트 실행의 나중 단계에서 쉽게 디버깅 할 수 있습니다.
=> 여기에서 모든 Selenium 자습서를 확인하십시오.
학습 내용 :
Webdriver 리스너 구현
리스너에는 크게 두 가지 유형이 있습니다.
- Webdriver 리스너
- TestNG 리스너
먼저 Webdriver Listener의 작동 방식을 이해합니다. 이 자습서에서는 Webdriver 이벤트 리스너에 중점을 둡니다.
Webdriver 이벤트 리스너를 사용하는 이유는 무엇입니까?
Webdriver의 도움으로 브라우저 및 웹 요소에서 많은 이벤트를 트리거 할 수 있습니다. 실행 중에 트리거되는 모든 이벤트를 추적하고 실행이 완료되면 디버깅에 도움이 될 수 있습니다.
Webdriver 이벤트 리스너를 구현하는 방법에는 두 가지가 있습니다.
- WebDriverEventListener Webdriver 이벤트를 추적하기 위해 미리 정의 된 몇 가지 방법이있는 인터페이스입니다. 이를 구현하려면 모두 인터페이스에 미리 정의 된 메서드.
- AbstractWebDriverEventListener 클래스 우리가 관심있는 방법 만 구현할 수있는 기능을 제공합니다.
#1) WebDriverEventListener 인터페이스
WebDriverEventListener 인터페이스를 구현하는 데 사용되는 미리 정의 된 메서드는 다음과 같습니다.
(i) void beforeChangeValueOf (WebElement arg0, WebDriver arg1, CharSequence () arg2)
이 메서드는 웹 요소에서 sendKeys () 또는 clear () 작업을 수행 할 때 트리거됩니다. (예 : driver.findElement (By.id ( 'Login')). clear ())가 트리거되고 전에 웹 요소에서 작업을 수행합니다.
매개 변수 :
arg0= Web Element arg1=driver
(ii) void afterChangeValueOf (WebElement arg0, WebDriver arg1, CharSequence () arg2)
이 메서드는 웹 요소에서 sendKeys () 또는 clear () 작업을 수행 할 때 트리거됩니다. (예 : driver.findElement (By.id ( 'Login')). clear ())가 트리거되고 후 웹 요소에서 작업을 수행합니다.
매개 변수 :
arg0= Web Element arg1=driver
(iii) void beforeClickOn (WebElement arg0, WebDriver arg1)
이 메서드는 트리거됩니다. 전에 웹 요소를 클릭합니다.
매개 변수 :
arg0= Web Element arg1=driver
(iv) void afterClickOn (WebElement arg0, WebDriver arg1)
dfs 및 bfs C ++
이 메서드는 트리거됩니다. 후 웹 요소를 클릭합니다.
매개 변수 :
arg0= Web Element arg1=driver
(v) void beforeNavigateTo (String arg0, WebDriver arg1)
이 메서드는 navigate (). to (String URL) (예를 들어 navigate (). to (“https : // www.google.com ”)), 트리거 됨 전에 URL로 이동합니다.
매개 변수 :
arg0= URL arg1=driver
(vi) void afterNavigateTo (String arg0, WebDriver arg1)
이 메서드는 navigate (). to (String URL) (예를 들어 navigate (). to (“https : // www.google.com ”)), 트리거 됨 후 URL로 이동합니다.
매개 변수 :
arg0= URL arg1=driver
(vii) void beforeNavigateBack (WebDriver arg0)
이 메서드는 navigate (). back () 명령을 사용할 때 트리거됩니다. 일어난다 전에 사용자를 이전 페이지로 리디렉션합니다.
매개 변수 :
arg0=driver
(viii) void afterNavigateBack (WebDriver arg0)
이 메서드는 navigate (). back () 명령을 사용할 때 트리거됩니다. 일어난다 후 사용자를 이전 페이지로 리디렉션합니다.
매개 변수 :
arg0=driver
(ix) void beforeNavigateForward (WebDriver arg0)
이 메서드는 navigate (). forward () 명령을 사용할 때 트리거됩니다. 일어난다 전에 사용자를 다음 페이지로 리디렉션합니다.
매개 변수 :
테스트 계획과 테스트 전략의 차이
arg0=driver
(x) void afterNavigateBack (WebDriver arg0)
이 메서드는 navigate (). forward () 명령을 사용할 때 트리거됩니다. 일어난다 후 사용자를 다음 페이지로 리디렉션합니다.
매개 변수 :
arg0=driver
(xi) void beforeNavigateRefresh (WebDriver arg0)
이 메서드는 navigate (). refresh () 명령을 사용할 때 트리거됩니다. 일어난다 전에 현재 페이지를 새로 고칩니다.
매개 변수 :
arg0=driver
(xii) void afterNavigateRefresh (WebDriver arg0)
이 메서드는 navigate (). refresh () 명령을 사용할 때 트리거됩니다. 일어난다 후 현재 페이지를 새로 고칩니다.
매개 변수 :
arg0=driver
(xiii) void beforeFindBy (By arg0, WebElement arg1, WebDriver arg2)
이 메서드는 다음 명령을 사용할 때 트리거됩니다. driver.findElement (By.id ( '일부 ID 또는 기타 로케이터')) . 일어난다 전에 웹 요소를 찾으십시오.
매개 변수 :
arg0=locator arg1=Web Element arg2=driver
(xiv) afterFindBy 무효 (arg0, WebElement arg1, WebDriver arg2에 의해)
이 메서드는 다음 명령을 사용할 때 트리거됩니다. driver.findElement (By.id ( '일부 ID 또는 기타 로케이터')) . 일어난다 후 웹 요소를 찾으십시오.
매개 변수 :
arg0=locator arg1=Web Element arg2=driver
(xv) void onException (Throwable arg0, WebDriver arg1)
이 메서드는 예외가 발생할 때마다 throw됩니다. 예를 들어, Webdriver가 요소를 찾을 수없는 경우이 메서드를 트리거하고 내부에 작성된 코드를 실행합니다.
매개 변수 :
arg0=Exception arg1= driver
(xvi) void beforeAlertAccept (WebDriver arg0)
이 메서드는 화면에 경고 상자가 표시 될 때마다 트리거되고 오른쪽으로 트리거됩니다. 전에 '확인 또는 동의'버튼을 클릭합니다.
매개 변수 :
arg0=driver
(xvii) void afterAlertAccept (WebDriver arg0)
이 메서드는 화면에 경고 상자가 표시 될 때마다 트리거되고 오른쪽으로 트리거됩니다. 후 '확인 또는 동의'버튼을 클릭합니다.
매개 변수 :
arg0=driver
(xviii) void beforeAlertDismiss (WebDriver arg0)
이 메서드는 화면에 경고 상자가 표시 될 때마다 트리거되고 오른쪽으로 트리거됩니다. 전에 '취소'버튼을 클릭합니다.
매개 변수 :
arg0=driver
(xix) void afterAlertDismiss (WebDriver arg0)
이 메서드는 화면에 경고 상자가 표시 될 때마다 트리거되고 오른쪽으로 트리거됩니다. 후 '취소'버튼을 클릭합니다.
매개 변수 :
arg0=driver
다음과 함께 사용할 수있는 모든 방법입니다. WebDriverEventListener. beforeScript와 afterScript의 다른 두 가지 방법이 있지만이 튜토리얼에서는 다루지 않을 것입니다.
Eclipse에서 'WebDriverEventListener'인터페이스를 사용하여 리스너를 구현하는 단계 :
1 단계: 이름이 'Listeners'인 패키지를 만듭니다. 그 패키지 안에“ WebdriverListeners ”및 구현 “WebDriverEventListener” .
UI는 다음과 같습니다.
오류가있는 빨간색 선 위로 마우스를 가져 가면 Eclipse가 'WebDriverEventListener'를 가져 오라는 제안을 던져야합니다. 가져 오기를 클릭하십시오.
WebDriverEventListener의 오류가 종료되었지만 'WebDriverListeners'클래스에 아래 오류가 표시됩니다. 커서를 오류 위로 이동하면 구현되지 않은 메서드를 추가하라는 제안이 표시됩니다. 그것을 클릭하면 모든 방법이 위에 나열되고 설명 된 것을 볼 수 있습니다.
데모 목적으로 모든 메소드에 System.out.println 행을 추가했습니다.
샘플 코드 -1
package Listeners; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.events.WebDriverEventListener; public class WebDriverListeners implements WebDriverEventListener { @Override public void afterAlertAccept(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('After Alert Accept '+arg0.toString() ); } @Override public void afterAlertDismiss(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('After Alert Dismiss '+ arg0); } @Override public void afterChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence() arg2) { // TODO Auto-generated method stub System.out.println('After value change of' +arg0); } @Override public void afterClickOn(WebElement arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('After clicked'+arg0); } @Override public void afterFindBy(By arg0, WebElement arg1, WebDriver arg2) { // TODO Auto-generated method stub System.out.println('After Find By'+arg1); } @Override public void afterNavigateBack(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('After Navigate Back'); } @Override public void afterNavigateForward(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('After Navigate Forward'); } @Override public void afterNavigateRefresh(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('On Navigating Refresh'); } @Override public void afterNavigateTo(String arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('On Navigating To'+arg0); } @Override public void afterScript(String arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('After Script'); } @Override public void beforeAlertAccept(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('Before Alert Accept'); } @Override public void beforeAlertDismiss(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('Before Alert Dismiss'); } @Override public void beforeChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence() arg2) { // TODO Auto-generated method stub System.out.println('Before Change Value of'+arg0); } @Override public void beforeClickOn(WebElement arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('Before Click on'+arg0); } @Override public void beforeFindBy(By arg0, WebElement arg1, WebDriver arg2) { // TODO Auto-generated method stub System.out.println('Before Find By'+arg0); } @Override public void beforeNavigateBack(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('Before Navigate Back'); } @Override public void beforeNavigateForward(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('Before Navigate Forward'); } @Override public void beforeNavigateRefresh(WebDriver arg0) { // TODO Auto-generated method stub System.out.println('Before Navigate Refresh'); } @Override public void beforeNavigateTo(String arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('Before Navigate To'+arg0); } @Override public void beforeScript(String arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('Before Script'); } @Override public void onException(Throwable arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('On Exception'+arg0); } }
2 단계: Listeners_Tests 클래스를 만들고 클래스 내부에 기본 메서드가 있는지 확인합니다. 리스너 클래스가 특정 이벤트에 대해 규정 된 브라우저 명령에 대해 작업을 수행 할 수 있도록 WebDriverListeners 클래스를 확장합니다.
Windows 10을위한 최고의 최적화 소프트웨어
Listeners_Tests 클래스에 아래 코드를 복사하여 붙여 넣으십시오. Java 애플리케이션과 같이 아래 코드를 실행하십시오.
샘플 코드 -2
package Listeners; import java.util.Arrays; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.Proxy; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.support.events.EventFiringWebDriver; public class Listeners_Tests extends WebDriverListeners{ static WebElement e; static ChromeDriver driver; public static void main(String() args) throws InterruptedException { // TODO Auto-generated method stub System.setProperty('webdriver.chrome.driver', 'E:\chromedriver.exe'); /*Setting the capabilities of Chrome Driver*/ try { DesiredCapabilities capabilities = DesiredCapabilities.chrome(); Proxy proxy = new Proxy(); String proxyServer = String.format('AProxyIDontWantToDisplay', System.getenv('proxy.username'), System.getenv('proxy.password')); proxy.setHttpProxy(proxyServer); capabilities.setCapability('proxy', proxy); ChromeOptions options = new ChromeOptions(); options.addArguments(Arrays.asList ('--no-sandbox','--ignore-certificate-errors','--homepage=about:blank','--no-first-run')); options.addArguments('disable-infobars'); capabilities.setCapability(ChromeOptions.CAPABILITY, options); driver = new ChromeDriver(capabilities); } catch (Exception e) { throw new Error(e); } /*---- Creating the instance of EventFiringWebDriver Class----*/ EventFiringWebDriver eventRecorder = new EventFiringWebDriver(driver); /*---- Creating the instance of parent class 'WebdriverListeners' class----*/ WebDriverListeners eCapture = new WebDriverListeners(); /* The below step registers the listeners for logging purpose*/ eventRecorder.register(eCapture); //Event One System.out.println('This is recording Event-One'); eventRecorder.navigate().to('https://www.google.com'); //Event Two System.out.println('This is recording Event-Two'); eventRecorder.findElement(By.xpath('//a(text()='Sign in')')).click(); //Event Three System.out.println('This is recording Event-Three'); eventRecorder.findElement(By.id('identifierId')).clear(); Thread.sleep(5000); //Event Four System.out.println('This is recording Event-Four'); eventRecorder.findElement(By.id('identifierId')).sendKeys('abc@gmail.com'); Thread.sleep(5000); //Event Five System.out.println('This is recording Event-Five'); eventRecorder.navigate().back(); //Event Six System.out.println('This is recording Event-Six'); eventRecorder.navigate().forward(); //Event Seven System.out.println('This is recording Event-Seven'); eventRecorder.navigate().refresh(); //Event Eight System.out.println('This is recording Event-Eight'); eventRecorder.get('https://www.irctc.co.in/eticketing/loginHome.jsf'); //Event Nine System.out.println('This is recording Event-Nine'); eventRecorder.findElement(By.id('loginbutton')).click(); try { Alert alert = eventRecorder.switchTo().alert(); // check if alert exists // TODO find better way alert.getText(); //Event Ten System.out.println('This is recording Event-Ten'); alert.accept(); } catch (Exception e) { } Thread.sleep(3000); eventRecorder.findElement(By.id('loginbutton')).click(); try { Alert alert = eventRecorder.switchTo().alert(); // check if alert exists // TODO find better way alert.getText(); //Event Eleven System.out.println('This is recording Event-Eleven'); alert.dismiss(); } catch (Exception e) { } //Intentionally giving wrong id so it triggers onException Listener--> Event Twelve System.out.println('This is recording Event-Twelve'); eventRecorder.findElement(By.id('loginbutn')).click(); } }
실행이 성공적으로 완료되면 콘솔에 기록 된 내용을 확인하십시오. 우리는 위 코드에 나열된 모든 이벤트에 참석할 것입니다.
콘솔의 스 니펫 # 1
이벤트 -1 : 이는 beforeNavigateTo 및 afterNavigateTo 이벤트를 기록하고 그에 따라 두 블록에 작성된 작업을 수행합니다.
이벤트 -2 : 이는 beforeFindBy 및 afterFindBy 이벤트를 기록하고 그에 따라 두 블록에 작성된 작업을 수행합니다. 이 두 이벤트 이후의 이벤트는 beforeClick 및 afterClick 이벤트를 다룹니다.
이벤트 3 : 이벤트의 beforeChangeValueOf 및 afterChangeValue를 기록합니다.
이벤트 -4 : 이벤트 -3과 동일합니다.
이벤트 -5 : 이는 beforeNavigateBack 및 afterNavigateBack 이벤트를 기록합니다.
이벤트 -6 : 그러면 beforeNavigateForward 및 afterNavigateForward 이벤트가 기록됩니다.
이벤트 -7 : 이는 beforeNavigateRefresh 및 afterNavigateRefresh 이벤트를 기록합니다.
이벤트 -8 : Event-1과 동일합니다.
이벤트 -9 : Event-2와 동일합니다.
콘솔의 스 니펫 # 2
이벤트 -10 : 그러면 beforeAlertAccept 및 afterAlertAccept와 같은 이벤트가 기록됩니다.
이벤트 -11 : 이것은 beforeAlertDismiss 및 afterAlertDismiss와 같은 이벤트를 기록합니다.
이벤트 -12 : 이것은 onException과 같은 이벤트를 기록하고 메시지를 던집니다.
리스너에 대한 간략한 설명이 Webdriver Listener의 작동 방식에 대한 아이디어를 제공하기를 바랍니다. WebDriverEventListener의 도움으로 앞서 언급했듯이이 인터페이스에서 사용할 수있는 모든 메서드를 구현해야합니다.
그러나 AbstractWebDriverEventListener 클래스의 도움으로 구현할 이벤트를 선택할 수 있습니다.
# 2) AbstractWebDriverEventListener 클래스
'AbstractWebDriverEventListener'클래스를 사용하여 리스너를 구현하는 단계 :
1 단계
수업 만들기“ AbstractWebDriverListener ”클래스를 확장합니다. AbstractWebDriverEventListener '
보시다시피 ' WebDriverEventListener ”, 확장 될 때이 클래스는 구현되지 않은 메서드를 추가하는 데 오류가 발생하지 않습니다. 프로젝트에서 구현할 방법을 선택할 수 있습니다.
아래 코드를 복사하여 붙여 넣으십시오.
샘플 코드 -3
package Listeners; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.events.AbstractWebDriverEventListener; public class AbstractWebDriverListeners extends AbstractWebDriverEventListener{ public void afterChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence() arg2) { // TODO Auto-generated method stub System.out.println('After value change of' +arg0); } public void afterClickOn(WebElement arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('After clicked'+arg0); } public void afterFindBy(By arg0, WebElement arg1, WebDriver arg2) { // TODO Auto-generated method stub System.out.println('After Find By'+arg1); } public void beforeChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence() arg2) { // TODO Auto-generated method stub System.out.println('Before Change Value of'+arg0); } public void beforeClickOn(WebElement arg0, WebDriver arg1) { // TODO Auto-generated method stub System.out.println('Before Click on'+arg0); } public void beforeFindBy(By arg0, WebElement arg1, WebDriver arg2) { // TODO Auto-generated method stub System.out.println('Before Find By'+arg0); } }
2 단계
''라는 이름으로 새 클래스를 만듭니다. AbstractListeners_Test ”그 안에“ AbstractWebDriverListeners ' 수업.
이 클래스 안에 아래 코드를 복사하여 붙여 넣으십시오.
샘플 코드 -4
package Listeners; import java.util.Arrays; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.Proxy; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.support.events.EventFiringWebDriver; public class AbstractListeners_Tests extends WebDriverListeners{ static WebElement e; static ChromeDriver driver; public static void main(String() args) throws InterruptedException { // TODO Auto-generated method stub System.setProperty('webdriver.chrome.driver', 'E:\chromedriver.exe'); /*Setting the capabilities of Chrome Driver*/ try { DesiredCapabilities capabilities = DesiredCapabilities.chrome(); Proxy proxy = new Proxy(); String proxyServer = String.format('AProxyIDontWantToDisplay', System.getenv('proxy.username'), System.getenv('proxy.password')); proxy.setHttpProxy(proxyServer); capabilities.setCapability('proxy', proxy); ChromeOptions options = new ChromeOptions(); options.addArguments(Arrays.asList ('--no-sandbox','--ignore-certificate-errors','--homepage=about:blank','--no-first-run')); options.addArguments('disable-infobars'); capabilities.setCapability(ChromeOptions.CAPABILITY, options); driver = new ChromeDriver(capabilities); } catch (Exception e) { throw new Error(e); } /*---- Creating the instance of EventFiringWebDriver Class----*/ EventFiringWebDriver eventRecorder = new EventFiringWebDriver(driver); /*---- Creating the instance of parent class 'AbstractWebdriverListeners' class----*/ AbstractWebDriverListeners eCapture = new AbstractWebDriverListeners(); /* The below step registers the listeners for logging purpose*/ eventRecorder.register(eCapture); //Event One System.out.println('This is recording Event-One'); eventRecorder.navigate().to('https://www.google.com'); //Event Two System.out.println('This is recording Event-Two'); eventRecorder.findElement(By.xpath('//a(text()='Sign in')')).click(); //Event Three System.out.println('This is recording Event-Three'); eventRecorder.findElement(By.id('identifierId')).clear(); Thread.sleep(5000); //Event Four System.out.println('This is recording Event-Four'); eventRecorder.findElement(By.id('identifierId')).sendKeys('abc@gmail.com'); Thread.sleep(5000); //Event Five System.out.println('This is recording Event-Five'); eventRecorder.navigate().back(); //Event Six System.out.println('This is recording Event-Six'); eventRecorder.navigate().forward(); //Event Seven System.out.println('This is recording Event-Seven'); eventRecorder.navigate().refresh(); //Event Eight System.out.println('This is recording Event-Eight'); eventRecorder.get('https://www.irctc.co.in/eticketing/loginHome.jsf'); //Event Nine System.out.println('This is recording Event-Nine'); eventRecorder.findElement(By.id('loginbutton')).click(); try { Alert alert = eventRecorder.switchTo().alert(); // check if alert exists // TODO find better way alert.getText(); //Event Ten System.out.println('This is recording Event-Ten'); alert.accept(); } catch (Exception e) { } Thread.sleep(3000); eventRecorder.findElement(By.id('loginbutton')).click(); try { Alert alert = eventRecorder.switchTo().alert(); // check if alert exists // TODO find better way alert.getText(); //Event Eleven System.out.println('This is recording Event-Eleven'); alert.dismiss(); } catch (Exception e) { } //Intentionally giving wrong id so it triggers onException Listener--> Event Twelve System.out.println('This is recording Event-Twelve'); eventRecorder.findElement(By.id('loginbutn')).click(); } }
이 클래스에는 이전에 기록 된 이벤트도 있지만 Listener 클래스는 6 개의 이벤트 만 구현하도록 제한했기 때문에 다른 이벤트는 삭제하고 언급 된 이벤트에 대한 로그 만 표시합니다.
콘솔 창보기
위의 이미지에서 노란색으로 표시된 부분을 볼 수 있듯이 AbstractWebDriverListeners 클래스가 트리거되었습니다.
결론
WebDriver 리스너는 브라우저 이벤트를 수신하고 그에 따라 응답하는 인터페이스입니다. WebDriverEventListener의 도움으로 구현하는 경우이 인터페이스와 관련된 모든 메서드를 구현해야합니다.
AbstractWebDriverEventListener 클래스를 사용하여 WebDriver Listener를 구현하는 경우 구현할 메서드를 선택할 수 있습니다.
추천 도서
- Cucumber Selenium 튜토리얼 : Cucumber Java Selenium WebDriver 통합
- Selenium WebDriver 소개 – Selenium Tutorial # 8
- ChromeDriver Selenium 자습서 : Chrome에서 Selenium Webdriver 테스트
- 첫 번째 WebDriver 스크립트 구현 – Selenium WebDriver Tutorial # 10
- 30 개 이상의 최고의 셀레늄 튜토리얼 : 실제 예제로 셀레늄 배우기
- 셀레늄 FAQ
- Selenium WebDriver에서 경고 / 팝업을 처리하는 방법-Selenium Tutorial # 16
- Selenium WebDriver의 암시 적 및 명시 적 대기 (Selenium 대기 유형)