이슈
이슈 발생
org.openqa.selenium.InvalidElementStateException: invalid element state: Element is not currently interactable and may not be manipulated.
이슈 원인
hidden 태그에 값 지정하는 부분에서 에러 발생
→ hidden 태그는 selenium 기본 패키지에서 지원하지 않음
이슈 해결
javasciptExecute 라이브러리를 사용해야 한다.
JavasciptExecute
정의
Selenium webDriver를 통해 다양한 Javascript 관련 작업을 지원하는 인터페이스이다.
executeScipt와 executeAsyncScript(비동기) 메소드를 제공한다.
ExecuteScipt vs ExecuteAsyncScript
ExecuteScipt
- Selenium에서 현재 선택된 프레임 또는 윈도우의 컨텍스트에서 JavaScript를 실행한다.
- 이 메서드에서 사용되는 스크립트는 익명 함수의 본문에서 실행된다.
- Boolean, Long, String, List, WebElement 형의 값을 반환할 수 있다.
ExecuteAsyncScript
- 비동기 스크립트로 페이지가 더 빨리 렌더링된다.
- 페이지 렌더링 전에 사용자가 스크립트를 다운로드할 때까지 기다릴 필요가 없다.
- Selenium에서 현재 선택된 프레임이나 윈도우의 맥락에서 비동기 자바 스크립트를 실행한다.
- 이렇게 실행된 JS는 동기식으로 실행되는 다양한 콜백 함수를 사용하는 단일 스레드이다.
사용법
1. gradle maven 다운받기
// https://mvnrepository.com/artifact/com.jsexecutor/jsexecutor-core
testImplementation('com.jsexecutor:jsexecutor-core:1.0.5')
2. 패키지 import 하기
import org.openqa.selenium.JavascriptExecutor
3. driver를 JavascriptExecutor로 형변환하여 변수 생성 및 초기화
[java]
JavascriptExecutor jse = (JavascriptExecutor) driver
[kotlin]
var jse:JavascriptExecutor = driver as JavascriptExecutor
4. 메소드 호출
jse.executeScript(script, args);
작동 방식
버튼 클릭
js.executeScript(“document.getElementByID(‘element id’).click();”);
텍스트 보내기
js.executeScript(“document.getElementByID(‘element id ’).value = ‘xyz’;”);
체크 박스
js.executeScript(“document.getElementByID(‘element id ’).checked=false;”);
브라우저 재실행
js.executeScript(“location.reload()”);
사용 이유
- Selenium WebDriver 만으로는 특정 작업을 수행하거나 웹 요소와 상호 작용할 수 없다.
- 이 경우 해당 작업이 정확하게 수행되는지 확인하려면 JavascriptExecutor가 필요하다.
'Etc > Selenium' 카테고리의 다른 글
[Selenide] 셀레나이드 시작하기 (0) | 2023.06.25 |
---|---|
[Selenium, Selenide] 셀레니움과 셀레나이드 (0) | 2023.06.24 |
[Selenium] AQUA IDE (0) | 2023.06.24 |
[Selenium] 셀레니움 시작하기 (0) | 2023.06.24 |