Перевірте присутність елемента та зачекайте команду Selenium

⚡ Розумний підсумок

Перевірте наявність елемента та команду waitFor у Selenium IDE підтверджує, що сторінка містить елементи та текст, які очікує тест, і призупиняє відтворення, доки динамічна умова не стане істинною, перш ніж виконуватиметься наступний крок.

  • 🔘 Перевірки елементів: verifyElementPresent повертає значення TRUE, коли локатор відповідає певному елементу на сторінці, а verifyElementNotPresent є його повним інверсним значенням.
  • ☑️ Перевірки тексту: verifyTextPresent шукає по всій сторінці та враховує регістр літер, тому «Atlanta» ніколи не збігається з «atlanta».
  • Перевірки позицій: Функції verifyElementPositionLeft та verifyElementPositionTop порівнюють зміщення елемента в пікселях від краю сторінки.
  • 🧪 Завантаження сторінок: Команди andWait, такі як clickAndWait, призупиняють скрипт, доки не завершиться завантаження нової сторінки.
  • 🛠️ Динамічний вміст: Команди waitFor очікують на виконання умови замість завантаження сторінки, що підходить для екранів AJAX, які ніколи не перезавантажуються.
  • 📊 Поточне середовище розробки (IDE): Розширення браузера перейменовує ці кроки та надає кожній команді очікування власний мілісекундний тайм-аут.

Перевірте наявність елемента та команду waitFor у Selenium IDE

А записаний Selenium IDE скрипт клікає та друкує, але сам по собі він ніколи не вирішує, чи правильно поводиться програма. Для цього використовуються два сімейства команд: перевірити команди, які перевіряють стан сторінки, та чекати команди, які призупиняють виконання, доки сторінка не буде готова до перевірки.

⚠️ Примітка щодо версій: скріншоти нижче взяті з оригіналу Firefox-підключати Selenium IDE, яке більше не розповсюджується, і вони використовують його назви у верблюжому регістрі селенських літер. Поточне IDE — це Chrome, Firefox і край Розширення браузераОписана тут поведінка все ще застосовується, але кілька назв команд змінилися — картаping Таблиця з’явиться далі в цій статті, і кожна оригінальна команда та знімок екрана збережені точно так, як опубліковано.

Перевірити наявність елемента

Ми можемо використовувати наступні дві команди, щоб перевірити присутність елемента:

  • verifyElementPresent – повертає TRUE, якщо вказаний елемент ЗНАЙДЕНО на сторінці; FALSE, якщо інакше
  • verifyElementNotPresent – повертає TRUE, якщо вказаний елемент НЕ ЗНАЙДЕНО ніде на сторінці; FALSE, якщо він присутній.

Обидві команди приймають елемент локатор , Target поле — ідентифікатор, ім'я, селектор CSS, текст посилання або XPath вираз — і жоден з них не потребує значення.

Наведений нижче тестовий сценарій перевіряє наявність текстового поля UserName у файлі Mercury Домашня сторінка Tours, а текстове поле Ім’я – ні. Текстове поле «Ім’я» фактично є елементом на сторінці реєстрації Mercury Тури, не на головній сторінці.

Selenium Скрипт IDE з використанням verifyElementPresent у полі userName та verifyElementNotPresent у полі First Name

Тому що це перевірити команди, а не стверджувати команди, помилка записується в журнал, а решта кроків все ще виконуються. Ця різниця детально розглядається далі.

Перевірити наявність певного тексту в команді в Selenium

Перевірки існування елемента не завжди достатньо — тест часто потребує підтвердження слів, що відображаються користувачеві. Для цього достатньо двох текстових команд.

  • verifyTextPresent – повертає TRUE, якщо вказаний текстовий рядок ЗНАЙДЕНО десь на сторінці; FALSE, якщо інакше
  • verifyTextNotPresent – повертає TRUE, якщо вказаний текстовий рядок НЕ ЗНАЙДЕНО ніде на сторінці; FALSE, якщо його було знайдено

Пам'ятайте, що ці команди чутливі до регістру.

У журналі нижче показано, що одну й ту саму сторінку перевірено двічі, і в ній є два варіанти написання однієї й тієї ж фрази.

Selenium Журнал IDE, що показує проходження verifyTextPresent для Атланти до Лас-Вегаса та невдачу для Атланти до Лас-Вегаса

У наведеному вище сценарії, «Атланта до Лас-Вегаса» оброблялося по-різному, оскільки літера «А» назви «Атланта» була великою в першому випадку, а малою в іншому. Коли команда verifyTextPresent використовувалася в кожному з них, один пройшов перевірку, а інший — не пройшов.

Перевірте конкретне положення елемента

Дефекти макета рідко порушують роботу локатора, тому перевірки присутності їх пропускають. Команди позиціонування заповнюють цю прогалину.

