кипарис: использовать переменную в нескольких функциях - PullRequest
0 голосов
/ 30 октября 2019

Я хочу использовать одну переменную в двух разных функциях. Точнее, я хочу получить номер (в виде строки) метки и установить его в поле ввода. После этого я проверяю другую метку для правильного (приведенного) текста.

Я написал две функции, которые работают правильно (выполняются отдельно), но я хочу использовать значение (хранящееся в переменной) первой функции внутривторая функция.

Итак, я попытался соединить функции вместе, но затем Cypress не находит заданный csspath '#sQuantity', потому что Cypress указывает (другую область) на элемент в таблице и на мой элементне принадлежит таблице. Заданное значение переменной 'txtAmountColumn' первой функции используется во второй функции для некоторых вычислений.

let txtAmountColumn
let txtPackPriceColumn
let txtDiscountColumn

it('get some values', function() {
    //go to page
    cy.loadpage(txtUrl)
    //find product box
    cy.get('.ProductSelectionBox table').within(($scaleTable) => {
        //find table of scaled discount
        cy.get('tbody > tr').eq(1).within((rowTable) => {
            //get second row of table
            let txtRowTable = rowTable.text()

            //get first column (amount) of row
            cy.get('td').eq(0).then((lineOfTable) => {
                let txtValueOfFirstColumn = lineOfTable.text()
                txtAmountColumn = txtValueOfFirstColumn.match(/\d{1,}/)[0]
                cy.log(txtAmountColumn)
            })
            //get second column (price of pack price) of row
            cy.get('td').eq(1).then((lineOfTable) => {
                let txtValueOfSecondColumn = lineOfTable.text()
                txtPackPriceColumn = txtValueOfSecondColumn.match(/[0-9]*,[0-9]*/)[0]
                cy.log(txtPackPriceColumn)
            })
            //get third column (discount in percentage) of row
            cy.get('td').eq(2).then((lineOfTable) => {
                let txtValueOfThirdColumn = lineOfTable.text()
                txtDiscountColumn = txtValueOfThirdColumn.match(/\d{1,}/)[0]
                cy.log(txtDiscountColumn)
            })
        })
    })
})
// ToDo: integrate this function within previous function because I need a dynamic value for txtAmount
    it('calculate the price', function() {
        let txtAmount = 10 //replace this hardcoded value with the determined value of txtAmountColumn
        let txtPackPriceColumn = 9.99
        //go to the sale
        cy.loadpage(txtUrl)
        //set amount of products
        cy.get('#sQuantity').type(txtAmount).then(() =>{
            cy.get('.MainProductCalculatedPriceOverview').then((labelPrice) => {
                let txtPrice = labelPrice.text()
                //calculate expected price
                let calculatedPrice = txtAmount * txtPackPriceColumn
                //calculate expected VAT
                let calculatedVat = Math.round((calculatedPrice * 1.19)*100)/100
            })
        })
    })

Если я соберу их вместе

<p>CypressError: cy.type() can only accept a String or Number. You passed in: 'undefined'</p>

Как я могу использовать'txtAmounColumn' для моего расчета (в обеих функциях)?

1 Ответ

0 голосов
/ 30 октября 2019

Состояние может быть легко передано между тестовыми примерами (it блоков), потому что обратные вызовы вызываются последовательно, по одному за раз. Таким образом, набор переменных в первом тестовом примере будет определен ко времени выполнения второго тестового примера:

let value;

describe('test', () => {
    it('one', () => {
        cy.document().then(doc => {
            doc.body.innerHTML = '<div class="test">42</div>';
        });
        cy.get('.test').invoke('text').then( val => {
            value = val;
        });
    });
    it('two', () => {
        cy.document().then(doc => {
            doc.body.innerHTML = '<input class="test">';
        });
        cy.get('.test').type(value)
            .invoke('val').should('eq', '42');
    });
});

Если, с другой стороны, вы пытаетесь повторно использовать переменную в одном тестеВ этом случае вы можете сделать это следующим образом:

describe('test', () => {
    it('test', () => {
        cy.document().then(doc => {
            doc.body.innerHTML = `
                <div class="test1">42</div>
                <input class="test2">
            `;
        });

        let value;

        cy.get('.test1').invoke('text').then( val => {
            value = val;
        });

        cy.then(() => {
            // note that these commands could have been nested into the `then`
            //  callback above, directly, without needing to cache the variable
            //  at all
            cy.get('.test2').type(value)
                .invoke('val').should('eq', '42');
        });
    });
});

См. мой более старый ответ , подробно описывающий этот шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...