2017-08-13 4 views
0

私のコードは、ブラウザウィンドウを開き、URLを参照する限り動作します。私のコードにはエラーはありません。私は、特にユーザーがブラウザのウィンドウを閉じるときに、ブラウザによって生成されたイベントを処理する必要があります。私のOverrideClassには、どのメッセージもキャッチされません。なぜこのコードはブラウザのイベントを処理しませんか?

私はこれを持っている:

try { 
    System.setProperty("webdriver.gecko.driver", "./geckodriver.exe"); 
    driver = new FirefoxDriver(); 

    EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver); 
    OverrideClass oc = new OverrideClass(); 
    eventDriver.register(oc); 
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
} catch (Exception ex) { 
    Log.logError("Browser.initBrowser(): " + ex.getLocalizedMessage()); 
} 

メッセージハンドラは次のようになります。

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.events.WebDriverEventListener; 

public class OverrideClass implements WebDriverEventListener{ 
// @Override 
// public void afterChangeValueOf(WebElement arg0, WebDriver arg1) { 
// 
// } 
    @Override 
    public void afterClickOn(WebElement arg0, WebDriver arg1) { 
     System.out.println("OverrideClass.afterClickOn(): " + arg0.toString()); 
    } 
    @Override 
    public void afterFindBy(By arg0, WebElement arg1, WebDriver arg2) { 
     System.out.println("OverrideClass.afterFindBy(): " + arg0.toString()); } 
    @Override 
    public void afterNavigateBack(WebDriver driver) { 
     System.out.println("After clicking back "+ driver.getCurrentUrl()); 
    } 
    @Override 
    public void afterNavigateForward(WebDriver arg0) { 

    } 
    @Override 
    public void afterNavigateTo(String arg0, WebDriver arg1) { 

    } 
    @Override 
    public void afterScript(String arg0, WebDriver arg1) { 

    } 
// @Override 
// public void beforeChangeValueOf(WebElement arg0, WebDriver arg1) { 
// 
// } 
    @Override 
    public void beforeClickOn(WebElement arg0, WebDriver arg1) { 

    } 
    @Override 
    public void beforeFindBy(By arg0, WebElement arg1, WebDriver arg2) { 

    } 
    @Override 
    public void beforeNavigateBack(WebDriver driver) { 
     System.out.println("OverrideClass.beforeNavigateBack() Before clicking back: " + driver.getCurrentUrl()); 
    } 
    @Override 
    public void beforeNavigateForward(WebDriver arg0) { 
     System.out.println("OverrideClass.beforeNavigateForward() Before clicking back: " + arg0.getCurrentUrl()); 
    } 
    @Override 
    public void beforeNavigateTo(String arg0, WebDriver arg1) { 
     System.out.println("OverrideClass.beforeNavigateTo(): " + arg0); 
    } 
    @Override 
    public void beforeScript(String arg0, WebDriver arg1) { 

    } 
    @Override 
    public void onException(Throwable arg0, WebDriver arg1) { 
     System.out.println("OverrideClass.onException(): " + arg0.getLocalizedMessage()); 
    } 
    @Override 
    public void afterAlertAccept(WebDriver arg0) { 


    } 
    @Override 
    public void afterAlertDismiss(WebDriver arg0) { 


    } 
    @Override 
    public void afterChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence[] arg2) { 


    } 
    @Override 
    public void afterNavigateRefresh(WebDriver arg0) { 


    } 
    @Override 
    public void beforeAlertAccept(WebDriver arg0) { 


    } 
    @Override 
    public void beforeAlertDismiss(WebDriver arg0) { 


    } 
    @Override 
    public void beforeChangeValueOf(WebElement arg0, WebDriver arg1, CharSequence[] arg2) { 


    } 
    @Override 
    public void beforeNavigateRefresh(WebDriver arg0) { 


    } 
} 
+2

あなたは 'eventDriver'経由でページをロードしていますか? 'eventDriver'ラッパーではなく、元の' driver'( 'driver.manage()。timeouts()')を使用しているようです。 –

+2

EventFiringWebDriverは、ユーザーが生成したイベントではなく、そのドライバのコードを通じて開始されるイベントをリスンするためのものです。ユーザーがブラウザのURLを変更すると、コードにイベントが発生しません。したがって、このイベントは、 'eventDriver'オブジェクトに対処するときにだけ発生します。 –

+0

@VinceEmighありがとう!良いキャッチ。 – nicomp

答えて

0

だから、セレンはドライバにこれらのコマンドを渡し、ユーザーの操作をエミュレートする一連のコマンドで動作します。 Firefox私は手動でブラウズしてコマンドを作成できるプラグインがあると思っています。それを自動テストのためにドライバにポンピングすることができます。

上記のサンプルコードで使用されている「クリック」やその他のコマンドは表示されません。プログラムでドライバのコマンドを発行する例については、thisを参照してください。

+0

私はすでにドライバのためのコマンドを発行することができますが、問題はありません。ブラウザのウィンドウが閉じたときにドライバに知らせることができません。 – nicomp

+0

ドライバを停止することは、ブラウザのウィンドウを閉じることと同じです。 – ZagNut

+0

ユーザーがブラウザウィンドウを閉じたときを知る必要があります。 – nicomp

0

あなたは次のようにここに詰め込むのカップルを世話をする必要があります。

  1. 一部のブラウザイベントはあなたがあたりとして、いくつかのより多くのブラウザのイベントを表示するには"https://google.com"
  2. のようないくつかのurlにアクセスする必要が処理されて表示するにはWebElementにアクセスする必要があるイベントハンドラ。
  3. ので、いくつかのイベントが発生している参照するには、あなたの最小限のコードは次のようになります。

    import org.openqa.selenium.By; 
    import org.openqa.selenium.WebDriver; 
    import org.openqa.selenium.WebElement; 
    import org.openqa.selenium.firefox.FirefoxDriver; 
    import org.openqa.selenium.support.events.EventFiringWebDriver; 
    
    public class my_program 
    { 
        public static void main(String[] args) 
        { 
         System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); 
         WebDriver driver = new FirefoxDriver(); 
         EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver); 
         OverrideClass oc = new OverrideClass(); 
         eventDriver.register(oc); 
         eventDriver.get("https://google.com"); 
         WebElement element = eventDriver.findElement(By.linkText("Gmail")); 
         element.click(); 
        } 
    
    } 
    
  4. さて、あなたはすでに変更されないまま処理されているブラウザのイベントを見るために、いくつかのSysoutsを作成しました。あなたがこのプログラムを実行すると

  5. 最後に、あなたはあなたのコンソールに次の出力が表示されます。

    OverrideClass.beforeNavigateTo(): https://google.com 
    OverrideClass.afterFindBy(): By.linkText: Gmail 
    OverrideClass.afterClickOn(): [[FirefoxDriver: firefox on XP (b1412059-9499-45ff-b49a-2bc69a3ace30)] -> link text: Gmail] 
    
関連する問題