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

Тестирование безопасности
онлайн, начало 10 июля
Тестирование мобильных приложений
онлайн, начало 10 июня
Программирование на Java для тестировщиков
онлайн, начало 12 июня
Школа для начинающих тестировщиков
онлайн, начало 11 июня

Isidor2811

Регистрация: 14 мая 2018
Offline Активность: 18 янв 2019 10:55
-----

Мои темы

Одинаковые страницы

30 августа 2018 - 08:05

Всем привет!
 
Есть небольшое замешательство и пока не пойму как лкчше делать не хочу дальше создавать тесты, так как потом нужно будет много переделывать.
 
Проблема: На прикрепленном изображении мы видим две страницы: Исходящий документ (OutComeDoc) и Внутренний документ (InternalDoc). Это два отдельных класса - использую page object.
 
Сначала работал над тестами для Исходящий документ. Мы находимся на вкладке адресат (тоже отдельный класс AddressTabOutcomeDoc) 
На этой вкладке есть 3 вебелемента с которыми я работаю: два поля и выпадающий список. Дальше пример кода для одного поля:
 
Поле наименование:
@FindBy(xpath = "//input[contains(@id,'lmr_contragents-cntrl')]")
WebElement addressNameField;

public AddressTabOutcomeDoc setAddressNameField(String name){
        waitHelper.waitForVisibility(addressNameField,10);     
        addressNameField.sendKeys(name);        
        return this;
}

Использую page factory я ищу елемент на странице, потом cоздаю метод с возвращаемым типом значения AddressTabOutcomeDoc

и возвращаю this, так как я не делаю переход на другую страницу, а просто возвращаю обновленый обект страницы(вкладки) Адресат

 

Дальше когда все поля заполнены мне нужно перейти на другую вкладку (страницу(отдельный класс)). Код для этого следующий:

 @FindBy(xpath = "//input[contains(@id,'lmr_contragents-cntrl-button')]")
    WebElement addAddresatButton;

    public SenderTabOutcomeDoc goToSenderTab(){
        waitHelper.waitForVisibility(addAddresatButton,10);
        addAddresatButton.click();
        return new SenderTabOutcomeDoc(driver);
    }

Здесь у меня уже идет переход на другую страницу, поэтому я возращаю новый обьект страницы(вкладки) SenderTabOutcomeDoc.

 

Дальше отрывок кода самого теста:

....
        addressTabOutComeDoc.setAddressNameField("Иванов И.И.");
        addressTabOutComeDoc.setRegisterNameField("Петров П.П.")
        addressTabOutComeDoc.selecCity("Киев");
        SenderTabOutComeDoc senderTabOutComeDoc = addressTabOutComeDoc.goToSenderTab
....

Теперь у меня есть Внутренний документ где есть точно такая же вкладка AddressTabInternalDoc, с точно такими же полями.

 

Как работать с этой вкладкой:

 

Вариант 1. Копипастить весь код с вкладки  AddressTabOutComeDoc на вкладку AddressTabInternalDoc с заменой возвращаемых значений в методах (c return new SenderTabOutcomeDoc(driver) на return new SenderTabInternalDoc(driver);)

 

Вариант2: Пробовал наследоваться от вкладки Адресат Исходящего Внутреним документом. Тоже не получаеться. В этом случае типы возвращаемых значений нужно делать void

 

Вариант3: Разработчики советуют использовать интерфейсы.

 

 

Как работать с одинаковыми страницами? 

 

Сейчас просто использовался вариантом 1. Но в случае изменения на этой вкладки нужно будет менять в двух местах

 

 

 

 


Upload файла через стандартное окно Windows

12 июля 2018 - 11:41

Всем привет! Есть небольшая проблема.

 

В приложении есть кнопка (сразу скажу что это не мы разрабатывали эту функциональность, и повлиять на нее мы не можем), по нажатии этой кнопки, а что самое важное даже на поле возле кнопки открывается стандартное окно загрузки файла windows Прикрепленный файл  123.jpg   59,19К   0 Количество загрузок:  --->   Прикрепленный файл  234.jpg   89,97К   0 Количество загрузок:

 

Делаю так:

 

Копирую в буфер обмена путь к ключу

public void copyPathToKeyToClipBoard(){
        StringSelection copyToClipBoard = new StringSelection(ECPKeysConfig.pathToKey);
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(copyToClipBoard, null);
    }

После того как нажимаю на кнопку и открывается окно вставляю путь, так как поле в окне с путем к файлу активное, то никаких проблем не возникает

public void pastePathToKey() throws AWTException {
        Robot robot = new Robot();
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_ENTER);
}

