webdriver listeners selenium
WebDriverリスナーとは何ですか? Selenium Automation Testingでリスナーが必要なのはなぜですか?このチュートリアルでは、サンプルコード例を使用してこれらの質問に詳細に回答します。
リスナーは、その名前が示すように、Seleniumコードで規定されているすべてのイベントを「リッスン」します。たとえば、要素をクリックする前に何が起こるかを知りたい場合。要素に移動する前後、または例外がスローされてテストが失敗したときに何が起こるかについては、リスナーが役立ちます。
Selenium Automation Testingでのリスナーの実際の使用法は、アクションの順序をログに記録し、例外がスローされたときにスクリーンショットを撮ることです。これにより、テスト実行の後の段階でのデバッグが容易になります。
=> ここですべてのSeleniumチュートリアルを確認してください。
学習内容:
Webdriverリスナーの実装
リスナーには主に2つのタイプがあります。
- Webdriverリスナー
- TestNGリスナー
まず、Webdriverリスナーがどのように機能するかを理解します。このチュートリアルでは、Webdriver EventListenerに焦点を当てます。
なぜWebdriverイベントリスナーを使用するのですか?
Webdriverの助けを借りて、ブラウザとWeb要素で多くのイベントをトリガーすることができます。実行中にトリガーされたすべてのイベントを追跡し、実行が完了したときのデバッグに役立ちます。
Webdriverイベントリスナーを実装する方法は2つあります。
- WebDriverEventListener これは、Webdriverイベントを追跡するためのいくつかの事前定義されたメソッドを持つインターフェースです。実装する必要があります すべて インターフェイスで事前定義されたメソッド。
- AbstractWebDriverEventListenerクラス これにより、関心のあるメソッドのみを実装する機能が提供されます。
#1) WebDriverEventListenerインターフェース
WebDriverEventListenerインターフェイスの実装に使用される事前定義されたメソッドを以下に示します。
(i)void beforeChangeValueOf(WebElement arg0、WebDriver arg1、CharSequence () arg2)
このメソッドは、Web要素でsendKeys()またはclear()操作を実行したときにトリガーされます。 (たとえば、driver.findElement(By.id( 'Login'))。clear())、トリガーされます 前 Web要素で操作を実行します。
パラメーター:
arg0= Web Element arg1=driver
(ii)void afterChangeValueOf(WebElement arg0、WebDriver arg1、CharSequence () arg2)
このメソッドは、Web要素でsendKeys()またはclear()操作を実行したときにトリガーされます。 (たとえば、driver.findElement(By.id( 'Login'))。clear())、トリガーされます 後 Web要素で操作を実行します。
パラメーター:
arg0= Web Element arg1=driver
(iii)void beforeClickOn(WebElement arg0、WebDriver arg1)
このメソッドがトリガーされます 前 Web要素をクリックします。
パラメーター:
arg0= Web Element arg1=driver
(iv)void afterClickOn(WebElement arg0、WebDriver arg1)
ビジネスアナリストのための行動面接の質問と回答
このメソッドがトリガーされます 後 Web要素をクリックします。
パラメーター:
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またはその他のロケーター')) 。それが行われます 前 Web要素を見つけます。
パラメーター:
arg0=locator arg1=Web Element arg2=driver
(xiv)void afterFindBy (arg0、WebElement arg1、WebDriver arg2による)
このメソッドは、コマンドを使用するとトリガーされます driver.findElement(By.id( '一部のIDまたはその他のロケーター')) 。それが行われます 後 Web要素を見つけます。
パラメーター:
arg0=locator arg1=Web Element arg2=driver
(xv)void onException(Throwable arg0、WebDriver arg1)
このメソッドは、例外がスローされるたびにスローされます。たとえば、Webdriverが要素を見つけることができない場合、Webdriverはこのメソッドをトリガーし、その中に記述されているコードを実行します。
パラメーター:
arg0=Exception arg1= driver
(xvi)void beforeAlertAccept(WebDriver arg0)
このメソッドは、画面にアラートボックスが表示されるたびにトリガーされ、正しくトリガーされます 前 「OKまたは同意する」ボタンをクリックします。
パラメーター:
arg0=driver
(xvii)void afterAlertAccept(WebDriver arg0)
このメソッドは、画面にアラートボックスが表示されるたびにトリガーされ、正しくトリガーされます 後 「OKまたは同意する」ボタンをクリックします。
パラメーター:
arg0=driver
(xviii)void beforeAlertDismiss(WebDriver arg0)
このメソッドは、画面にアラートボックスが表示されるたびにトリガーされ、正しくトリガーされます 前 「キャンセル」ボタンをクリックします。
パラメーター:
C ++で寝る方法
arg0=driver
(xix)void afterAlertDismiss(WebDriver arg0)
このメソッドは、画面にアラートボックスが表示されるたびにトリガーされ、正しくトリガーされます 後 「キャンセル」ボタンをクリックします。
パラメーター:
arg0=driver
これらは、で利用可能なすべての方法です WebDriverEventListener。 beforeScriptとafterScriptには他に2つのメソッドがありますが、このチュートリアルではそれらについては説明しません。
Eclipseの「WebDriverEventListener」インターフェースを使用してリスナーを実装する手順:
ステップ1: 「リスナー」という名前のパッケージを作成します。そのパッケージ内に、「 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を作成し、クラス内にmainメソッドがあることを確認します。 WebDriverListenersクラスを拡張して、リスナークラスが特定のイベント用に規定されたブラウザーコマンドで操作を実行できるようにします。
以下のコードをコピーして、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つのブロックに記述されたアクションが実行されます。
イベント2: これにより、イベントbeforeFindByとafterFindByが記録され、それに応じて2つのブロックに記述されたアクションが実行されます。これら2つのイベントの後のイベントは、beforeClickイベントとafterClickイベントをカバーします。
イベント-3: これは、イベントのbeforeChangeValueOfおよびafterChangeValueを記録します。
イベント-4: これはイベント3と同じです
イベント-5: これは、beforeNavigateBackイベントとafterNavigateBackイベントを記録します。
イベント-6: これは、beforeNavigateForwardイベントとafterNavigateForwardイベントを記録します。
イベント7: これは、beforeNavigateRefreshイベントとafterNavigateRefreshイベントを記録します。
イベント-8: これはイベント1と同じです
イベント-9: これはイベント2と同じです
コンソールのスニペット#2
イベント-10: これは、beforeAlertAcceptやafterAlertAcceptなどのイベントを記録します。
イベント-11: これにより、beforeAlertDismissやafterAlertDismissなどのイベントが記録されます。
経験豊富なセレンインタビューの質問と回答
イベント-12: これにより、onExceptionなどのイベントが記録され、メッセージがスローされます。
リスナーの簡単な説明が、Webdriverリスナーがどのように機能するかについてのアイデアを提供することを願っています。前に述べたように、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(); } }
このクラスにも以前に記録されたイベントがありますが、リスナークラスを6つのイベントのみを実装するように制限しているため、他のイベントを破棄し、言及されたイベントのログのみを表示します。
コンソールウィンドウビュー
上の画像で黄色でマークされた領域を見ることができるように、で実装されたメソッドのみ AbstractWebDriverListeners クラスがトリガーされました。
結論
WebDriverリスナーは、ブラウザーイベントをリッスンし、それに応じて応答するインターフェイスです。 WebDriverEventListenerを使用して実装する場合は、このインターフェイスに関連するすべてのメソッドを実装する必要があります
AbstractWebDriverEventListenerクラスを使用してWebDriverListenerを実装する場合は、実装するメソッドを選択できます。
=> Seleniumを最初から学ぶには、ここにアクセスしてください。
推奨読書
- Cucumber Seleniumチュートリアル:Cucumber Java SeleniumWebDriverの統合
- Selenium WebDriverの概要– Seleniumチュートリアル#8
- ChromeDriver Seleniumチュートリアル:ChromeでのSeleniumWebdriverテスト
- 最初のWebDriverスクリプトの実装– Selenium WebDriverチュートリアル#10
- 30以上の最高のSeleniumチュートリアル:実際の例でSeleniumを学ぶ
- Seleniumに関するFAQ
- Selenium WebDriverでアラート/ポップアップを処理する方法-Seleniumチュートリアル#16
- Selenium WebDriverでの暗黙的および明示的な待機(Selenium待機のタイプ)