Selenium IDE вказує положення елемента, вимірюючи (у пікселях), наскільки він знаходиться від лівого або верхнього краю вікна браузера.

  • verifyElementPositionLeft – перевіряє, чи відповідає задана кількість пікселів відстані елемента від лівого краю сторінки. Це поверне FALSE, якщо вказане значення не відповідає відстані від лівого краю.
  • verifyElementPositionTop – перевіряє, чи відповідає задана кількість пікселів відстані елемента від верхнього краю сторінки. Це поверне FALSE, якщо вказане значення не відповідає відстані від верхнього краю.

Наведений нижче скрипт записує очікувані зміщення пікселів у стовпці «Значення».

Selenium Кроки IDE з використанням verifyElementPositionLeft та verifyElementPositionTop зі значеннями пікселів у стовпці Value

Обережно поводьтеся з цими двома командами. Зсув пікселя змінюється залежно від розміру вікна, рівня масштабування та встановлених шрифтів, тому жорстко задане число, яке пройде на одному комп'ютері, може не пройде на іншому.

Зачекайте команди Selenium

Команда verify може перевірити лише те, що вже відображається на екрані, тому перевірка, яка виконується занадто рано, завершується невдачею, навіть якщо програма працює. Команди wait вирішують цю проблему з часом.

Нижче наведено типи команд очікування Selenium

і Зачекайте команди

Це команди, які очікують завантаження нової сторінки перед переходом до наступної команди.

Прикладами можуть служити

  • клацніть і зачекайте
  • typeAndWait
  • selectAndWait

Кожна з них є звичайною командою дії з доданим суфіксом AndWait, як показано на записаному кроці нижче.

Записаний крок clickAndWait з утриманням Selenium IDE-скрипт, доки не завершиться завантаження наступної сторінки

очікування команд

Це команди, які очікують виконання певної умови перед переходом до наступної команди (незалежно від завантаження нової сторінки). Ці команди краще використовувати на динамічних веб-сайтах на основі AJAX, які змінюють значення та елементи без перезавантаження всієї сторінки. Приклади:

  • waitForTitle
  • waitForTextPresent
  • waitForAlert

Розглянемо наведений нижче сценарій у Facebook.

Форма реєстрації у Facebook із посиланням «Чому мені потрібно надати посилання на день народження, перш ніж його натиснути»

Ми можемо використовувати комбінацію «click» і «waitForTextPresent», щоб перевірити наявність тексту «Providing your birthday».

Selenium Кроки IDE, що поєднують click з waitForTextPresent для очікування на введення тексту на день народження

Ми не можемо використовувати clickAndWait, оскільки жодна сторінка не завантажувалася після натискання на «Чому мені потрібно вказувати свою дату народження?» посилання. Якщо ми це зробимо, тест провалиться

Те саме правило застосовується до будь-якого контенту, введеного скриптом, а не навігацією, тому Екрани, керовані AJAX майже завжди потрібно waitFor, а не andWait.

Команди Assert vs. Verify vs. waitFor в Selenium IDE

Початківці часто вибирають неправильне сімейство, а потім дивуються, чому комплект зупиняється на першому ж дефекті або чому повідомляє про двадцять невдач, які всі... tracе назад до одиниці. Три префікси відповідають на три різні питання.

префікс Що вона робить У разі невдачі Найкраще використовувати для
стверджувати Негайно перевіряє стан Записує помилку та зупиняє тестовий випадок Передумови — вхід, який має бути успішним, перш ніж будь-що інше матиме сенс
перевірити Негайно перевіряє стан Записує помилку та продовжує виконання наступної команди Незалежні перевірки, такі як кілька етикеток на одній сторінці підтвердження
чекати Опитування, доки умова не стане справжньою Записує помилку після закінчення часу очікування, а потім продовжує Все, що з'являється із запізненням — відповіді AJAX, спінери, діалоги

Практичний шаблон поєднує всі три: перевірити сторінку, на яку ви потрапили, чекати на елемент, який надходить асинхронно, а потім перевірити кожне окреме поле. Виконання цього в такому порядку означає, що одна несправна навігація зупиняє тест раніше терміну, тоді як кілька косметичних невідповідностей повідомляються за один прогін. Та сама дисципліна поширюється на Selenium тести, написані кодом, де еквівалентами є жорсткі твердження, м'які твердження та явні очікування.

Команди перевірки та очікування в поточному Selenium IDE

Команда FirefoxІнтегроване середовище розробки плагінів -plugin, яке створювало наведені вище знімки екрана, було виведено з експлуатації, а набір команд було перебудовано для поточного розширення браузера. Кілька назв на селенській мові збереглися, деякі були перейменовані, а деякі були видалені. У таблиці нижче команди, що використовуються в цій статті, зіставлені з їхніми сучасними еквівалентами, взятими з офіційного... Selenium Довідник команд IDE.

