java - 如何在页面工厂模式中使用WebDriver事件监听器

标签 java selenium-webdriver

我得到了如何在 selenium 中以正常方式使用 WebDriverEventListener 的代码。 但不知道如何将其用于 PageFactory 模式。

代码如下,首先需要实现WebDriverEventListner接口(interface)

public class EventHandler implements WebDriverEventListener{

    private Log log = LogFactory.getLog(this.getClass());

    public void afterChangeValueOf(WebElement arg0, WebDriver arg1) {
        // TODO Auto-generated method stub
        log.info("inside method afterChangeValueOf on " + arg0.toString());
        log.info("inside method afterChangeValueOf on " + arg0.toString());
    }

    public void afterClickOn(WebElement arg0, WebDriver arg1) {
        // TODO Auto-generated method stub
        log.info("inside method afterClickOn on " + arg0.toString());
    }

    public void afterFindBy(By arg0, WebElement arg1, WebDriver arg2) {
        // TODO Auto-generated method stub
        log.info("Find happened on " + arg1.toString() 
                + " Using method " + arg0.toString());
    }

    public void afterNavigateBack(WebDriver arg0) {
        // TODO Auto-generated method stub

        log.info("Inside the after navigateback to " + arg0.getCurrentUrl());
    }

    public void afterNavigateForward(WebDriver arg0) {
        // TODO Auto-generated method stub
        log.info("Inside the afterNavigateForward to " + arg0.getCurrentUrl());
    }

    public void afterNavigateTo(String arg0, WebDriver arg1) {
        // TODO Auto-generated method stub
        log.info("Inside the afterNavigateTo to " + arg0);
    }

    public void afterScript(String arg0, WebDriver arg1) {
        // TODO Auto-generated method stub
        log.info("Inside the afterScript to, Script is " + arg0);
    }

    public void beforeChangeValueOf(WebElement arg0, WebDriver arg1) {
        // TODO Auto-generated method stub

        log.info("Inside the beforeChangeValueOf method");
    }

    public void beforeClickOn(WebElement arg0, WebDriver arg1) {
        // TODO Auto-generated method stub
        log.info("About to click on the " + arg0.toString());

    }

    public void beforeFindBy(By arg0, WebElement arg1, WebDriver arg2) {
        // TODO Auto-generated method stub
        log.info("Just before finding element " + arg1.toString());

    }

    public void beforeNavigateBack(WebDriver arg0) {
        // TODO Auto-generated method stub
        log.info("Just before beforeNavigateBack " + arg0.getCurrentUrl());

    }

    public void beforeNavigateForward(WebDriver arg0) {
        // TODO Auto-generated method stub
        log.info("Just before beforeNavigateForward " + arg0.getCurrentUrl());

    }

    public void beforeNavigateTo(String arg0, WebDriver arg1) {
        // TODO Auto-generated method stub
        log.info("Just before beforeNavigateTo " + arg0);
    }

    public void beforeScript(String arg0, WebDriver arg1) {
        // TODO Auto-generated method stub
        log.info("Just before beforeScript " + arg0);
    }

    public void onException(Throwable arg0, WebDriver arg1) {
        log.info("Exception occured at " + arg0.getMessage());

    }

    public void afterNavigateRefresh(WebDriver arg0) {
        // TODO Auto-generated method stub

    }

    public void beforeNavigateRefresh(WebDriver arg0) {
        // TODO Auto-generated method stub

    }

}

接下来我们需要在脚本中使用它,如下所示:

@BeforeClass()
    public void signIn() throws Exception
        {

        BasicConfigurator.configure();
        PropertyConfigurator.configure(PROPERTIES_FILEPATH);

        log = Logger.getLogger("SuperTest");

        //Delete the test-output directory
        try
        {
        FileUtils.deleteDirectory(new File("./test-output"));
        }
        catch(Exception e)
        {

        }

        //Get the Browser Type and initiate the Driver
        driver = GenericUtilLibrary.initializeBrowser(driver, BROWSER_TYPE);
        driver.manage().deleteAllCookies();
        driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);
        driver.manage().window().maximize();

        //create a object for EventFiringWebDriver Class
        eventDriver = new EventFiringWebDriver(driver);

        //create object of the class (EventHandler) which implemented WebDriverEventListener Interface. 
        handler = new EventHandler();

       //register handler object with EventFiringWebDriver
        eventDriver.register(handler);


        eventDriver.get(URL);


        //CLICK ON SIGNIN BUTTON IN LOGIN PAGE.
        LoginPage lpage = new LoginPage(driver);
        lpage.clickSignInButton();


        //ENTER USER CREDENTIALS AND CLICK ON SIGNON BUTTON IN SIGNIN PAGE.
        SignInPage spage = new SignInPage(driver);
        spage.clickSignInButton(USERNAME, PASSWORD);
    }

注册后,当我们对所有 WebElement 使用 eventDriver 时,eventDriver 将处理 WebDriver 操作的日志记录。

直到 eventDriver.get(URL);我没有问题,但是当谈到下一步时,我将调用对象页面类并调用它们的方法。要发送 eventDriver 而不是驱动程序对象,当它调用第一个方法本身时,我得到 NULLPOINTEREXCEPTION。

我不知道如何使用 WebDriverEventListener。

请任何人帮助我解决这个问题。

最佳答案

在您的代码中,您有一个简单的错误。

而不是:

 //CLICK ON SIGNIN BUTTON IN LOGIN PAGE.
        LoginPage lpage = new LoginPage(driver);
        lpage.clickSignInButton();

您应该使用:

 //CLICK ON SIGNIN BUTTON IN LOGIN PAGE.
        LoginPage lpage = new LoginPage(handler);
        lpage.clickSignInButton();

关于java - 如何在页面工厂模式中使用WebDriver事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38822932/

相关文章:

java - 如何从一大块字符串中获取一行字符串?

java - 在 ArrayList 中添加重复元素的值

java - 在java中查找字符串中最小的单词

javascript - Selenium-Webdriver, driver.findElement(...).getLocation 不是一个函数,为什么?

java - 从容器中获取文本

node.js - WebdriverIO 中的循环元素

java - URI 中的百分比编码

python - 在 python 中使用 selenium 单击链接(<a> 标记,type=button)时出错

java - RemoteWebDriver.executeScript() 和 Selenium.getEval() 有什么区别?

java - 将参数传递给 ViewScoped Bean