Но проблема в том что во время этой операции мне нужно обязательно фокусироваться на этом окне, то есть если на пример я запущу тест и на соседнем мониторе буду что то писать в word то этот путь к ключу просто будет вставлен в word.

 

Кто подскажет как решить эту проблему.

 

Сражу скажу что actions не работают. Также я не могу на прямую отправить путь к файлу в поле возле кнопки, в любом другом месте работает но не тут, так как после нажатия на поле открывается окно windows

 


Page Object ver.2

11 июня 2018 - 09:41

Всем еще раз привет! Вот тут http://software-test...-nasledovaniia/ я создавал тему касающейся правильности создания архитектуры Page Object. Мне указали на мои ошибки, и я начал гуглить и искать информацию по их устранению.

 

 

И так:

Архитектура классов тут: https://www.screenca...om/t/uUoP0S0wN7

 

Пока что реализовал вот как:

Создал класс BaseTest, в котором у меня реализована инициализация драйвера, также убрал SetProperty с явным указанием в нем пути к драйверу заменив его dependency WebDriverManager в pom файле. В итоге получился такой код:

public class BaseTest {

    protected WebDriver driver;

    @BeforeClass
    public void setUpDriver(){
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
    }

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

От этого класса у меня будут наследоваться все тестовые классы.

 

Дальше создал класс BasePage, от которого будут наследоваться все пейджы. Так как пейджам нужен драйвер, то в данном классе (BasePage) я создал конструктор, в итоге каждый пейдж который будет создаваться, получит драйвер через super(driver).

Также я тут создал метод find, который заменит длинное написание driver.findElement().

Код ниже:

public class BasePage {

    protected WebDriver driver;

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

    public WebElement find(By locator){
        return driver.findElement(locator);
    }
}

Дальше класс самой страницы. Тут я оставил пару методов просто для наглядности, что бы не копипастить весь класс. В итоге создаем конструктор страницы, получаем драйвер, создаем переменные типа By с которыми будем работать, создаем маленькие методы (например заполнить поле, выбрать с селекта), потом создаем метод cardFill() который обьеденит эти методы.

public class NewOrgRegistrationPage extends BasePage{

    public NewOrgRegistrationPage(WebDriver driver) {
        super(driver);
    }

    String url = "http://192.168.1.111:8085/share/page/context/mine/sxg-external-registration";
    By orgRegistrationReasonDropBox = By.name("prop_uxp_orgnRegistrationReason");
    By fullOrgNameField = By.name("prop_uxp_orgnName");


    public NewOrgRegistrationPage selectOrgRegistrationReason(){
        Select selectOrg = new Select(find(orgRegistrationReasonDropBox));
        selectOrg.selectByIndex(1);
        return this;
    }
    public NewOrgRegistrationPage setFullOrgNameField(String orgName){
        find(fullOrgNameField).sendKeys(orgName);
        return this;
    }
    public NewOrgRegistrationPage visit(){
        driver.get(this.url);
        return this;
    }

    public void cardFill(){
        visit();
        selectOrgRegistrationReason();
        setFullOrgNameField("some name");
    }
}

И наконец то сам тест класс

public class CreatingNewOrgTest extends BaseTest{

    @Test
    public void cardFill(){
        NewOrgRegistrationPage page = new NewOrgRegistrationPage(driver);
        page.cardFill();
    }
}

Жду конструктивной критики особенно от пользователя Noksa, так как прошлый раз очень хорошие были замечания.

 

Но помимо критики у меня сразу есть вопросы. 

 

1. Мне кажется что в тестовых классах я не должен иметь возможности делать driver.findElement, driver.click и т.д. Тоесть на прямую обращаться к драйверу. Или я ошибаюсь?

 

2. В архитектуре классов у меня есть также класс SummaryAPI. В лекции что я смотрел, от этого класса неследовались классы BasePage и BaseTest - тоесть в них была реализация чего то общего для этих двух классов, например того же метода find:

 public WebElement find(By locator){
        return driver.findElement(locator);
 }

Я этого к сожелению понять не могу, зачем мне этод метод в тестовых классах? Если я могу его создать в BasePage, что я собстевнно и сделал, так как только в пейджах которые наследуються от этого класса я и буду его использовать. В чем смысл заносить его в SummaryAPI, потом наследовать в BaseTest и в тестовом методе иметь возможность делать find(By name("q")).

Я много где видел советы по созданию класса общего для BasePage и BaseTest. Но что там должно быть? Наведите пожалуйста примеры. Спасибо!


Наследования

07 июня 2018 - 14:38

Привет всем. Есть небольшая проблема.

 

У меня есть класс (кусок кода представлен ниже)

public class FirstBP_OrgCreating {

