пятница, 20 апреля 2018 г.

Выделить элемент, селениум

В общем, надо было выделить элемент, которых два одинаковых, надо было употребить :nth-child. Я так и сделала, но только к более вложенному тэгу. У меня ничего не прокатывало. Надо было подняться на уровень выше и обратиться к предыдущему тэгу, к его родителю. У меня было вот так:

.then(() => assert.isTrue(true), (err)=> {console.log(err); testResult = false})
.waitForVisible('.coupon-editor:nth-child(1) .radio__box:nth-child(2)')

А надо было так: 

.then(() => assert.isTrue(true), (err)=> {console.log(err); testResult = false})
.waitForVisible('.coupon-editor:nth-child(1) .radio:nth-child(2)')

Отута скрин, есичо.

среда, 11 апреля 2018 г.

Селениум, траблы, xpath, много одинаковых элементов, попапы отдельно

В общем, была трабла, когда этот элемент был в нескольких местах. Да, попапы, кстати, отдельно, а не в тех элементах, где они выскакивают.
Так вот попапы сложены отдельно, поэтому, когда обращалась к элементам, мне нужен был аж 8-й попап. Можно было обратиться и по тэгам, прописав цифру "8", но это не путь самурая. Ведь если сделать так, добавят еще один попап и все сломается.
Решили сделать описание по xpath.

Получился вот такой код:

.click('.//body/*[contains(@class,"popup_")][1]//*[contains(@class,"menu-item")][2]')
.then(() => assert.isTrue(true), (err)=> {console.log(err); testResult = false})
.waitForVisible('//body/*[contains(@class,"popup_")][1]', 1000, true)
.then(() => assert.isTrue(true), (err)=> {console.log(err); testResult = false})
.getText('.coupon-editor:nth-child(1) .form-field[data-name = "enabled"] .button__text')
.then(text => assert.isTrue(text === 'Выключен', 'False: ' + text+ ' != Выключен'), (err) => {
    conslole.log(err);
    testResult = false})


сделать полосатые таблички, гуглшит

Идем в Format -> alternating colors. Там уже выбираем нужные цвета. Тока снять чекбоксы, типа, хэдера и футера.

вторник, 10 апреля 2018 г.

Глобальные переменные, селениум, сравнить значение в одном теге со значением в другом теге.

let viewNameCode = '';
let codeName = '';
return this.browser    .url(this.browser.options.baseUrl + '/manage/promotion/coupons')
    .then(() => assert.isTrue(true), (err) => {
        console.log(err);
        testResult = false    })
    .waitForVisible('.icon_add_box')
    .then(result => {
        if (result) {
        } else testResult = false;
        assert.isTrue(result, 'False: .icon_add_box не виден')
    }, (err) => {
        console.log(err);
        testResult = false    })
    .click('.icon_add_box')
    .then(() => assert.isTrue(true),(err)=> {console.log(err); testResult = false})
    .waitForVisible('.coupon-editor:nth-child(1) .form-field[data-name = "code"]', 10000)
    .then(result => {
        if (result) {
        } else testResult = false;
        assert.isTrue(result, 'False: .coupon-editor:nth-child(1) .form-field[data-name = "code"] не виден')
    }, (err) => {
        console.log(err);
        testResult = false    })
    .click('.coupon-editor:nth-child(1) .form-field[data-name = "code"] .input__control')
    .then(() => assert.isTrue(true), (err)=> {console.log(err); testResult = false})
    .keys('Grandy')
    .then(() => assert.isTrue(true), (err)=> {console.log(err); testResult = false})
    .getValue('.coupon-editor:nth-child(1) .form-field[data-name = "code"] .input__control')
    .then(text => codeName = text, (err) => {
        console.log(err);
        testResult = false    })
    .getText('.coupon-editor:nth-child(1) .coupon-editor__view-name-code')
    .then(text => {viewNameCode = text; if (codeName === viewNameCode){}else {testResult = false; console.log(codeName+ ' != '+ viewNameCode)}}, (err) => {
        console.log(err);
        testResult = false    })



