Перейти к содержимому

Программирование на C# для тестировщиков
онлайн, начало 6 декабря
Python для начинающих
онлайн, начало 11 декабря
Школа для начинающих тестировщиков
онлайн, начало 12 декабря
Комплексная система подготовки к сертификации ISTQB FL (КСП ISTQB)
онлайн, начало 9 декабря
Фотография

Помогите сделать красиво


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 9

#1 Alekssaf

Alekssaf

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Сафронов Алексей

Отправлено 19 Июнь 2012 - 05:29

Здравствуйте.
Решил использовать "по науке" pageobject и столкнулся с проблемой. Есть у меня отдельно класс какой-либо страницы и класс проверок. Отдельно конечно же существует класс с тест-кейсами и вот тут-то у меня загвоздка, наверное, от плохого знания Явы. Так вот проблема в следующем.
MainWindow mainwndw = new MainWindow(driveк)
mainwndw.buttonclick(mainwndw.submit);

В константах у класса страниц хранятся xpath к элементам на этих страницах, а как же тогда к ним обращаться из тест-кейсов и проверок, неужели только через mainwndw.submit? Нельзя ли это сделать красивей как-то? Спасибо.
  • 0

#2 LeshaL

LeshaL

    Гуру

  • Members
  • PipPipPipPipPipPip
  • 1 094 сообщений
  • ФИО:Алексей Лянгузов
  • Город:Saint-Petersburg


Отправлено 25 Июнь 2012 - 20:13

Здравствуйте.
Решил использовать "по науке" pageobject и столкнулся с проблемой. Есть у меня отдельно класс какой-либо страницы и класс проверок. Отдельно конечно же существует класс с тест-кейсами и вот тут-то у меня загвоздка, наверное, от плохого знания Явы. Так вот проблема в следующем.
MainWindow mainwndw = new MainWindow(driveк)
mainwndw.buttonclick(mainwndw.submit);

В константах у класса страниц хранятся xpath к элементам на этих страницах, а как же тогда к ним обращаться из тест-кейсов и проверок, неужели только через mainwndw.submit? Нельзя ли это сделать красивей как-то? Спасибо.

Не очень понятно в чем вопрос. Напишите, что вы хотите сделать. Что такое MainWindow?
Почитайте про PageFactory - на мой взгляд использование PageObject без PageFactory - это полумера.
PS: и еще, хоть к делу не относится, почитайте про java code style и название локальных переменных. mainwndw это не по джавовски.
  • 0
Regards,
Alexey

#3 Alekssaf

Alekssaf

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Сафронов Алексей

Отправлено 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? Спасибо.
  • 0

#4 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 26 Июнь 2012 - 08:43

P.S. А может кто-нить подскажет где в инете почитать про Page factory? Спасибо.


http://code.google.c...iki/PageFactory
  • 0
Алексей Булат
Про Тестинг

#5 Alekssaf

Alekssaf

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Сафронов Алексей

Отправлено 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? Спасибо.
  • 0

#6 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 26 Июнь 2012 - 14:44


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? Спасибо.

Не понял откуда вы взяли, что поиск идет только "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;

Вот как-то так все и работает.
  • 0
Алексей Булат
Про Тестинг

#7 Alekssaf

Alekssaf

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Сафронов Алексей

Отправлено 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 - Это нормальный стиль передачи параметра страницы из теста?

Спасибо.
  • 0

#8 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 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:

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.х (поэтому лишь предполагаю в чем проблема), но могу предложить попробовать сделать один в один как написано в примерах: создавайт не FirefoxDriver, а WebDriver. Так же гляньте примеры по PageObject паттерну, а именно как объявляется driver в объекте страницы:

2. Лично я использую другой подход - вместо одного метода clickButton, написал бы два: clickLogoutButton() и clickLoginButton() - без параметров.
public void clickLogoutButton(){
logoutMenu.click();
}

public void clickLoginButton(){
logginMenu.click();
}

  • 0
Алексей Булат
Про Тестинг

#9 Alekssaf

Alekssaf

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Сафронов Алексей

Отправлено 27 Июнь 2012 - 09:07

1. Читаем что написано про PageFactory:

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.х (поэтому лишь предполагаю в чем проблема), но могу предложить попробовать сделать один в один как написано в примерах: создавайт не FirefoxDriver, а WebDriver. Так же гляньте примеры по PageObject паттерну, а именно как объявляется driver в объекте страницы:

2. Лично я использую другой подход - вместо одного метода clickButton, написал бы два: clickLogoutButton() и clickLoginButton() - без параметров.
public void clickLogoutButton(){
logoutMenu.click();
}

public void clickLoginButton(){
logginMenu.click();
}

Спасибо, похоже он правда работает только с WebDriver.

А по второму пункту у меня вопрос, конечно же такой подход как у Вас избавить меня от проблемы передачи WebElement из теста, но тогда получается, что придется отказаться от универсальности методов и, если элементов на странице много, то получается либо уж очень много методов для каждого из элементов, либо дробить саму страницу на несколько классов , каждый из которых под определенные группы тестов? Может я что неправильно понимаю, кто , вообще, какой метод использует, поделитесь , пожалуйста.
Спасибо.
  • 0

#10 Boltick

Boltick

    Специалист

  • Members
  • PipPipPipPipPip
  • 596 сообщений
  • ФИО:Алексей
  • Город:планета Земля

Отправлено 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);
   }

  // (пример написан с листа, так что не ругайте сильно...)
}

вот как-то так...
  • 0
Алексей Булат
Про Тестинг


Selenium 2.0: стартовый уровень
онлайн
Программирование на Java для тестировщиков
онлайн
Автоматизация функционального тестирования
онлайн
Selenium WebDriver: полное руководство
онлайн



Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика
Реклама на портале