Hi Emanuel,

thanks for providing this example. The one WebDriver instance is correctly managed in the WebDriverProvider.end() method.

The FluentWebDriver instances are not managed in the same way - they are not WebDriver instances and there is no lifecycle management. There is an instance created for each page, each using the same WebDriver instance as delegate.

I'm not sure this constitutes a memory leak, simply that the instances are not removed at the end of the story execution. But that could easily apply to other objects as well.

Are you experiencing any specific issues as a consequence of this? If so, I'd would add a FluentLifecycleSteps class method that finds the ThreadLocal instances of FluentWebDriver and nullifies them, and we can annotate it @AfterStory.

Cheers

On 30/07/2014 21:39, Emanuel Campolo wrote:
Hi Mauro,

I could reproduce the memory leak. To do that, I created a project from the jbehave-web archetype and made the some modifications in order to get some logs. I also refactored some of the page objects since the default test cases had some errors due to etsy home page modifications.

This is the project:
https://github.com/emacampolo/etsy-jbehave/tree/jbehave-web-possible-memory-leak

And this is the class that prints the logs:
https://github.com/emacampolo/etsy-jbehave/blob/jbehave-web-possible-memory-leak/src/main/java/org/jbehave/tutorials/etsy/steps/JournaledStoriesSteps.java

Below you can find the output (I print all the ThreadLocal instances that are subclasses of WebDriver or FluentWebDriver).

*Narrative:*
*In order to show the browsing cart functionality*
*As a user*
*I want to browse in a gallery*
*Scenario: Browsing around the site for items*
****************************************
*LOGGING BEFORE SCENARIO*
*
*
*Thread name: main*
*DoublyOverriddenFirefoxDriver: firefox on LINUX (eea68437-dfb6-4783-9ebf-d3b2c95c9f28)*
****************************************
*Given I am on etsy.com <http://etsy.com>*
*When I want to browse through an art gallery*
*When I want to buy something from etsy.com <http://etsy.com>*
*When I want to browse the Art*
*When I choose the first art gallery*
*Then results will be displayed in the gallery*
*
*
****************************************
*LOGGING BEFORE CALLING END()*
*
*
*Thread name: main*
*org.seleniumhq.selenium.fluent.FluentWebDriver@1570e827*
*Thread name: main*
*org.seleniumhq.selenium.fluent.FluentWebDriver@27996370*
*Thread name: main*
*org.seleniumhq.selenium.fluent.FluentWebDriver@474f625f*
*Thread name: main*
*org.seleniumhq.selenium.fluent.FluentWebDriver@2cc36f8c*
*Thread name: main*
*DoublyOverriddenFirefoxDriver: firefox on LINUX (eea68437-dfb6-4783-9ebf-d3b2c95c9f28)*
****************************************
*
*
*[INFO] 2 stories excluded by filter: +category browsing*
*
*
*
*
*(AfterStories)*
****************************************
*LOGGING AFTER STORIES*
*
*
*Thread name: main*
*org.seleniumhq.selenium.fluent.FluentWebDriver@1570e827*
*Thread name: main*
*org.seleniumhq.selenium.fluent.FluentWebDriver@27996370*
*Thread name: main*
*org.seleniumhq.selenium.fluent.FluentWebDriver@474f625f*
*Thread name: main*
*org.seleniumhq.selenium.fluent.FluentWebDriver@2cc36f8c*
****************************************

As you can see, by the time the suite is over, there are 4 FluentWebDriver instances (one for each page object that is created) attached to the current thread. On the other hand, you may notice that the *DoublyOverriddenFirefoxDriver *is removed correctly. There are a couple of approaches to solve this. First, let's validate this issue.


Note: If you want to run it, please use the following filter since the other test cases seems not to be working

mvn clean install -Dmeta.filter="+category browsing"


