DevGang
Авторизоваться

Понимание текстовых фильтров в askui

В этом руководстве демонстрируются различные методы обработки текстовых элементов с помощью аскуи. askui предлагает четыре различных метода:

  1. containsText()
  2. withExactText()
  3. withText()
  4. withTextRegex()

Требования. askui установлен и настроен.

Для удобной демонстрации мы будем использовать Flutter web demo, предоставленную Flutter.

Базовое сопоставление текста

Самый простой способ взаимодействия с текстовым элементом — использование withText(). Перейдите на страницу демо-приложения и запустите код ниже:

await aui.moveMouseTo().text().withText('matrial').exec();
await aui.mouseLeftClick().exec();

withText() пытается найти текст, соответствующий всей последовательности. В большинстве тестовых случаев вы захотите придерживаться этого метода, так как он поддерживает Fuzzy Matching и допускает текст с ошибками. Обратите внимание, что в приведенном выше примере кода есть две опечатки. matrial не соответствует тексту в демонстрационном приложении, то есть Material, хотя askui найдет текстовый элемент, который примерно соответствует тексту на экране.

Совпадение с подстрокой в тексте

Несмотря на то, что метод withText() удобен и довольно надежен, вы можете столкнуться с тестовым случаем, когда вы знаете только часть текстового элемента, с которым хотите взаимодействовать. В таком случае containsText() - это метод, который вы, возможно, захотите использовать:

await aui.moveMouseTo().text().containsText('Bottom').exec();
await aui.mouseLeftClick().exec();

Имейте в виду, что даже если метод containsText() также поддерживает Fuzzy Matching, он не будет соответствовать всей последовательности всего лишь несколькими символами. Попробуйте использовать этот код с данным демонстрационным приложением:

// this will fail
await aui.moveMouseTo().text().containsText('Bottm').exec(); 

Вы заметите, что askui не соответствует заданному тексту Bottm, тогда как этот код будет работать:

// this will success
await aui.moveMouseTo().text().containsText('Bottm appbar').exec(); 
// this will also success
await aui.moveMouseTo().text().containsText('Bottom').exec(); 

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

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

Сопоставьте точный текст

Если вы уже знаете, какой текст ищете, или если похожих текстовых элементов слишком много, мы могли бы использовать метод withExactText().

На главной странице демо-приложения перейдите в Material->Data tables. Вы увидите таблицу с различными продуктами питания с факторами питания для каждого из них.

Допустим, мы хотим нажать на продукты, содержащие ровно 25,0 г жира. В нашем демонстрационном приложении подходящим элементом является только пончик. Запустите этот код и посмотрите, как withText() соответствует тексту:

// Use this helper function to calculate the centroid of the detected elements.
function getCentroid(element: any): any {
    let x = (element.bndbox.xmax - element.bndbox.xmin) / 2.0 + element.bndbox.xmin;
    let y = (element.bndbox.ymax - element.bndbox.ymin) / 2.0 + element.bndbox.ymin;
    return { x: x, y: y };
}

// Find all the text elements that matches '25.0'
const elts = await aui.get().text().withText('25.0').exec();

// Then, iterate through the found elements and click on them
for(let i=0; i<elts.length; ++i){
    const centroid = getCentroid(elts[i]);
    await aui.moveMouse(Math.round(centroid.x), Math.round(centroid.y)).exec();
    await aui.mouseLeftClick().exec();
}

Image description

Вы увидите, что askui нажимает не только на 25,0, но и на 26,0, что является жиром яблочного пирога. Результат этого тестового кода может отличаться в вашем случае из-за другого разрешения экрана и отображаемого размера демонстрационного приложения.

Это даст вам четкое представление о том, где вам нужно будет использовать метод withExactText() вместо withText(). Попробуйте запустить тот же код после замены withText() на withExactText():

// Find all the text elements that matches '25.0' exactly
const elts = await aui.get().text().withExactText('25.0').exec();

// Then, iterate through the found elements and click on them
for(let i=0; i<elts.length; ++i){
    const centroid = getCentroid(elts[i]);
    await aui.moveMouse(Math.round(centroid.x), Math.round(centroid.y)).exec();
    await aui.mouseLeftClick().exec();
}

Сопоставить текст с регулярным выражением

Метод withTextRegex() поддерживает регулярное выражение для наиболее гибкого сопоставления любого текста. Хотя использование регулярных выражений может быть сложным из-за их эзотерического вида, это, возможно, одно из лучших решений, когда речь идет о сопоставлении символов.

На той же странице демонстрационного приложения предположим, что мы хотим нажать на элементы, калорийность которых составляет от 300 до 500 (cal>=300 && cal<500). Поскольку регулярное выражение не поддерживает числовое сравнение, мы попытаемся сопоставить цифры в последовательности:

// Find all the text that matches the expression
const cals = await aui.get().text().withTextRegex('[3-4][0-9]{2}').exec();

// Then, iterate through the found elements and click on them
for(let i=0; i<cals.length; ++i){
    const coord = getCentroid(cals[i]);
    console.log(cals[i].text, coord);
    await aui.moveMouse(Math.round(coord.x), Math.round(coord.y)).exec();
    await aui.mouseLeftClick().exec();
}

Регулярное выражение [3-4][0-9]{2} означает,

  • [3-4]: Сопоставьте один символ между 3 и 4.
  • [0-9]: Сопоставьте один символ между 0 и 9.
  • {2}: Повторите предыдущее выражение ([0-9]) два раза.

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

Заключение

При использовании askui для автоматических тестов большую роль играют текстовые элементы, поскольку они обычно выглядят более отчетливо, чем другие элементы, такие как значки или текстовые поля. Следовательно, знание преимуществ использования различных текстовых фильтров может иметь решающее значение при создании надежного набора тестов.

#Testing
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу