发布硒代码维护

时间:2010-03-16 08:45:44

标签: junit selenium

我想将常用方法分组到一个文件中并使用它。例如,可以多次使用使用selenium登录页面。在类A中定义它并在类B中调用它。但是,它会抛出空指针异常。

A班有

public void test_Login() throws Exception
    {
        try{
        selenium.setTimeout("60000");
        selenium.open("http://localhost");
        selenium.windowFocus();
        selenium.windowMaximize();
        selenium.windowFocus();
        selenium.type("userName", "admin");
        selenium.type("password", "admin");
        Result=selenium.isElementPresent("//input[@type='image']");
        selenium.click("//input[@type='image']");
        selenium.waitForPageToLoad(Timeout);
        }
        catch(Exception ex)
        {   
            System.out.println(ex);
            ex.printStackTrace();
        }
    }

使用所有其他java语法

在B级

public void test_kk() throws Exception
    {

        try
        {
            a.test_Login();
        }
        catch(Exception ex)
        {
            System.out.println(ex);
            ex.printStackTrace();
        }
    }

所有语法。

当我执行B类时,我收到了这个错误,

java.lang.NullPointerException
        at A.test_Login(A.java:32)
        at B.test_kk(savefile.java:58)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at junit.framework.TestCase.runTest(TestCase.java:168)
        at junit.framework.TestCase.runBare(TestCase.java:134)
        at com.thoughtworks.selenium.SeleneseTestCase.runBare(SeleneseTestCase.j
ava:212)
        at junit.framework.TestResult$1.protect(TestResult.java:110)
        at junit.framework.TestResult.runProtected(TestResult.java:128)
        at junit.framework.TestResult.run(TestResult.java:113)
        at junit.framework.TestCase.run(TestCase.java:124)
        at junit.framework.TestSuite.runTest(TestSuite.java:232)
        at junit.framework.TestSuite.run(TestSuite.java:227)
        at junit.textui.TestRunner.doRun(TestRunner.java:116)
        at junit.textui.TestRunner.doRun(TestRunner.java:109)
        at junit.textui.TestRunner.run(TestRunner.java:77)
        at B.main(B.java:77)

我希望有人必须先尝试过这个。我可能会想念这里。

2 个答案:

答案 0 :(得分:2)

我们这样做的方式是,我们有一些带有静态方法的辅助类。在实际的测试用例中,我们设置了selenium对象并将对象传递给静态方法,以便它可以对它进行操作。

public BaseHelper
{
    public static login( final String username, final String password, final DefaultSelenium selenium )
    {
     selenium.type("userName", username);
     selenium.type("password", password);
     selenium.click("loginbutton");
    }
}


public LoginTest
{
    DefaultSelenium selenium;

    onSetup()
    {
      selenium = new DefaultSelenium(...);
    }  

    public testLogin()
    {
      BaseHelper.login( "admin", "admin", selenium);
      // assert that this passed
      BaseHelper.login( "foo", "bar", selenium);
      // assert this failed because no user 'foo'
      BaseHelper.login( "admin", "bar", selenium);
      // assert this failed because admin's password was incorrect
    }
}

希望这说明了这一点。

除了更好的可读性和更容易的维护之外,您还可以通过创建两个(或更多)selenium对象并在测试中传递它们来测试多用户行为。

答案 1 :(得分:1)

如何在A类中初始化selenium对象?你还记得从它在B级创建它的地方传递它吗?如果这是它的工作方式,那就很难看出代码的这一部分何时不包括在内......