2017-08-13 57 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'加載頁面?看起來你仍然使用原始的'driver'('driver.manage()。timeouts()')而不是'eventDriver'包裝器。 –

+2

EventFiringWebDriver用於偵聽通過該驅動程序上的代碼啓動的事件,而不是用戶生成的事件。如果用戶更改瀏覽器的URL,則不會在您的代碼上觸發事件。因此,只有當您對'eventDriver'對象採取行動時,纔會觸發此事件。 –

+0

@VinceEmigh謝謝!接得好。 – nicomp

回答

0

所以硒可與一系列模擬用戶交互的命令,通過這些命令給駕駛員。 Firefox我相信有一個插件允許您通過手動瀏覽來創建命令,然後您可以將其抽回到驅動程序中進行自動測試。

我在上面的示例代碼中看不到任何「單擊」或其他命令。有關以編程方式爲驅動程序發出命令的示例,請參見this

+0

我已經可以爲驅動程序發出命令了,沒問題。瀏覽器窗口關閉時,我無法讓驅動程序告訴我。 – nicomp

+0

停止驅動程序相當於瀏覽器窗口關閉。 – ZagNut

+0

我需要知道用戶何時關閉瀏覽器窗口。 – nicomp

0

你要照顧一對夫婦的東西在這裏如下:

  1. 要看到正在處理的一些瀏覽器的事件,你需要訪問一些url"https://google.com"
  2. 看到更多的瀏覽器事件,每事件處理程序,您需要訪問一些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] 
    
相關問題