    public WebDriver driver;
    public WebDriverWait wait;
     
    @BeforeClass
    public void setUp(){
        System.setProperty("webdriver.chrome.driver","E:\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        wait = new WebDriverWait(driver,20);
        ConfigFile configFile = new ConfigFile();
        configFile.initializeAllField();
    }

    @Test(priority = 0)
    public void cardFill() throws InterruptedException {
        OrgCard orgcard = new OrgCard(driver);
        orgcard.setFieldsOnTheOrgCard();
        PopUpMessage popUpMessage = orgcard.createButtonClick();
        popUpMessage.getLinkFromPopUp();
   }

В этом классе есть 3 метода, которые я хочу использовать в классе №2, один из этих методов cardFill().

 

Код второго класса ниже.

public class OrganizationCabinetReject extends FirstBP_OrgCreating {

    public WebDriver driver;
    public WebDriverWait wait;

    @BeforeClass
    public void setUp(){
        System.setProperty("webdriver.chrome.driver","E:\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        wait = new WebDriverWait(driver,20);
        ConfigFile configFile = new ConfigFile();
        configFile.initializeAllField();
    }

    @Test(priority = 1)
    public void cardFill() throws InterruptedException {
        super.cardFill();
    }

В итоге я получаю NullPointerException

 

 
java.lang.NullPointerException
at OrgCard.setFieldsOnTheOrgCard(OrgCard.java:157)
at FirstBP_OrgCreating.cardFill(FirstBP_OrgCreating.java:32)
at OrganizationCabinetReject.cardFill(OrganizationCabinetReject.java:30)
.....
.....
 
где 157 строка это driver.get(ConfigFile.orgCreateUrl);
 
Как сделать это правильно?
 

 

 


Автоматизация больших бизнес процессов

29 мая 2018 - 13:20

Всем еще раз привет!

Только учусь - так что не судите строго.

 

И так...вопрос вот в чем. Имеется очень длинный бизнес процесс (дальше БП). Код например заполнения карточки документа прикрепляю ниже:

@Test(priority = 1)
    public void createOrgTest() throws InterruptedException {
        driver.get(ConfigFile.createCabinetURL);
        OrganizationCabRegister orgCabReg = new OrganizationCabRegister(driver,wait);
        orgCabReg.selectOrgRegistrationReason();
        orgCabReg.setFullOrgNameField(Variables.getOrgName());
        orgCabReg.setShortOrgName(Variables.getOrgName());
        orgCabReg.setEdrpou("33"+ConfigFile.addToName);
        orgCabReg.setIndex("0011"+ConfigFile.addToName);
        orgCabReg.selectCityType();
        orgCabReg.setCityName("Вінниця"+ConfigFile.addToName);
        orgCabReg.selectStreetType();
        orgCabReg.setStreetName("Келецька"+ConfigFile.addToName);
        orgCabReg.setHouseNumber("32"+ConfigFile.addToName);
        orgCabReg.setHeadLastName(Variables.getHeadLastName());
        orgCabReg.setHeadFirstName(Variables.getHeadFirstName());
        orgCabReg.setHeadMiddleName(Variables.getHeadMiddleName());
        orgCabReg.setHeadPhone("+38066545574"+ConfigFile.addToName);
        orgCabReg.setHeadEmail(ConfigFile.headEmail);
        orgCabReg.setResponsibleLastName(Variables.getResponsibleLastName());
        orgCabReg.setResponsibleFirstName(Variables.getResponsibleFirstName());
        orgCabReg.setResponsibleMiddleName(Variables.getResponsibleMiddleName());
        orgCabReg.setResponsiblePhone("+3877447755"+ConfigFile.addToName);
        orgCabReg.setResponsibleEmail(ConfigFile.respEmail);
        orgCabReg.createButtonClick();
        orgCabReg.setLinkToHead();
    }

Заполнение этой карточки это всегда первый шаг БП, дальше уже идет проверка, отклонение и т.д. То есть мне этот метод нужно использовать много раз, для разных веток БП. Как правильно это сделать?

 

 

У меня сейчас просто копитаст в этого куска в разные классы. Так конечно нельзя, а как правильно?

Вынести этот метод в отдельный класс? 

 

Хочу что бы всего один екземпляр этого кода был, что бы случае изменений быстро поправить в одном месте.

 

Надеюсь что понятно изложил. Буду рад помощи!

 

 

 

 


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