Стара селенська команда Команда в поточному IDE
verifyElementPresent перевірити наявність елемента
verifyElementNotPresent перевірити відсутність елемента
verifyTextPresent перевірити текст (обсяг дії — локатор елементів, а не вся сторінка)
verifyTextNotPresent перевірити, чи не є текст (область дії обмежена локатором елементів)
підтвердитиНазва підтвердити право власності
verifyElementPositionLeft / verifyElementPositionTop Немає еквівалента — твердження позиції були відхилені
clickAndWait, typeAndWait, selectAndWait Немає суфікса AndWait — команда open вже очікує завантаження сторінки
waitForElementPresent очікувати присутності елемента, з часом очікування в мілісекундах
waitForAlert підтвердити сповіщення або перевірити текст сповіщення після появи діалогового вікна

Дві відмінності мають найбільше значення в повсякденній роботі. По-перше, поточні команди очікування — wait for element present, wait for element visible, wait for element editable та їхні негативні двійники — кожна з яких має явний час очікування в мілісекундах, тому повільний крок більше не повинен мати один глобальний тайм-аут. По-друге, пошук тексту по всій сторінці зник: для перевірки тексту потрібен локатор, що зазвичай і так призводить до точнішої перевірки.

Типові помилки команд Verify та waitFor

Більшість повідомлених проблем із цими командами не є дефектами IDE. У наведеному нижче списку наведено помилки, які виникають найчастіше, та способи їх виправлення.

  • Елемент існує, але перевірка все одно не вдається. Присутність та видимість – це різні стани. Елемент, прихований за правилом CSS, все ще присутній у DOM, тому поєднуйте перевірку присутності з очікуванням видимості елемента, коли тест залежить від того, чи користувач його фактично бачить.
  • Перевірка тексту не вдається для формулювань, які виглядають ідентичними. Нерозривні пробіли, пробіли в кінці та фігурні апострофи, скопійовані з документа дизайну, порушують точну відповідність. Передрукуйте очікуваний рядок вручну, а не вставляйте його.
  • Команда очікування перевищила час очікування на сторінці, яка явно завантажилася. Елемент зазвичай знаходиться всередині iframe. Спочатку запустіть select frame, інакше локатор оцінюватиметься для неправильного документа.
  • clickAndWait зависає в односторінковій програмі. Навігація не відбувається, тому немає на що чекати. Замініть це клацанням миші та відповідною командою waitFor.
  • Перевірка позиції проходить локально та завершується невдачею на сервері збірки. Розмір екрана та відображення шрифтів відрізняються. Віддайте перевагу перевірці присутності чи тексту, або встановіть чіткий розмір вікна на початку тесту.
  • Вся сюїта зупиняється на першій же невідповідності. Там, де мала бути команда verify, було записано команду assert. Змініть префікс, і запуск повідомлятиме про кожну помилку, а не лише про першу.

Як тільки скрипт виживає через ці пастки, наступним кроком зазвичай є зберігати значення часу виконання у змінних тому перевірки порівнюються з реальними даними, а не з жорстко закодованими рядками.

Поширені запитання

Застаріле IDE використовувало один глобальний тайм-аут для кожного кроку waitFor, що змінилося за допомогою команди setTimeout. Поточне розширення приймає явний час очікування в мілісекундах для кожної команди wait, тому один повільний екран більше не змушує кожен інший крок чекати так довго.

Ні. Пауза завжди переходить у режим сну на весь час, тому вона витрачає час, коли сторінка завантажується швидко, і все одно призводить до збою, коли сторінка завантажується повільно. Використовуйте її лише для демонстрації кроку під час демонстрації, а не в наборі, який ви плануєте запускати неодноразово.

Це не так. Присутність означає, що вузол існує в DOM, що залишається істинним для елементів, прихованих CSS або розташованих поза екраном. Коли тест залежить від того, чи бачить користувач щось, додайте wait for element visible разом із перевіркою присутності.

Так, і поточна IDE цього вимагає. Її команда verify text приймає локатор елементів плюс очікуваний рядок, що є суворішим за старий пошук по всій сторінці та запобігає непов'язаному пункту меню виконувати перевірку, яку він ніколи не мав виконувати.

Code Експорт перетворює кожну команду на еквівалентний оператор цільовою мовою, тому крок очікування стає явним очікуванням WebDriver. Прочитайте згенерований файл, перш ніж довіряти йому, оскільки тайм-аути та поведінка «м’які проти апаратних збоїв» не завжди переживають переклад без змін.

Моделі машинного навчання зчитують історичні дані про виконання та позначають кроки, які періодично завершуються невдачею, а не постійно, що є ознакою пропущеного очікування. Виправлення локатора за допомогою штучного інтелекту вирішує іншу поширену причину, пропонуючи новий селектор, коли змінюється розмітка.

Він добре справляється з механічною частиною — перетворює крок очікування на WebDriverWait з очікуваною умовою. Revпереглянути вибраний тайм-аут та вибрану умову, оскільки згенерована умова присутності часто має бути умовою видимості.

Локатори оцінюються для поточного вибраного документа, а iframe – це окремий документ. Спочатку виконайте команду select frame, потім check, а потім поверніться до початкового документа, щоб наступні кроки не шукалися в неправильному контексті.

Підсумуйте цей пост за допомогою: