설명하고보니 당연한 차이이긴 하지만, Selenium에서 JavascriptExecuter.executeScript()를 사용할때, click과 checked=true의 차이를 작성해봅니다.
In simple words, JavascriptExecutor is an interface that is used to execute JavaScript with Selenium. To simplify the usage of JavascriptExecutor in Selenium, think of it as a medium that enables the WebDriver to interact with HTML elements within the browser. JavaScript is a programming language that interacts with HTML in a browser, and to use this function in Selenium, JavascriptExecutor is required.
https://www.browserstack.com/guide/javascriptexecutor-in-selenium
Selenium을 이용하여 브라우저를 조작할 때, 특정 상황에서는 직접 javascript 실행해야합니다.
이 때 execiteScript()
메소드에 실행하고자 하는 javascript 문을 String으로 전달하고, 그 다음 해당 javascript명령어로 조작하고자 하는 WebElement요소를 전달합니다.
보통 JavascriptExecutor는 driver로 조작할 수 없는 어떠한 Interact한 조작을 진행할 때 사용되기도 하며, 화면상에는 보이지 않는 객체를 조작할 때에도 사용됩니다.
자주 보이는 경우로는, 라디오버튼과 체크박스를 조작할 때입니다.
<input type="radio"/>
<input type="checkbox"/>
보통 이런 요소를 핸들링할 때 사용하는데, 화면에는 보이지만 왠지 모르게 WebElement.click()
으로는 동작하지 않는 경우가 많습니다.
google에 검색해보면, 대부분의 경우 xpath로 지정할 시 제대로 된 지정자가 아니라서 실패한다는 내용들이 많습니다. cssSelector나 id를 통해서 지정해야한다는 글이 많은데, 신기하게도 그렇게 해도 클릭이 안되는 경우가 더러 있습니다;; (저도 아직 공부중이라 왜 제대로 지정이 안되는지는 의문입니다..)
저는 그럴때 JavascriptExecutor
를 이용합니다.
이 때 지정해주는 방법으로는 click()
과 checked=true
의 방법이 있는데, 비슷하면서도 약간 다릅니다.
((JavascriptExecutor) driver).executeScript("arguments[0].click();", checkbox);
제대로 클릭합니다. 라디오 버튼이나 체크박스를 클릭하는 행위를 트리거로 삼아 동작하는 다른 element들을 확인해야한다면, click()
을 사용해야합니다.
가령, 특정 요소를 클릭함에 따라, 다른 select태그 등에서 표시하는 option이 변화한다던지, disabled
처리를 하는 요소들이 있다면, click()
을 해야 동작합니다.
((JavascriptExecutor) driver).executeScript("arguments[0].checked = true;", radiobutton);
라디오버튼이나 체크박스에 체크를 입력하게는 하나, 위와 같이 클릭함으로 인하여 동작하는 다른 interaction 들은 발생시킬 수 없습니다.
이 경우는 form
태그 내부에서 쓰이는 라디오버튼이나 체크박스 중, submit
기능을하는 버튼을 통해 form의 내용을 전송하는 경우에는 유효하게 사용될 수 있습니다.
WebDriver로 click을 실행하는 것과, JavascriptExecutor를 이용하여 click을 실행하는 것은, 위에서 말씀드렸다시피, 브라우저상에 보이는 객체를 직접 클릭하냐, 보이지 않는 객체까지 클릭하냐의 차이입니다.
좀 더 자세한 설명은 아래 게시글에 상세히 설명되어있어, 대신합니다.
https://stackoverflow.com/questions/34562061/webdriver-click-vs-javascript-click
Ref