2016-11-10 82 views
1

我需要登录才能开始测试。所以在我的测试类中,我使用@BeforeClass方法登录到我的应用程序。然后我开始测试,但没有奏效。当我从@BeforeClass中删除我的登录并将其放到我的测试中时,它工作正常。但我不想在我的所有测试中登录,然后才能开始测试。我认为我的对象是静态的,但我不知道为什么。 这是我不工作代码:Selenium设置测试

public class ModulesTests extends FunctionalTest { 

    static LoginPage loginPage; 
    static LoginPageReceipt loginPageReceipt; 

    @BeforeClass 
    public static void login() { 
     FunctionalTest.driver.get(GlobalVariables.URL); 
     loginPage = new LoginPage(FunctionalTest.driver); 
     loginPageReceipt = loginPage.login(GlobalVariables.USER_NAME, GlobalVariables.PASSWORD); 
    } 

    @Test 
    public void products() { 
     ProductsPage productsPage = loginPageReceipt.productsPage(); 
    }  
} 

下面是当它的工作原理:

public class ModulesTests extends FunctionalTest { 

@BeforeClass 
public static void login() { 
    FunctionalTest.driver.get(GlobalVariables.URL);   
} 

@Test 
public void products() { 
    LoginPage loginPage = new LoginPage(FunctionalTest.driver); 
    LoginPageReceipt loginPageReceipt = loginPage.login(GlobalVariables.USER_NAME, GlobalVariables.PASSWORD); 
    ProductsPage productsPage = loginPageReceipt.productsPage(); 
} 

}

我的班和休息:

public class FunctionalTest { 
    protected static WebDriver driver; 

    @BeforeClass 
    public static void setUp() { 
     ChromeOptions options = new ChromeOptions(); 
     options.addArguments("--start-maximized"); 
     System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\chromedriver.exe"); 
     driver = new ChromeDriver(options); 
     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
    } 

    @After 
    public void cleanUp() { 
     driver.manage().deleteAllCookies(); 
    } 

    @AfterClass 
    public static void tearDown() { 
     driver.close(); 
    } 
} 

public class LoginPage extends PageObject { 

    @FindBy(id = "UserName") 
    private WebElement userName; 

    @FindBy(id = "Password") 
    private WebElement password; 

    @FindBy(id = "loginButton") 
    private WebElement loginButton; 

    public LoginPage(WebDriver driver) { 
     super(driver); 
     assertTrue(userName.isDisplayed()); 
     assertTrue(password.isDisplayed()); 
     assertTrue(loginButton.isDisplayed()); 
    } 

    public void enterUserName(String userName) { 
     this.userName.clear(); 
     this.userName.sendKeys(userName); 
    } 

    public void enterUserPassword(String password) { 
     this.password.clear(); 
     this.password.sendKeys(password); 
    } 

    public LoginPageReceipt login(String userName, String password) { 
     enterUserName(userName); 
     enterUserPassword(password); 
     loginButton.click(); 
     return new LoginPageReceipt(driver); 
    } 
} 

public class LoginPageReceipt extends PageObject { 

    public NavigationModules mainNav; 

    @FindBy(xpath = "//*[@id=\"loginPartial\"]") 
    private WebElement userNamePanel; 

    @FindBy(id = "products-menuitem") 
    private WebElement goToProductsPage; 

    public LoginPageReceipt(WebDriver driver) { 
     super(driver); 
    } 

    public String loginConfirmation() { 
     return userNamePanel.getText(); 
    } 

    public ProductsPage productsPage() { 
     System.out.println(goToProductsPage.getText()); 
     goToProductsPage.click(); 
     return new ProductsPage(driver); 
    } 

    public NavigationModules initModuleNav() { 
     return new NavigationModules(driver); 
    } 
} 

public class ProductsPage extends PageObject { 

    @FindBy(id = "products-content-navigation") 
    private WebElement productMenu; 

    public ProductsPage(WebDriver driver) { 
     super(driver); 
     assertTrue(productMenu.isDisplayed()); 
    } 
} 

public class PageObject { 

    protected WebDriver driver; 

    public PageObject(WebDriver driver) { 
     this.driver = driver; 
     PageFactory.initElements(driver, this); 
     System.out.println(getClass().getName()); 
    } 
} 

编辑。我刚才看到,当我使用@BeforeClass方法时,我也得到java.lang.reflect.constructor.newinstance(未知源)异常。

+0

你在同一班有多少个@BeforeClass ?.我的意思是login()和setup()方法在同一个类中? – Morvader

+0

一,loginPage类中没有登录(),安装位于ModulesTest中。我将编辑这些课程。 – slovvic

+0

但也许你的建议是好的。我的测试有BeforeClass方法但我有这个方法的类扩展了也有BeforeClass方法的第二个类。 – slovvic

回答

0

您应该使用@Before,以便所有测试都必须在继续之前登录,同时@BeforeClass运行一次,并且在多个测试共享相同对象的情况下它很有用。请致电link

+0

但我不想在我所有的测试登录之前,我可以启动它们。 我想分享我的对象到另一个测试。 – slovvic

+1

登录是否成功?什么是你正在得到的错误? –

+0

是的,发生了一些奇怪的事情。我得到注销和NoSuchElementException什么是明显的,当我退出。 – slovvic