Hi Mauro , Im not experiencing any articular issue but it's not a good idea to have those instances attached to a thread since memory leaks are plausible. Moreover, if you inspect those FluentWebDriver instances they keep the instance of the WebDriver object even after the end() method is called. (I think it is something that has to do with the garbage collector and weak references). We should also consider the scenario where multiple threads create a large amount of page objects. The number of page objects and therefore, the FluentWebDriver instances would increase considerably.
A FluentLifecycleSteps class is a good idea. Also, the provider could have a reference to a class thats if responsible to keep track of the threads locals instances that are created. This class could use the unique thread id value in a map. Maybe the provider is doing too much. We should delegate how we store resources (either WebDriver of FluentWebDriver instances) and how we eliminate them. 2014-07-31 14:12 GMT-03:00 Mauro Talevi <mauro.tal...@aquilonia.org>: > 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>: > >> 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> >> 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>: >>> >>>> 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 >>>> >>>> >>>> >>> >>> >> > >