2014-07-30 13:47 GMT-03:00 Mauro Talevi <mauro.tal...@aquilonia.org <mailto:mauro.tal...@aquilonia.org>>:

    It's your right to use alternative implementations, but at least
    the interfaces should be the same and the maven dependencies declared.

    If you find there's a bug in an implementation, the best way to
    address it is to provide a same project that reproduces it and
    perhaps a patch for it.

    On 30/07/2014 18:21, Emanuel Campolo wrote:

    Please dont get me wrong. I do want to help. I've copied some
    classes because i found out that I could have memory leak issues
    using the FluentWebDriverPage.
    I will send you some logs using a newly created project with the
    jbehave-web archetype.

    On Jul 30, 2014 1:09 PM, "Mauro Talevi"
    <mauro.tal...@aquilonia.org <mailto:mauro.tal...@aquilonia.org>>
    wrote:

It seems to me that you're not even using jbehave-web. You've copied selected classes from it into your project and
        using them in a way which is different from jbehave-web, e.g.
        introducing another factory abstraction.

        If you'd help on using jbehave-web, including resolving
        issues with its current implementation, we'd be happy to help.

        If you're writing your own framework, then we can't help.

        Cheers

        On 30/07/2014 17:52, Emanuel Campolo wrote:
        Hi Mauro, thanks for taking your time to reply.

        I mentioned PerStoryWebDriverSteps as an example of how the
        framework cleans up the resources. In this case, when the
        end() method is invoked, the ThreadLocal<WebDriver> instance
        associated with the current thread is removed but, if you'd
        used a FluentWebDriverPage instead of a WebDriverPage, a
        ThreadLocal<FluentWebDriver> will not be eliminated from the
        list of thread locals.
        Even though im not using the jbehave-core for running my
        tests, Im coding a lightweight selenium-based framework
        using testng and the jbehave-web project.
        As you can see below, I had to re write some of the classes
        to solve this issue where resources are not being removed by
        the DelegatingWebDriverProvider (javadoc and reference to
        jbehave-web will be added):

        
https://github.com/emacampolo/hatchery/blob/master/src/main/java/com/hatchery/core/DefaultWebDriverProvider.java
        
https://github.com/emacampolo/hatchery/blob/master/src/main/java/com/hatchery/core/pages/FluentWebDriverPage.java

        This is where I invoke the end() method
        
https://github.com/emacampolo/hatchery/blob/master/src/main/java/com/hatchery/core/Suite.java


        2014-07-30 12:06 GMT-03:00 Mauro Talevi
        <mauro.tal...@aquilonia.org
        <mailto:mauro.tal...@aquilonia.org>>:

            Hi,

            the FluentWebDriverPage is simply a fluent-based facade
            using a FluentWebDriver.   The underlying
             WebDriverProvider is the same as a non-fluent page and
            is injected in the constructor.

            The PerStoryWebDriverSteps should use exactly the same
            underlying WebDriverProvider (autowired via some
            dependency-injection mechanism), so if the provider
            end() method is invoked you shouldn't need to do
            anything else.

            Are you experiencing or noticing a particular problem?
             If so, could you share a project that reproduced it?

            Cheers


            On 29/07/2014 19:14, Emanuel Campolo wrote:

                Hi all !

                I've added the jbehave-web module to a personal
                project where I use testng. I'm using the
                FirefoxWebDriverProvider to manage the webdriver
                instances, taking advantage of the ThreadLocal for
                multithreaded tests.
                My question is, even though I call the end() method
                every time a test completes to remove the driver
                assigned to the current thread, i don't know how to
                the same thing to the FluentWebDriver (a thread
                local variable that the FluentWebDriverPage has).

                I noticed that , for example, the
                PerStoryWebDriverSteps only executes
                driverProvider.end() but as in mentioned above,  i
                didn't find any clean up for the FluentWebDriver
                instances that FluentWebDriverPage creates.

                Thanks in advance :)



            
---------------------------------------------------------------------
            To unsubscribe from this list, please visit:

            http://xircles.codehaus.org/manage_email







Reply via email to