Метод ProTractor getText () не включает преобразование текста, выполненное в псевдоселекторе :: first-letter - PullRequest
1 голос
/ 15 марта 2019

Наша команда QA использует транспортир 5.4.2 для тестирования функций / интеграции в угловом веб-приложении. Часть приложения получает данные из нашего API, а затем с помощью CSS применяет к нему класс «регистр предложений», чтобы принудительно ввести текст в желаемую заглавную букву: верхний регистр первого символа, нижний регистр всех следующих символов - независимо от формата ввода.

Это прекрасно работает для приложения, отображаемого в браузере. Но когда наши тесты извлекают текст элемента с помощью element.getText (), возвращаемая строка выполняет преобразование текста в нижнем регистре, но не в верхнем регистре первого символа.

Стиль CSS:

/* convert something to sentence case */
.sentence-case {
  text-transform: lowercase;
}
.sentence-case::first-letter {
  text-transform: uppercase;
}

Пример HTML

<section id="testSect">
  <h2>Test Section</h2>
  <br/>
  <div class='sentence-case'>ABCDEF</div>
  <div class='sentence-case'>aBcDeF</div>
  <div class='sentence-case'>Abcdef</div>
  <div class='sentence-case'>ABCDEF</div>
</section>

Код испытания транспортира:

describe('sentence-case transform', () => {
it('with GetText', () => {        
    let foo: ElementArrayFinder = element.all(by.css('#testSect div.sentence-case'));
    browser.get('http://localhost:4200/testPage');
    foo.each((bar: ElementFinder) => {
        expect(bar.getText()).toBe('Abcdef');
    })
})
})

Результаты испытаний:

  sentence-case transform
  × with GetText
    - Expected 'abcdef' to be 'Abcdef'.
    - Expected 'abcdef' to be 'Abcdef'.
    - Expected 'abcdef' to be 'Abcdef'.
    - Expected 'abcdef' to be 'Abcdef'.
  • Это ограничение в поддержке транспортира для псевдо-селекторов?
  • Есть ли обходной путь в транспортире для получения окончательного значения преобразованного текста?

1 Ответ

0 голосов
/ 17 марта 2019

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

let textDiv = await element(by.css('div[class]')).get(0);
browser.executeScript("return arguments[0].innerText;", textDiv);

outerText также должно работать вэтот контекст.

Если вы действительно хотите получить псевдоселекторы, вы также можете выполнить команду, подобную следующей.

//returns uppercase
browser.executeScript("return window.getComputedStyle(arguments[0], ':first-letter').getPropertyValue('text-transform');", textDiv);

Код, который вы можете попробовать

    let foo = element.all(by.css('#testSect div.sentence-case'));
    foo.each((bar) => {
        browser.executeScript("return arguments[0].innerText;", bar).then(innerText => {
            console.log(innerText)
            expect(innerText).toBe('Abcdef');
        })
    })
...