ПРИМІТКА. Давайте зателефонуємо "click" - це клік кінцевого користувача. 'js click' - це клацання через JS
Чому натискання "через JavaScript" працює, коли звичайний клік WebDriver не робить?
Є два випадки, щоб це сталося:
I. Якщо ви використовуєте PhamtomJS
Тоді це найпоширеніша відома поведінка PhantomJS
. Наприклад, деякі елементи не можна натискати, наприклад <div>
. Це тому, що PhantomJS
був оригінальний для моделювання двигуна браузерів (як початковий HTML + CSS -> обчислення CSS -> рендерінг). Але це не означає взаємодіяти з ним як шляхом кінцевого користувача (перегляд, клацання, перетягування). Тому PhamtomJS
лише частково підтримується взаємодія кінцевих споживачів.
ЧОМУ JS CLICK РОБОТА? Що стосується будь-якого клацання, то всі вони означають клік. Це як пістолет з 1 стволом і 2 курок . Один із вікна перегляду, один - від JS. Оскільки PhamtomJS
чудово моделює двигун браузера, клацання JS має працювати ідеально.
II. Обробник події "click" повинен прив'язатись у поганий проміжок часу.
Наприклад, ми отримали <div>
-> Ми робимо деякий розрахунок
-> тоді ми прив'язуємо подію клацання до <div>
.
-> Плюс з поганим кодуванням кутового (наприклад, неправильне керування циклом області)
Ми можемо досягти того ж результату. Клацання не вийде, тому що WebdriverJS намагається натиснути на елемент, коли у нього немає обробника подій клацання.
ЧОМУ JS CLICK РОБОТА? Js click - це як введення js безпосередньо в браузер. Можливо двома способами,
Кулак здійснюється через консоль devtools (так, WebdriverJS спілкується з консоллю devtools).
Друге - ввести <script>
тег безпосередньо в HTML.
Для кожного браузера поведінка буде різною. Але незалежно від цих методів складніше, ніж натискання на кнопку. Клацання використовує те, що вже є (натискають кінцеві користувачі), js клацання відбувається через бекдор.
А для js клацання виявиться асинхронним завданням. Це пов’язано з якоюсь складною темою " асинхронна задача браузера та планування задач процесора " (прочитайте її назад, не можу знову знайти статтю). Якщо коротко, це в основному призведе до того, що натискання js потрібно буде чекати циклу планування завдань CPU, і він буде запускатися трохи повільніше після прив'язки події клацання.
(Ви могли б знати цей випадок, коли знайшли елемент, який інколи можна натискати, іноді ні.)
Коли саме це відбувається і в чому полягає зворотний бік цього способу (якщо він є)?
=> Як згадувалося вище, обидва означають для однієї мети, але про те, як використовувати який вхід:
- Клацніть: використовується те, що надається браузером за замовчуванням.
- Клацання JS: проходить через задній хід.
=> Для продуктивності важко сказати, оскільки він покладається на браузери. Але загалом:
- Клацання: не означає швидше, а лише підписане вище місце в списку розкладу виконання завдання процесора.
- Клацання JS: не означає повільніше, але лише воно ввійшло в останню позицію списку розкладу завдання CPU.
=> Мінуси:
- Клацніть: не здається, що у вас є недоліки, за винятком того, що ви використовуєте PhamtomJS.
- JS click: дуже погано для здоров'я. Ви можете випадково натиснути на щось, чого немає на екрані. Використовуючи це, переконайтеся, що елемент є і доступний для перегляду та клацання як точки зору кінцевого користувача.
PS, якщо ви шукаєте рішення.
- Використовуючи PhantomJS? Я запропоную замість цього використати Chrome без голови. Так, ви можете налаштувати Chrome без голови на Ubuntu. Робота працює так само, як Chrome, але вона лише не має виду і менш глючна, як PhantomJS.
- Не використовуєте PhamtomJS, але у вас все ще виникають проблеми? Я пропоную використовувати ExpectedCondition Protractor з
browser.wait()
( перевірте це для отримання додаткової інформації )
(Я хочу зробити це коротким, але закінчилося погано. Все, що пов'язано з теорією, пояснити складно ...)