참조
http://code.google.com/p/webdriver/wiki/PageObjects
http://code.google.com/p/webdriver/wiki/PageFactory

화면의 페이지를 나타내는 Page 객체들을 작성합니다. 화면에서 테스트할 주요 엘리먼트들은 WebElement로 표현하고, 각각의 엘리먼트를 애노테이션으로 찾을 수 있게 id나 name 또는 xpath를 사용하여 지정해 줍니다.

public class MemberForm {

    protected WebElement name;

    protected WebElement email;

    protected WebElement password;

    @FindBy(how = How.ID, using = "name.errors")
    protected WebElement nameError;

    @FindBy(how = How.ID, using = "email.errors")
    protected WebElement emailError;

    @FindBy(how = How.ID, using = "password.errors")
    protected WebElement passwordError;

    @FindBy(how = How.XPATH, using = "//input[@type='submit']")
    protected WebElement submit;

    public WebElement getName() {
        return name;
    }

...

}

원랜 Page 클래스에 있어야 할 속성들인데, 다른 Page에서도 공통으로 사용하는 속성들이라 상위 클래스로 빼냈습니다. 애노테이션을 붙이지 않으면, 자동은 화면에서 클래스의 변수명에 해당하는 id를 가진 엘리먼트를 찾아줍니다.
 
그 다음으로, 페이지에서 일어나는 사용자 액션을 메서드로 표현합니다.

public class MemberAddPage extends MemberForm {

    private WebDriver driver;

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

    public MemberAddPage addFail() {
        name.sendKeys("keesun");
        submit.submit();
        return PageFactory.initElements(driver, MemberAddPage.class);
    }

    public MemberListPage addSuccess() {
        password.sendKeys("123");
        email.sendKeys("keesun@whiteship.me");
        submit.submit();
        return PageFactory.initElements(driver, MemberListPage.class);
    }

}

이것을 이용하여 다음과 같은 테스트를 작성할 수 있습니다.

@RunWith(WebTestRunner.class)
@WarConfiguration(appName="springsprout")
@DataConfiguration(dataType=DataType.XML, location="integration/member/testData.xml")
public class MemberWebTest {

    @WebTest
    public void memberPages(){
        WebDriver driver = new HtmlUnitDriver();
        driver.get("http://localhost:8080/springsprout/member/list.do");
        MemberListPage listPage = PageFactory.initElements(driver, MemberListPage.class);
        assertEquals(2, listPage.getTableRows());

        MemberAddPage addPage = listPage.toAddForm();
        assertNotNull(addPage);

        MemberAddPage failedAddPage = addPage.addFail();
        assertNotNull(failedAddPage);
        assertEquals("required", failedAddPage.getEmailError().getText());
        assertEquals("required", failedAddPage.getPasswordError().getText());

        listPage = failedAddPage.addSuccess();
        assertNotNull(listPage);
        assertEquals(3, listPage.getTableRows());

...

}

물론, WebTUnit이 없다면, 수동으로 서버를 켜고, 데이터 넣고, 저 테스트를 실행하고, 다시 테스트 데이터를 정리하고, 서버를 내리는 작업을 반복해야겠지만.. WebTUnit이 있기 때문에 메이븐 콘솔에서 mvn verify를 실행하기만 하면 위의 작업들을 자동화 할 수 있습니다. 조금더 빠르고 이클립스에서 실행해 보고 싶다면, pom.xml을 약간 수정하여 cargo.wait 속성을 true로 바꾸고 mvn cargo:start로 서버를 실행한 다음, 이클립스에서 JUnit 테스트로 실행하면 됩니다.