2017-06-02 38 views
1

下面是我的方案的運行後得到的錯誤: -步驟:「我點擊馬上加入」不具有匹配的膠水代碼越來越當我將鼠標放置在臺階上

@scenario 
    Scenario: creating a account to user    # /Users/ajaysithagari/Documents/workspace/Selenium_Cucumber/features/signup.feature:6 
    Given I am landing on nike homepage    # CommonStepDefination.i_am_landing_on_nike_homepage() 
    And I click on join now       # SignupStepDefination.i_click_on_join_now() 
     java.lang.NullPointerException 
     at pages.Signup.join(Signup.java:12) 
     at step_defination.SignupStepDefination.i_click_on_join_now(SignupStepDefination.java:13) 
     at ✽.And I click on join now(/Users/ajaysithagari/Documents/workspace/Selenium_Cucumber/features/signup.feature:8) 

    When I provide the user the user details to join # SignupStepDefination.i_provide_the_user_the_user_details_to_join() 
    Then I need to see the user details    # SignupStepDefination.i_need_to_see_the_user_details() 

1 Scenarios (1 failed) 
4 Steps (1 failed, 2 skipped, 1 passed) 
0m8.658s 

這裏我的情況: - @feature 特點:爲了上申請 用戶需要創建帳戶

@scenario 方案:創建一個帳戶來考慮,我降落在耐克的主頁用戶 我點擊馬上加入 當我提供的用戶的用戶信息加入 然後,我需要看用戶詳細信息

Here is step defination for "given":- 
package step_defination; 
; 
import cucumber.api.java.en.Given; 
import utils.BrowserandDriver; 

public class CommonStepDefination { 

     String PageURL = "xxxxx"; 
     int ImplicitWait = 15; 
     int pageLoadTimeOut = 30; 
     String browserName = "safari"; 

     BrowserandDriver BD = new BrowserandDriver(); 

     @Before 
     public void launchBrowser() 
     { 
      BD.launchBrowser(browserName); 
      BD.maximizeBrowser(); 
      BD.setImplicitWait(ImplicitWait); 
      BD.setPageLoadTimeout(pageLoadTimeOut); 
     } 

     @Given("^I am landing on nike homepage$") 
     public void i_am_landing_on_nike_homepage() throws Throwable { 
     BD.launchApp(PageURL); 
     } 

     @After 
     public void tearDown(Scenario scenario) { 
     BD.tearDown(scenario); 
     } 
} 


    Here is my step defination:- 

    package step_defination; 

    import cucumber.api.java.en.And; 
    import cucumber.api.java.en.Then; 
    import cucumber.api.java.en.When; 
    import pages.Signup; 

    public class SignupStepDefination { 

     @And("^I click on join now$") 
     public void i_click_on_join_now() throws Throwable { 
      Signup sign = new Signup(); 
      sign.join(); 
     } 
    @When("^I provide the user the user details to join$") 
     public void i_provide_the_user_the_user_details_to_join() throws Throwable { 
     } 
     @Then("^I need to see the user details$") 
     public void i_need_to_see_the_user_details() throws Throwable { 
     } 

    Here is my page:- 

    package pages; 

    import org.openqa.selenium.By; 
    import org.openqa.selenium.WebDriver; 

    public class Signup { 

     public static WebDriver driver; 

     public void join() 
     { 
     driver.findElement(By.xpath("/html/body/div[7]/nav/div[1]/ul[2]/li[2]/button")).click(); 
     } 
    } 

每一件事情是好的,但是當我鼠標懸停在功能的文件,我得到這個錯誤的步驟(假設工作但是,當時然後不工作)步驟'我現在單擊加入'沒有匹配的膠水代碼@feature功能:爲了註冊用戶需要創建帳戶

@scenario場景:創建一個帳戶用戶鑑於我登陸耐克首頁我現在點擊加入當我提供用戶的用戶詳細信息加入然後我需要看到用戶的詳細信息

+1

選擇它你的'Signup'類聲明瞭一個靜態字段'WebDriver driver',但你永遠不會初始化它。這就是當你試圖調用'driver.findElement()'時會得到'NullPointerException'的原因' –

+0

[什麼是NullPointerException,以及如何修復它?](https://stackoverflow.com/questions/ 218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+0

我有問題嗎?我已經初始化了BrowserandDriver中的WebDriver驅動程序,但是如何使用此軟件包中的WebDriver驅動程序(BrowserandDriver)。我不想在每個包中初始化webdriver。謝謝 – Ajay

回答

0

如果您BrowserandDriver類看起來是這樣的:

package utils; 

import java.util.concurrent.TimeUnit; 

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.safari.SafariDriver; 

public class BrowserandDriver { 
    public static WebDriver driver; 

    public static void launchBrowser(String browserName) { 
     if (browserName.toLowerCase().contains("safari")) { 
      driver = new SafariDriver(); 
     } 
    } 

    public static void setPageLoadTimeout(int waitTime) { 
     driver.manage().timeouts().pageLoadTimeout(waitTime, TimeUnit.SECONDS); 
    } 

    public static void launchApp(String appURL) { 
     driver.get(appURL); 
    } 
} 

(我做了所有的方法靜態的,因爲它們只在靜態字段driver操作是這樣),那麼你可以寫你的腳步類像這樣(CommonStepDefination.java ):

package step_defination; 

import cucumber.api.java.en.Given; 
import utils.BrowserandDriver; 

public class CommonStepDefination { 
    String PageURL = "xxxxx"; 
    int ImplicitWait = 15; 
    int pageLoadTimeOut = 30; 
    String browserName = "safari"; 

    // no need for a BrowserandDriver instance here, since everything in BrowserandDriver is static 

    @Before 
    public void launchBrowser() 
    { 
     BrowserandDriver.launchBrowser(browserName); 
     BrowserandDriver.maximizeBrowser(); 
     BrowserandDriver.setImplicitWait(ImplicitWait); 
     BrowserandDriver.setPageLoadTimeout(pageLoadTimeOut); 
    } 
    // in other methods the references to the field BD must also be replaced with the class name BrowserandDriver 
} 

和Signup.java:

package pages; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 

public class Signup { 

    public void join() 
    { 
     BrowserandDriver.driver.findElement(By.xpath("/html/body/div[7]/nav/div[1]/ul[2]/li[2]/button")).click(); 
    } 
} 

在附註中,我不會選擇帶有By.xpath("/html/body/div[7]/nav/div[1]/ul[2]/li[2]/button")的按鈕 - 這將會與您在html頁面上做的幾乎每一項改變都打破。最好給這個按鈕一個唯一的ID(如joinButton)並用By.id("joinButton")

+0

你爲什麼使用this.BD = BD;你能解釋一下這件事嗎? BrowserandDriver BD是類,你如何使用私人BrowserandDriver BD; – Ajay

+0

@Ajay你的'CommonStepDefination'類還有一個字段'BrowserandDriver BD',你用'BD = new BrowserandDriver();'初始化。如果你想在'Signup'中這樣做,你會得到兩個不同瀏覽器的'BrowserandDriver'實例。所以我採取了一種不同的方法:在每個步驟類中定義一個「私人BrowserandDriver BD」字段,並使用傳入類構造函數的BrowserandDriver實例初始化它。 –

+0

如果我使用你的代碼,我得到getDriver錯誤。這裏是錯誤「方法getDriver()是未定義的類型 BrowserandDriver」 – Ajay

相關問題