Помогите сделать красиво
#1
Отправлено 19 июня 2012 - 05:29
Решил использовать "по науке" pageobject и столкнулся с проблемой. Есть у меня отдельно класс какой-либо страницы и класс проверок. Отдельно конечно же существует класс с тест-кейсами и вот тут-то у меня загвоздка, наверное, от плохого знания Явы. Так вот проблема в следующем.
MainWindow mainwndw = new MainWindow(driveк)
mainwndw.buttonclick(mainwndw.submit);
В константах у класса страниц хранятся xpath к элементам на этих страницах, а как же тогда к ним обращаться из тест-кейсов и проверок, неужели только через mainwndw.submit? Нельзя ли это сделать красивей как-то? Спасибо.
#2
Отправлено 25 июня 2012 - 20:13
Не очень понятно в чем вопрос. Напишите, что вы хотите сделать. Что такое MainWindow?Здравствуйте.
Решил использовать "по науке" pageobject и столкнулся с проблемой. Есть у меня отдельно класс какой-либо страницы и класс проверок. Отдельно конечно же существует класс с тест-кейсами и вот тут-то у меня загвоздка, наверное, от плохого знания Явы. Так вот проблема в следующем.
MainWindow mainwndw = new MainWindow(driveк)
mainwndw.buttonclick(mainwndw.submit);
В константах у класса страниц хранятся xpath к элементам на этих страницах, а как же тогда к ним обращаться из тест-кейсов и проверок, неужели только через mainwndw.submit? Нельзя ли это сделать красивей как-то? Спасибо.
Почитайте про PageFactory - на мой взгляд использование PageObject без PageFactory - это полумера.
PS: и еще, хоть к делу не относится, почитайте про java code style и название локальных переменных. mainwndw это не по джавовски.
Alexey
#3
Отправлено 26 июня 2012 - 06:21
Спасибо.Не очень понятно в чем вопрос. Напишите, что вы хотите сделать. Что такое MainWindow?
Почитайте про PageFactory - на мой взгляд использование PageObject без PageFactory - это полумера.
PS: и еще, хоть к делу не относится, почитайте про java code style и название локальных переменных. mainwndw это не по джавовски.
По идее это кусок кода теста(junit), а MainWindow это тот самый Page object ( одна из страниц), а проблема в том, что я пытаюсь в тесте нажать на кнопку на этой странице и передаю ее(кнопки) имя через константу(mainwndw.submit), в которой на page MainWindow хранится ее xpath. Так вот мне это кажется, как-то не очень красиво, такая передача , возможно надо как-то делать совсем иначе?
P.S. А может кто-нить подскажет где в инете почитать про Page factory? Спасибо.
#4
Отправлено 26 июня 2012 - 08:43
P.S. А может кто-нить подскажет где в инете почитать про Page factory? Спасибо.
http://code.google.c...iki/PageFactory
Про Тестинг
#5
Отправлено 26 июня 2012 - 12:46
P.S. А может кто-нить подскажет где в инете почитать про Page factory? Спасибо.
http://code.google.c...iki/PageFactory
Скажите, пожалуйста, а я что -то неправильно или единственный существенный плюс это
If you use the PageFactory, you can assume that the fields are initialised. If you don't use the PageFactory, then NullPointerExceptions will be thrown if you make the assumption that the fields are already initialised.
но при этом еще и поиск элементов идет только по ID и Value? Спасибо.
#6
Отправлено 26 июня 2012 - 14:44
Не понял откуда вы взяли, что поиск идет только "ID и Value"...
Скажите, пожалуйста, а я что -то неправильно или единственный существенный плюс это
If you use the PageFactory, you can assume that the fields are initialised. If you don't use the PageFactory, then NullPointerExceptions will be thrown if you make the assumption that the fields are already initialised.
но при этом еще и поиск элементов идет только по ID и Value? Спасибо.
На сколько я понял :) если вы не используете аннотации, тогда имя переменной элемента должно быть такое же как и ID или NAME, и тогда оно по умолчанию ищет этот элемент (по ID/NAME) на странице при инициализации.
The PageFactory relies on using sensible defaults: the name of the field in the Java class is assumed to be the "id" or "name" of the element on the HTML page.
Если используете аннотации, то как скажите, так и будет искать. Из примера:
@FindBy(how = How.NAME, using = "q") private WebElement searchBox;
Вот как-то так все и работает.
Про Тестинг
#7
Отправлено 27 июня 2012 - 07:20
Спасибо.Если используете аннотации, то как скажите, так и будет искать. Из примера:
@FindBy(how = How.NAME, using = "q") private WebElement searchBox;
Вот как-то так все и работает.
Но у меня остались еще два вопроса, помогите, пожалуйста.
Итак у меня есть класс страницы что-то типа
public class MainMenu {
@FindBy(xpath="//div[@id='id_MainMenu']//span[text()='logoutMenu']")
public WebElement logoutMenu;
@FindBy(how = How.XPATH, using = "//div[@id='id_MainMenu']//span[text()='logginMenu']")
public WebElement logginMenu;
public FirefoxDriver driver;
public MainMenu(FirefoxDriver driver) {
this.driver=driver;
}
public void clickButton (WebElement button){
button.click();
}
И класс с тестом JUnit
@Test
public void testMainmenu() throws Exception {
MainMenu mainmenu = PageFactory.initElements(driver, MainMenu.class);
// main menu
mainmenu.clickButton(mainmenu.logginMenu);
А теперь вопросы
1) Почему если в классе страницы есть конструктор, то ничего не работает, если конструктор убрать , то кнопки нажимаются, но как мне тогда передать туда driver?
2) mainmenu.clickButton(mainmenu.logginMenu); - mainmenu.logginMenu - Это нормальный стиль передачи параметра страницы из теста?
Спасибо.
#8
Отправлено 27 июня 2012 - 08:19
Спасибо.
Но у меня остались еще два вопроса, помогите, пожалуйста.
Итак у меня есть класс страницы что-то типа
public class MainMenu {
@FindBy(xpath="//div[@id='id_MainMenu']//span[text()='logoutMenu']")
public WebElement logoutMenu;
@FindBy(how = How.XPATH, using = "//div[@id='id_MainMenu']//span[text()='logginMenu']")
public WebElement logginMenu;
public FirefoxDriver driver;
public MainMenu(FirefoxDriver driver) {
this.driver=driver;
}
public void clickButton (WebElement button){
button.click();
}
И класс с тестом JUnit
@Test
public void testMainmenu() throws Exception {
MainMenu mainmenu = PageFactory.initElements(driver, MainMenu.class);
// main menu
mainmenu.clickButton(mainmenu.logginMenu);
А теперь вопросы
1) Почему если в классе страницы есть конструктор, то ничего не работает, если конструктор убрать , то кнопки нажимаются, но как мне тогда передать туда driver?
2) mainmenu.clickButton(mainmenu.logginMenu); - mainmenu.logginMenu - Это нормальный стиль передачи параметра страницы из теста?
Спасибо.
1. Читаем что написано про PageFactory:
Так уж получилось, что я не работаю с Селеном 2.х (поэтому лишь предполагаю в чем проблема), но могу предложить попробовать сделать один в один как написано в примерах: создавайт не FirefoxDriver, а WebDriver. Так же гляньте примеры по PageObject паттерну, а именно как объявляется driver в объекте страницы:we rely on the PageFactory to instantiate the instance of the PageObject. It does this by first looking for a constructor that takes "WebDriver" as its sole argument (public SomePage(WebDriver driver) {). If this is not present, then the default constructor is called. Sometimes, however, the PageObject depends on more than just an instance of the WebDriver interface.
2. Лично я использую другой подход - вместо одного метода clickButton, написал бы два: clickLogoutButton() и clickLoginButton() - без параметров.
public void clickLogoutButton(){ logoutMenu.click(); } public void clickLoginButton(){ logginMenu.click(); }
Про Тестинг
#9
Отправлено 27 июня 2012 - 09:07
Спасибо, похоже он правда работает только с WebDriver.1. Читаем что написано про PageFactory:
Так уж получилось, что я не работаю с Селеном 2.х (поэтому лишь предполагаю в чем проблема), но могу предложить попробовать сделать один в один как написано в примерах: создавайт не FirefoxDriver, а WebDriver. Так же гляньте примеры по PageObject паттерну, а именно как объявляется driver в объекте страницы:we rely on the PageFactory to instantiate the instance of the PageObject. It does this by first looking for a constructor that takes "WebDriver" as its sole argument (public SomePage(WebDriver driver) {). If this is not present, then the default constructor is called. Sometimes, however, the PageObject depends on more than just an instance of the WebDriver interface.
2. Лично я использую другой подход - вместо одного метода clickButton, написал бы два: clickLogoutButton() и clickLoginButton() - без параметров.public void clickLogoutButton(){ logoutMenu.click(); } public void clickLoginButton(){ logginMenu.click(); }
А по второму пункту у меня вопрос, конечно же такой подход как у Вас избавить меня от проблемы передачи WebElement из теста, но тогда получается, что придется отказаться от универсальности методов и, если элементов на странице много, то получается либо уж очень много методов для каждого из элементов, либо дробить саму страницу на несколько классов , каждый из которых под определенные группы тестов? Может я что неправильно понимаю, кто , вообще, какой метод использует, поделитесь , пожалуйста.
Спасибо.
#10
Отправлено 27 июня 2012 - 09:37
По мне - как кому удобно!Спасибо, похоже он правда работает только с WebDriver.
А по второму пункту у меня вопрос, конечно же такой подход как у Вас избавить меня от проблемы передачи WebElement из теста, но тогда получается, что придется отказаться от универсальности методов и, если элементов на странице много, то получается либо уж очень много методов для каждого из элементов, либо дробить саму страницу на несколько классов , каждый из которых под определенные группы тестов? Может я что неправильно понимаю, кто , вообще, какой метод использует, поделитесь , пожалуйста.
Спасибо.
Можно оставить и ваш метод, и мой в одном классе :) получите:
public void clickLogoutButton() { clickButton (logoutMenu); } public void clickLoginButton() { clickButton (logginMenu); } public void clickButton (WebElement button) { button.click(); }все зависит от того что у вас там за архитектура и структура :)
В реализации PageObject паттерна (которую я сейчас использую), у меня есть родительский класс страницы Page, в котором лежат подобного рода обложки для методов, типа вашего clickButton (WebElement button)...
class Page { // // инициализация и имплементация разных сервисных методов // public void clickButton (WebElement button) { button.click(); } //... } public class MainMenu extends Page { @FindBy(xpath="//div[@id='id_MainMenu']//span[text()='logoutMenu']") public WebElement logoutMenu; @FindBy(how = How.XPATH, using = "//div[@id='id_MainMenu']//span[text()='logginMenu']") public WebElement logginMenu; // // инициализация страницы и вебдрайвера // public void clickLogoutButton() { clickButton (logoutMenu); } public void clickLoginButton() { clickButton (logginMenu); } // (пример написан с листа, так что не ругайте сильно...) }
вот как-то так...
Про Тестинг
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных