참고 : '클릭'이라고 부르 자 최종 사용자 클릭입니다. 'js 클릭'은 JS를 통한 클릭입니다.
정기적 인 WebDriver 클릭이되지 않을 때 왜 "JavaScript를 통한"클릭이 작동합니까?
이 경우 2 가지 경우가 있습니다.
I. PhamtomJS를 사용하는 경우
그러면 이것이 가장 일반적인 동작입니다 PhantomJS
. 예를 들어 일부 요소를 클릭 할 수없는 경우가 <div>
있습니다. 이는 PhantomJS
브라우저의 엔진을 시뮬레이션하기 위해 원래 만들어 졌기 때문 입니다 (초기 HTML + CSS-> 컴퓨팅 CSS-> 렌더링). 그러나 최종 사용자의 방식 (보기, 클릭, 드래그)으로 상호 작용한다는 의미는 아닙니다. 따라서 PhamtomJS
최종 사용자 상호 작용을 통해서만 부분적으로 지원됩니다.
왜 JS 클릭이 작동합니까? 두 클릭 모두 평균 클릭입니다. 그것은 1 개의 배럴 과 2 개의 방아쇠를 가진 총과 같습니다 . 하나는 뷰포트에서, 다른 하나는 JS에서. 때문에 PhamtomJS
브라우저의 엔진을 시뮬레이션에 큰하는 JS 클릭 완벽하게 작동합니다.
II. "click"의 이벤트 핸들러가 나쁜 시간에 바인드되었습니다.
예를 들어, 우리는 <div>
우리는 같은 결과로 끝날 수 있습니다. 클릭 이벤트 핸들러가없는 경우 WebdriverJS가 요소를 클릭하려고하므로 클릭이 작동하지 않습니다.
왜 JS 클릭이 작동합니까? JS 클릭은 js를 브라우저에 직접 주입하는 것과 같습니다. 두 가지 방법으로 가능
주먹 은 devtools 콘솔을 통해 이루어집니다 (예, WebdriverJS는 devtools의 콘솔과 통신합니다).
두 번째 는 <script>
태그를 HTML에 직접 삽입하는 것 입니다.
각 브라우저마다 동작이 다릅니다. 그러나 그럼에도 불구하고 이러한 방법은 버튼을 클릭하는 것보다 더 복잡합니다. 클릭은 이미 존재하는 것을 사용하고 (최종 사용자 클릭) js 클릭은 백도어를 통해 진행됩니다.
그리고 js의 경우 클릭은 비동기 작업으로 나타납니다. 이것은 ' 브라우저 비동기 작업 및 CPU 작업 예약 ' 이라는 다소 복잡한 주제와 관련이 있습니다 (이전 기사를 다시 찾을 수 없음). 간단히 말해 이것은 js 클릭이 CPU 의 작업 스케줄링 주기를 기다려야 하고 클릭 이벤트 바인딩 후 약간 느리게 실행될 때 발생합니다.
(때때로 클릭 할 수있는 요소를 찾았을 때이 경우를 알 수있었습니다.)
정확히 언제 이런 일이 발생하며이 해결 방법의 단점은 무엇입니까?
=> 위에서 언급했듯이 둘 다 한 가지 목적을 의미하지만 어떤 입구를 사용하는지에 대한 의미입니다.
- 클릭 : 기본적으로 브라우저에서 제공하는 것을 사용하고 있습니다.
- JS 클릭 : 백도어를 통해 진행 중입니다.
=> 성능을 위해서는 브라우저에 의존하기 때문에 말하기가 어렵습니다. 그러나 일반적으로
- 클릭 : CPU 실행 작업의 일정 목록에서 더 빠르지는 않지만 더 높은 자리에만 서명한다는 의미입니다.
- JS 클릭 : 느리다는 의미는 아니지만 CPU 작업의 일정 목록의 마지막 위치에만 로그인했습니다.
=> 단점 :
- 클릭 : PhamtomJS를 사용하지 않는 한 단점이없는 것 같습니다.
- JS 클릭 : 건강에 매우 나쁨. 보기에없는 것을 실수로 클릭 할 수 있습니다. 이것을 사용할 때 요소가 있고 최종 사용자의 관점에서보고 클릭 할 수 있는지 확인하십시오.
해결책을 찾고 있다면 PS.
- PhantomJS를 사용하십니까? 대신 Chrome 헤드리스를 사용하는 것이 좋습니다. 예, Ubuntu에서 Chrome 헤드리스를 설정할 수 있습니다. Chrome과 마찬가지로 실행되지만 PhantomJS와 같은보기와 버그가 적습니다.
- PhamtomJS를 사용하지 않지만 여전히 문제가 있습니까? Protractor의 ExpectedCondition을 사용하는 것이 좋습니다
browser.wait()
( 자세한 내용은 이것을 확인하십시오 )
(짧게 만들고 싶지만 결과가 나빴습니다. 이론과 관련된 것은 설명하기가 복잡합니다 ...)