UWAGA: nazwijmy „kliknięciem” kliknięciem użytkownika końcowego. „js click” to kliknięcie przez JS
Dlaczego kliknięcie „przez JavaScript” działa, podczas gdy zwykłe kliknięcie WebDriver nie?
Istnieją 2 przypadki, w których może się to zdarzyć:
I. Jeśli używasz PhamtomJS
W takim razie jest to najczęstsze znane zachowanie PhantomJS
. Na przykład niektóre elementy czasami nie są klikalne <div>
. Dzieje się tak, ponieważ PhantomJS
został stworzony do symulacji silnika przeglądarek (jak początkowy HTML + CSS -> obliczeniowy CSS -> renderowanie). Ale nie oznacza to interakcji jako sposobu użytkownika końcowego (przeglądanie, klikanie, przeciąganie). Dlatego PhamtomJS
jest tylko częściowo wspierany przez interakcję z użytkownikiem końcowym.
DLACZEGO JS CLICK DZIAŁA? Jeśli chodzi o jedno kliknięcie, wszystkie oznaczają kliknięcie średnie. Jest jak pistolet z 1 lufą i 2 spustami . Jeden z widoku, jeden z JS. Ponieważ PhamtomJS
świetnie symuluje silnik przeglądarki, kliknięcie JS powinno działać idealnie.
II. Program obsługi zdarzenia „kliknięcie” musiał się wiązać w złym okresie.
Na przykład otrzymaliśmy plik <div>
Możemy otrzymać ten sam rezultat. Kliknięcie nie zadziała, ponieważ WebdriverJS próbuje kliknąć element, gdy nie ma on obsługi zdarzenia kliknięcia.
DLACZEGO JS CLICK DZIAŁA? Js click jest jak wstrzyknięcie js bezpośrednio do przeglądarki. Możliwe na 2 sposoby,
Pięść jest za pośrednictwem konsoli DevTools (tak, WebdriverJS ma komunikować się z konsolą DevTools').
Drugi jest wstrzyknąć <script>
tagu bezpośrednio w HTML.
Zachowanie będzie inne dla każdej przeglądarki. Ale niezależnie od tego, te metody są bardziej skomplikowane niż kliknięcie przycisku. Kliknięcie wykorzystuje to, co już tam jest (klikają użytkownicy końcowi), kliknięcie js przechodzi przez tylne drzwi.
W przypadku js kliknięcie będzie wyglądać jak zadanie asynchroniczne. Jest to związane z dość złożonym tematem „ asynchroniczne zadanie przeglądarki i planowanie zadań procesora ” (przeczytaj go chwilę wstecz, nie mogę znaleźć artykułu ponownie). Krótko mówiąc, będzie to głównie skutkować tym, że js click będzie musiało czekać na cykl planowania zadań procesora i będzie działać nieco wolniej po powiązaniu zdarzenia click.
(Możesz znać ten przypadek, gdy znalazłeś element, który czasami można kliknąć, a czasem nie).
Kiedy dokładnie to się dzieje i jakie są wady tego obejścia (jeśli w ogóle)?
=> Jak wspomniano powyżej, oba mają na celu jeden cel, ale o używaniu którego wejścia:
- Click: używa tego, co zapewnia domyślnie przeglądarka.
- JS klik: przechodzi przez backdoor.
=> Jeśli chodzi o wydajność, trudno powiedzieć, ponieważ opiera się na przeglądarkach. Ale ogólnie:
- Kliknięcie: nie oznacza szybciej, ale tylko podpisana wyższa pozycja na liście harmonogramów zadań wykonania procesora.
- Kliknięcie JS: nie oznacza wolniejszego, ale tylko wpisało się na ostatnią pozycję listy harmonogramu zadań procesora.
=> Wady:
- Kliknięcie: nie wydaje się mieć żadnych wad, z wyjątkiem tego, że używasz PhamtomJS.
- Kliknięcie JS: bardzo szkodliwe dla zdrowia. Możesz przypadkowo kliknąć coś, czego nie ma w widoku. Kiedy używasz tego, upewnij się, że element jest tam i dostępny do wyświetlenia i kliknięcia jako punkt widzenia użytkownika końcowego.
PS jeśli szukasz rozwiązania.
- Korzystasz z PhantomJS? Zamiast tego zasugeruję użycie Chrome Headless. Tak, możesz skonfigurować Chrome bezgłowy na Ubuntu. Rzecz działa podobnie jak Chrome, ale nie ma tylko widoku i jest mniej błędna jak PhantomJS.
- Nie używasz PhamtomJS, ale nadal masz problemy? Zasugeruję użycie ExpectedCondition of Protractor z
browser.wait()
( sprawdź to, aby uzyskać więcej informacji )
(Chcę, żeby to było krótkie, ale skończyło się źle. Wszystko, co dotyczy teorii, jest trudne do wyjaśnienia ...)