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

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();
    }

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

 

 

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

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

 

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

 

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