我对Selenium WebDriver和JUnit相当陌生,正在测试一个Web应用程序,并且想知道在Junit中我的类设计是否正确,可以测试UI?
正如我所看到的人们使用合成的实例。

任何建议将不胜感激

Java类

public class OverviewPage {

private WebDriver driver;
private String URL = "http://www.google.com";
public String searchQuery = "BBC";

OverviewPage(WebDriver driver){
    this.driver = driver;
    driver.get(URL);
    if(!"Login".equals(driver.getTitle())){
       throw new IllegalStateException("Wrong site");

    }
}

By searchBox = By.id("siteSearchField");
By submitSearch = By.cssSelector("button.btn.searchIco");

 public OverviewPage searchBox(String findADealer){
     driver.findElement(searchBox).sendKeys(findADealer);
        return this;
}

public OverviewPage searchBoxDisplayed(){
    driver.findElement(searchBox);
    return this;
}



public FindADealerPage searchResults(){
    driver.findElement(searchBox).sendKeys(searchQuery);
    driver.findElement(submitSearch).click();
    String search = driver.getPageSource();
    boolean searchResults = search.contains(searchQuery);
    return new FindADealerPage(driver);
}

}

Junit
 public class OverviewPageTest {

 private WebDriver driver;
 public String searchQuery = "find a dealer";

By searchBox = By.id("siteSearchField");
By submitSearch = By.cssSelector("button.btn.searchIco");

@Before
public void setUp(){

 driver = new HtmlUnitDriver();
 driver.get("http://www.google.com");
}



@After
public void tearDown(){
    driver.quit();
}

@Test
public void checkTitle(){
    Assert.assertEquals("product edit", driver.getTitle());
}

@Test
public void checkSearchBoxExists(){
    boolean searchBoxes =  driver.findElement(searchBox).isDisplayed();
   Assert.assertTrue(searchBoxes);
}

@Test
public void searchResults(){
    driver.findElement(searchBox).sendKeys(searchQuery);
    driver.findElement(submitSearch).click();
    String search = driver.getPageSource();
    boolean searchResults = search.contains(searchQuery);
    Assert.assertTrue(searchResults);
}

}

最佳答案

您的Java类OverviewPage向我建议您要使用PageObject模型。

如果要遵循Google的示例(https://code.google.com/p/selenium/wiki/PageObjects),则可以将与特定页面有关的所有字段和方法放在PageObject而不是TestClass中。

例如,在您的TestClass中,实例化PageObject:

OverviewPage page = new OverViewPage(driver);

并在整个TestCals中,将driver.get("http://www.google.com");等替换为driver.get(page.URL);
基本上可以归结为-您的TestClass中不应包含任何引号。这种模式的好处是,当您有多个测试引用PageObject中的同一字段时,然后当您需要更新该字段时-您可以在一个地方轻松地做到这一点,而不是在整个测试中重构多行重复的代码。

同样,任何给定的测试不必多于两行-方法调用和断言。

因此,以您的测试searchResults()为例,您可以将以下行移动到page对象内的方法中:
driver.findElement(searchBox).sendKeys(searchQuery);
driver.findElement(submitSearch).click();
String search = driver.getPageSource();
boolean searchResults = search.contains(searchQuery);
return searchResults; // added this one...

您的测试变为:
@Test
public void searchResults(){
    boolean searchResults = page.searchResults();
    Assert.assertTrue(searchResults);
}

那是我的解释。希望能帮助到你!

09-27 03:12