2015-10-18 64 views
0

我在我的WebDriver测试中遇到问题。两个测试一个接一个

在第一个包我有2个类(页)HomePage,LoginPage。

在secound包中我有测试 - goToLiginPageTest和LoginTest。

在goToLiginPage我检查,我在主页上,进入登录页面。

在LoginTest中检查我是否在登录页面并登录。

但是来自goToLiginPageTest的两个测试通过,但是来自LoginTest的测试失败。

我不确定这是不是我的textng.xlm错误,或者我犯了错误。请帮帮我。

public class HomePage { 
    WebDriver driver; 

    public static final String PAGE_TITLE = "page title"; 
    public static final String PAGE_URL = "www.blbl.pl"; 

@FindBy(xpath = "//*[@id='global-nav']/div/div/div[3]/ul/li[1]/a") 
WebElement LogInLink; 

    public HomePage(WebDriver driver){ 
     this.driver = driver; 
    } 

    public void isHomePage(){ 
     String pageTitle = driver.getTitle(); 
     Assert.assertEquals(pageTitle, PAGE_TITLE); 
    } 

    public void goToLoginPage(){ 
     LogInLink.click(); 
    } 
} 

LoginPage

public class LoginPage { 
WebDriver driver; 

public static final String PAGE_TITLE = "Login"; 

@FindBy(id="user_email") 
WebElement inputUserEmail; 

@FindBy(id="user_password") 
WebElement inputUserPassword; 


public LoginPage(WebDriver driver){ 
    this.driver = driver; 
} 

public void isLoginPage(){ 
    String pageTitle = driver.getTitle(); 
    Assert.assertEquals(pageTitle, PAGE_TITLE); 
} 

public void fillUserEmail(){ 
    inputUserEmail.sendKeys("[email protected]"); 
    Assert.assertEquals(inputUserEmail.getAttribute("value"), "[email protected]"); 
} 

public void fillUserPassword(){ 
    inputUserPassword.sendKeys("123456"); 
    Assert.assertEquals(inputUserPassword.getAttribute("value"), "123456"); 
} 

} 

GotoLoginPageTest

import pages.HomePage; 

public class GotoLoginPageTest { 
    WebDriver driver; 
    HomePage hp; 


    @BeforeClass 
    public void setup(){ 
     this.driver = new FirefoxDriver(); 
     hp = PageFactory.initElements(driver, HomePage.class); 
     driver.get(HomePage.PAGE_URL); 
    } 

    @Test(priority = 1) 
    public void isHomePage(){ 
     hp.isHomePage(); 
    } 

    @Test(dependsOnMethods = "isHomePage") 
    public void gotoLoginPage(){ 
     hp.goToLoginPage(); 
    } 

} 

LoginTest

public class LoginTest { 
    WebDriver driver; 

    LoginPage lp = PageFactory.initElements(driver, LoginPage.class); 

    @Test 
    public void cheskIsLoginPage(){ 
     lp.isLoginPage(); 
    } 

    @Test 
    public void logInBase(){ 
     lp.fillUserEmail(); 
     lp.fillUserPassword(); 
    } 

} 

我的testng.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Suite" parallel="none"> 
    <test name="Test"> 
    <classes> 
     <class name="tests.GotoLoginPageTest"/> 
     <class name="tests.LoginTest"/> 
    </classes> 
    </test> <!-- Test --> 
</suite> <!-- Suite --> 

我有错误

java.lang.NullPointerException 
    at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69) 
    at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38) 
    at com.sun.proxy.$Proxy5.sendKeys(Unknown Source) 
    at pages.LoginPage.fillUserEmail(LoginPage.java:30) 
    at tests.LoginTest.logInBase(LoginTest.java:27) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:659) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:845) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1153) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108) 
    at org.testng.TestRunner.privateRun(TestRunner.java:771) 
    at org.testng.TestRunner.run(TestRunner.java:621) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:357) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:259) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1199) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1124) 
    at org.testng.TestNG.run(TestNG.java:1032) 
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) 
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) 

回答

3

你从来没有实例化的驱动程序在LoginTest类。在那里实例化驱动程序并将其传递给页面对象。这样的事情:

public class LoginTest { 
    WebDriver driver; 
    driver = new FirefoxDriver(); 

    LoginPage lp = PageFactory.initElements(driver, LoginPage.class); 

    @Test 
    public void cheskIsLoginPage(){ 
     lp.isLoginPage(); 
    } 

    @Test 
    public void logInBase(){ 
     lp.fillUserEmail(); 
     lp.fillUserPassword(); 
    } 
} 
+0

但我不想创建新的FFdriver,我想在登录页面后登录。在同一个测试中。我只想要一个接一个地运行GotoLoginPageTest和LoginTest。林不知道,但我认为测试运行不良,首先是LoginTest和GotoLoginPageTest。我把这里放在eclipse屏幕上http://zapodaj.net/c776122be852e.png.html – ciupakabrans

+0

否则你必须传递一个null驱动程序到Loginpage。另一方面,您应该在全局创建驱动程序,而不是在每个测试对象中创建驱动程序。看到和示例[这里](https://github.com/safrrhmn/SeleniumTestNG/blob/master/src/main/java/com/github/tests/GitHubHomePageTests.java) – Saifur

+0

对不起,我的问题,但我不想在每个测试中创建新的firefoxDriver对象。我只是想做一个测试在哪里运行两个案例。如果我创建新的ffdriver,那么将会打开新的浏览器,我想在一个浏览器中执行这两种情况,一个接一个的 – ciupakabrans