Well done Mauro!
Thanks a lot.
I have created the JIRA as requested:
http://jira.codehaus.org/browse/JBEHAVE-885
Let me know if its OK.
Regards,
Julien.

2013/2/17 Mauro Talevi <[email protected]>

>  Hi Julien,
>
> I found the root cause.  In your Home class, you're trying to get the
> WebDriver instance in the constructor:
>
> public class Home extends AbstractPage {
>
>     private final WebDriver driver;
>
>     public Home(WebDriverProvider driverProvider) {
>         super(driverProvider);
>         this.driver = driverProvider.get();
>     }
>
>     public void doRegister() {
>         driver.findElement(By.name("member.doRegister")).submit();
>     }
>
>
> }
>
> This is not the way the WebDriverProvider is meant to work.  Instead, you
> should keep a reference of the provider and invoke the get() method every
> time you need it.
>
> public class Home extends AbstractPage {
>
>     private WebDriverProvider driverProvider;
>
>     public Home(WebDriverProvider driverProvider) {
>         super(driverProvider);
>         this.driverProvider = driverProvider;
>     }
>
>     public void doRegister() {
>
> driverProvider.get().findElement(By.name("member.doRegister")).submit();
>     }
>
> }
>
> The reason is that at instantiation of the class the DriverProvider has
> not been initialised.
>
> Please raise a documentation JIRA issue so we can explain it in more
> detail for the benefit of others.
>
> Cheers
>
>
> On 17/02/2013 13:00, Mauro Talevi wrote:
>
> The cause is that (most often) it's not set properly in the first place.
> Normally, this happens in the @BeforeScenario/Story annotated methods (in
> the PerScenario/StoryWebDriverSteps).
>
> I notice you're using a mixed setup (@UsingSpring and @UsingSteps).   That
> may well get the DI injection confused.   Otherwise, please debug and check
> that the PerStoryWebDriverSteps class is instanciated and the @Before
> method is invoked before the running of the stories.
>
> Try using only one, e.g. the spring one.  I'll investigate further.
>
> Cheers
>
> On 16/02/2013 18:41, Julien Martin wrote:
>
> Still no luck with this issue....
>
> I think I found the relevant code that causes the error:
>
>  public WebDriver get() {
>         WebDriver webDriver = delegate.get();
>         if (webDriver == null) {
>             throw new DelegateWebDriverNotFound();
>         }
>         return webDriver;
>     }
>
>  In my case the local variable webDriver is null! Now I would be very 
> grateful if someone told me what could cause the Threalocal delegate to 
> return null in the first place?
>
> Regards,
>
> Julien.
>
>   2013/2/12 Mauro Talevi <[email protected]>
>
>>  Yes please send me the project.
>>
>>
>> On 12 Feb 2013, at 21:14, Julien Martin <[email protected]> wrote:
>>
>>  Hi Mauro,
>> Thanks for your reply. I am sorry I can't provide a code on github.
>> However, I can send a zipped maven project to your email if you wish.
>> As far as the extra steps are concerned, I removed the steps with the
>> @BeforeScenario and it does not make any difference. I am really not sure
>> where the problem comes from...
>> Let me know if I can mail you the maven project.
>> Regards,
>> Julien.
>>
>>
>>
>> 2013/2/12 Mauro Talevi <[email protected]>
>>
>>>  I've not been able to investigate your problem as I would need to
>>> first reproduce it.  This is why I was asking for a fork on github where we
>>> could reproduce and investigate it.
>>>
>>> WRT your questions:
>>>
>>> 1.  the issue is most likely in the extra @BeforeScenario/Story steps
>>> that you've defined.  The WebDriver is set in the
>>> PerScenario/StoryWebDriverSteps annotated methods
>>> 2.  it's got nothing to do with the location of the java/story files.
>>>
>>>
>>> On 12/02/2013 16:41, Julien Martin wrote:
>>>
>>> Hi Mauro!
>>>
>>> My codebase is actually slightly different from the one described in the
>>> JIRA. I do get the same error message though...
>>>
>>>  I've spent the best of the day trying to figure out the difference
>>> between my codebase and that of the maven archetype (spring+web) which does
>>> work fine. To no avail.
>>>
>>>  I have two questions:
>>> 1. By looking at the code provided in my prior email, can you spot
>>> something wrong?
>>> 2. Can you tell me whether all my JBehave code (java files, story files)
>>> should be located in src/main/ or src/test?
>>>
>>>  Regards,
>>>
>>>  Julien.
>>>
>>> 2013/2/12 Mauro Talevi <[email protected]>
>>>
>>>>  I've commented on it.
>>>>
>>>> Same advice to you:
>>>>
>>>> Would it be possible for you to clone the jbehave-tutorial in github
>>>> and provide your modifications in different branches?
>>>>
>>>> In this way, it's much easier to see what changing wrt to a working
>>>> scenario to work with an easily reproducible codebase.
>>>> Cheers
>>>>
>>>>
>>>> On 12/02/2013 14:28, Julien Martin wrote:
>>>>
>>>> Hi,
>>>> I noticed someone has encountered the same problem. See here:
>>>> http://jira.codehaus.org/browse/JBEHAVE-790
>>>> Any update on this issue?
>>>> Julien.
>>>>
>>>> 2013/2/11 Julien Martin <[email protected]>
>>>>
>>>>> Hello,
>>>>>
>>>>> I am trying to set up a JBehave + Spring based on the Etsy samples.
>>>>>
>>>>>  However, here is what I get when I run the stories:
>>>>>
>>>>>  org.springframework.beans.factory.BeanCreationException: Error
>>>>> creating bean with name 'steps' defined in class path resource
>>>>> [META-INF/spring/steps.xml]: Instantiation of bean failed; nested 
>>>>> exception
>>>>> is org.springframework.beans.BeanInstantiationException: Could not
>>>>> instantiate bean class [com.bignibou.bdd.steps.WebSteps]: Constructor 
>>>>> threw
>>>>> exception; nested exception is
>>>>> org.jbehave.web.selenium.DelegatingWebDriverProvider$DelegateWebDriverNotFound:
>>>>> WebDriver has not been found for this thread.
>>>>> Please verify you are using the correct WebDriverProvider, with the
>>>>> appropriate credentials if using remote access, e.g. to SauceLabs:
>>>>> -DSAUCE_USERNAME=xxxxxx -DSAUCE_ACCESS_KEY=xxx-xxxx-xxxx-xxxx-xxx
>>>>>
>>>>>  Can anyone please help?
>>>>>
>>>>>  Regards,
>>>>>
>>>>>  Julien.
>>>>>
>>>>>  Here is my Stories source:
>>>>>
>>>>>  @RunWith(SpringAnnotatedEmbedderRunner.class)
>>>>> @Configure()
>>>>> @UsingEmbedder(embedder = Embedder.class, generateViewAfterStories =
>>>>> true, ignoreFailureInStories = true, ignoreFailureInView = true)
>>>>> @UsingSpring(resources = {
>>>>> "classpath:META-INF/spring/applicationContext.xml",
>>>>> "classpath:META-INF/spring/steps.xml" })
>>>>> @UsingSteps(instances = { WebSteps.class })
>>>>> public class SpringWebStories extends InjectableEmbedder {
>>>>>
>>>>>  @Test
>>>>>  public void run() {
>>>>>  injectedEmbedder().runStoriesAsPaths(storyPaths());
>>>>>  }
>>>>>
>>>>>  protected List<String> storyPaths() {
>>>>>  String searchInDirectory =
>>>>> CodeLocations.codeLocationFromPath("src/test/java").getFile();
>>>>>  return new StoryFinder().findPaths(searchInDirectory,
>>>>> Arrays.asList("**/*.story"), null);
>>>>>  }
>>>>> }
>>>>>
>>>>>  Here is my WebSteps source:
>>>>>
>>>>>  public class WebSteps {
>>>>>
>>>>>  @Autowired
>>>>>  private JavaMailSender javaMailSender;
>>>>>
>>>>>  private Home home;
>>>>>
>>>>>  public WebSteps(PageFactory factory) {
>>>>>  this.home = factory.home();
>>>>>  }
>>>>>
>>>>>  @Given("the following email address: $email and a chosen member
>>>>> status of $status and the following password: $password")
>>>>>  public void anonymousVisitorEntersDetails(String email, String
>>>>> status, String password) {
>>>>>  System.out.println("instance:" + javaMailSender);
>>>>>  home.open();
>>>>>  home.enterDetails(email, status, password);
>>>>>  }
>>>>>
>>>>>  @When("the anonymous visitor signs up")
>>>>>  public void anonymousVisitorDoesRegister(String login, String
>>>>> password) {
>>>>>  home.doRegister();
>>>>>  }
>>>>>
>>>>>  @Then("a confirmation email with activation information is sent to
>>>>> the anonymous visitor")
>>>>>  public void activationInformationIsSent() {
>>>>>
>>>>>  }
>>>>>
>>>>>  ...
>>>>>
>>>>>  Here is my steps.xml:
>>>>>
>>>>>  <beans xmlns="http://www.springframework.org/schema/beans";
>>>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>>>>  xsi:schemaLocation="http://www.springframework.org/schema/beans
>>>>>
>>>>> http://www.springframework.org/schema/beans/spring-beans-2.5.xsd";>
>>>>>
>>>>>  <bean id="driverProvider"
>>>>> class="org.jbehave.web.selenium.FirefoxWebDriverProvider">
>>>>>  </bean>
>>>>>
>>>>>  <bean id="webDriverProvider"
>>>>> class="org.jbehave.web.selenium.PerStoryWebDriverSteps">
>>>>>  <constructor-arg ref="driverProvider" />
>>>>>  </bean>
>>>>>
>>>>>  <bean id="lifecycleSteps"
>>>>> class="com.bignibou.bdd.steps.LifecycleSteps">
>>>>>  <constructor-arg ref="driverProvider" />
>>>>>  </bean>
>>>>>
>>>>>  <bean id="pageFactory" class="com.bignibou.bdd.pages.PageFactory">
>>>>>  <constructor-arg ref="driverProvider" />
>>>>>  </bean>
>>>>>
>>>>>  <bean id="steps" class="com.bignibou.bdd.steps.WebSteps">
>>>>>  <constructor-arg ref="pageFactory" />
>>>>>  </bean>
>>>>> </beans>
>>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>
>
>
>

Reply via email to