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