Стояла задача взять значение из одного тега и сравнить его со значением из другого тега.
1. Объявили глобальные переменные, чтобы запихнуть потом в них значения.
2. С помощью .getValue взяли значение, запихнули это значение в переменную.
3. То же самое со вторым элементом.
Но во втором слвучае мы сразу сравниваем потом. Т.е. пишем условие.
if (codeName === viewNameCode){}else {testResult = false; console.log(codeName+ ' != '+ viewNameCode)}
т.е. если они равны, ничего не происходит, все норм.
Если фолс, то в консоль выводится ошибка, что они не равны.

понедельник, 2 апреля 2018 г.

Вложенность, обработка вложенности, надо ставить паузы в Гермионе, траблы, разбор кода




Вот для удобства не скрин, а сам код:

.getText('.cart__calc-position_field_discount .price__val')
.then(discount =>{
    let regexp = /\s/; // пустые значения    discount = discount.replace('','').replace(',','.').replace(regexp,'');
    console.log("discount="+discount);
    this.browser.getText('.cart__calc-position:nth-child(1) .price__val')
        .then(summa => {
            summa = summa.replace('','').replace(',','.').replace(regexp,'');
            console.log( "summa="+summa);
            this.browser.getText('.cart__calc-position:nth-child(3) .price__val')
                .then(kupon => {
                    kupon = kupon.replace('','').replace(',','.').replace(regexp,'');
                    console.log( "kupon="+kupon);
                    this.browser.getText('.cart__calc-position:nth-child(5) .price__val')
                        .then(total => {
                            total = total.replace('','').replace(',','.').replace(regexp,'');
                            console.log( "total="+total);
                            console.log('***************1');
                            console.log(summa + ' - ' + kupon + ' - ' + discount + ' = ' + total);
                            console.log((summa - kupon - discount) == total);
                            if ((summa - kupon - discount).toFixed(2) - total <=0.01) {}
                            else { console.log(summa + ' - ' + kupon + ' - ' + discount + ' <> ' + total); testResult = false}
                        })
                },err => {console.log(err); testResult = false})
        },err => {console.log(err); testResult = false})
})
.pause(5000)



Итак, разбор Ленкиного тупняка.

Сначала я не могла сообразить, почему этот элемент находился в хидден состоянии.


Он у меня отображался вот так:




А отображался он так, Потому что у меня заказа было мало, на скидку не дотягивало.



А это прогрессивная скидка, которая зависит от суммы заказанного товара.

Т.е. если бы сумма товара, как в тесте, который я написала, была бы больше 5к, то скидка составляла бы 10 % и этот элемент не был бы хидден.

Второй мой фолт, почему тест не работал, это то, что Гермиона не обрабатывает вложенность. Она фейлит и бежит дальше. Так было и сейчас. Надо обязательно ставить паузу после вложенности.



Вот тут regexp ищет все пробелы. Вот эта вот хрень "/\s/" - это означает пустые значения.
Дальше мы заменяем рубли на ничто, запятую на точку, пустые места на ничто.

Для чего нам надо было убирать пустые места?
Пустые места мы убирали, чтобы число воспринималось как число.

Если больше тысячи, то оно было так: 3 000, т.е. с пробелом. А нам надо, шоб было число. Пришлось юзать регэксп.

Вывод в Селениуме этого куска кода вот такой:



Да, логика тут такая:











Т.е. у нас тут складывается купон и скидка.

Мы делаем:
сумма - купон - дисконт = тотал.
5145.80 - 10 - 514.58 = 4621.22

И если:

сумма - купон - дисконт  -  тотал <= 0.01 (1 коп, потому что почему-то с "0" не проходит тест)
5145.80 - 10 - 514.58 - 4621.22 <= 0.01, то норм

В противном случае

сумма - купон - дисконт не равно тоталу.
5145.80 - 10 - 514.58 != тоталу, мы сваливаемя с фолс.