일이 바빠 포스팅 하기가 너무 힘들지만 그래두 열심히 하려고 하고있습니다. ㅜㅜ
지난 포스팅때 만들어 놓은 Naver Login - selenium-JS ( iframe 대처 방안 - IE 버전) 이 있는데요
// naver 자동 로그인하여서 최근 메일 가져오기 - IE
해당 소스코드가 Windwos 10 에서 같은 드라이버와 같은 브라우저 버전 같은 npm Node.js 버전을 사용하여도
동작하지 않습니다.
??
일단 멈춰지는 소스코드는 await loginBtn.click(); 입니다.
여기서 클릭이 안됐는데 다음 DOM 찾고 객체 찾고를 반복 하다보니
되지않던 현상이였습니다.
관련 내용을 찾아 보니
셀리니엄 HQ에 이런 이슈가 있더군요
// 링크
https://github.com/SeleniumHQ/selenium/issues/4292
이슈는 역시 Closed 되어있고
셀레니엄팀에서 해줬을 거라고는 생각 하지 않습니다.
(최신버전을 쓰고있는 저에게 되지않으니까요 Stable 버전 기준으로)
아래 글 내용들을 읽어 보니
결국 우회 처리로 요소를 클릭 하였습니다.
그 우회 처리란
// login 버튼 가져와서 클릭 let loginBtn = await driver.findElement(By.css("input[type='submit']")); await loginBtn.click();
기존에는 위와같이 await loginBtn.click() 이 동작하였지만 Windwos 10 에서는 동작하지가 않습니다.
그래서 사용하는 우회 방법은
Driver 모듈에 있는 executor를 이용하는 방법입니다.
일단 JS DOC을 한번 확인해보겠습니다.
보시면 2개가 있는데 Async 근 비동기방식이고 제가 펼쳐 놓은 이 executor는 동기 방식으로 차이는 없습니다.
자 보시면 (Script,... args) 라고 되어있습니다.
앞에 파라미터로는 스크립트가 들어갈 것이고 뒤에 arguments로는 WebElement가 들어가야 된다고 쓰여있네요
그럼 저 위에 동작하지 않는 login Btn 을 어떻게 클릭을 할것인가 하면
말그대로 앞에는 스크립트 ( 클릭 스크립트를 넣을것이고) 뒤에는 가져온 WebElement ( loignBtn 을 넣어서 확인합니다.)
await driver.executeScript('return arguments[0].click()",loginBtn);
단순합니다. 우측에 놓은 element 가 arguments로 넘어오게 되고 1개만 넘겼으니 [0]으로 첫번째 값을 가져오면 됩니다.
가져온 후에 click 을 하는 스크립트로 return 을 넣어주면 driver executor에서 해당 반환된 스크립트를 브라우저로
인젝션하게 되어 실행을 합니다.
해당 이슈에서도 그렇고 여러 Win10 분들은 이와 같은 방안으로 우회를 하고 있는 것으로 보여집니다.
win 10에서 네이버 로그인시 DOM 도 제대로 못가져오는 경우가 있는데
이에 대해서는 다음 포스팅때 작성 하도록 하겠습니다.
감사합니당