Хороший рабочий пример Selenium2 и webdriver
Я использую селен 1, но теперь хочу перейти на selenium2/webdriver. Честно говоря, мне немного сложно начать с selenium2/webdriver. По сути, я не знаю, как работать между страницами. Вот мой пример:
public class LoginPage {
private final WebDriver driver;
public LoginPage(WebDriver driver) {
this.driver = driver;
}
public void loginAs(String username, String password) {
driver.get("http://url_to_my_webapp");
driver.findElement(By.id("username")).sendKeys(username);
driver.findElement(By.id("pwd")).sendKeys(password);
driver.findElement(By.className("button")).submit();
}
public static void main(String[] args){
LoginPage login = new LoginPage(new FirefoxDriver());
login.loginAs("user", "pass");
}
}
Теперь, после входа пользователя в систему, происходит перенаправление на другую страницу. Насколько я понимаю, теперь я должен создать новый объект страницы, представляющий текущую страницу... Дело в том, что я не знаю, как это сделать? Где я могу найти хорошие рабочие примеры, выходящие за рамки "привет мир"?
Как продолжить этот пример?
Спасибо заранее!
Ответы
Ответ 1
Эти сайты дают несколько примеров:
http://luizfar.wordpress.com/2010/09/29/page-objects/
http://www.wakaleo.com/blog/selenium-2-web-driver-the-land-where-page-objects-are -king
На этой странице приведены некоторые сведения об использовании PageFactory для поддержки объектов страницы:
http://code.google.com/p/selenium/wiki/PageFactory
Вы можете расширить свой пример для работы с объектами страницы, создав класс для каждой страницы, например:
public class MainPage
{
private final WebDriver driver;
public MainPage(WebDriver driver)
{
this.driver = driver;
}
public void doSomething()
{
driver.findElement(By.id("something")).Click;
}
}
и изменение loginA, чтобы вернуть класс, который представляет страницу, на которую браузер переходит после входа в систему:
public MainPage loginAs(String username, String password)
{
driver.get("http://url_to_my_webapp");
driver.findElement(By.id("username")).sendKeys(username);
driver.findElement(By.id("pwd")).sendKeys(password);
driver.findElement(By.className("button")).submit();
// Add some error checking here for login failure
return new MainPage(driver);
}
Ответ 2
Этот вопрос довольно старый, но я думал, что он все равно может быть полезен.
Как правило, сначала создаю требуемые классы объектов страницы.
Затем я создаю отдельный класс для тестовой логики, где вы бы поместили свой "рабочий процесс" кликов и других взаимодействий страниц. Из приведенного кода примера я предполагаю, что этот класс заменит main(). Это также класс, в который я включаю такие вещи, как testNG/junit, тестовые аннотации и dataProviders (строго не требуется, но если вы используете те вещи, которые могут быть полезны). В этом классе вы можете создавать экземпляры классов для страниц вы будете взаимодействовать с ними по мере необходимости, поскольку созданный вами объект webdriver управляет браузером, а не классами страниц.
Ведение дел таким образом позволяет легко изменять тестовые рабочие процессы, а также объекты страницы в случае изменения фактических страниц или просто новые требования к тестированию.
Мой любимый побочный эффект этого метода заключается в том, что класс с рабочим процессом может быть очень читаемым "script" теста со всеми уродливыми деталями в реальных тестах, скрытых под вызовами, такими как loginPage.Login() и loginPage.LoginSucceeded(), поэтому случайный проход не видит деталей пользовательских учетных данных, обрабатывает 404/400, находит и нажимает кнопку входа в систему и т.д.