현재 selenium을 굉장히 애용해서 졸작을 만들고 있다.
그중에서 input_element.clear()을 사용하면 계속 오류가 발생하기에 왜 발생하는지 찾아보니까
(이건 By. 중에서 내가 필요한게 없을때 쓰는 방법이다.)
아래는 내가 물어본 코드의 일부이다. (불필요하다고 생각되는 건 제외했다.)
driver.get(urls)
inputs = driver.find_elements(By.TAG_NAME, 'input')
for input_element in inputs:
value = input_element.get_attribute('value')
if value == 'bee':
input_element.clear()
input_element.send_keys('type="hidden" name="login" value="bee"')
print(input_element)
InvalidElementStateException은 일반적으로 웹 요소가 사용자 상호 작용을 위해 준비되지 않았을 때 발생합니다. 이 경우 input_element.clear() 메서드가 호출되었을 때 해당 요소가 수정 가능한 상태가 아니었을 수 있습니다. 예를 들어, 입력 필드가 비활성화(disabled)되어 있거나 읽기 전용(readonly)일 수 있습니다. 이 문제를 해결하려면 해당 요소의 상태를 확인하고 수정 가능한 상태로 변경한 후 다시 시도해 보세요.
라는 빙AI의 답변이 왔다. 정리하자면
수정이 불가능한걸 하려고 했기에 오류가 발생했다는 것이다. 그래서 변경이 가능한 코드를 물어봤고
driver.execute_script("arguments[0].removeAttribute('readonly')", input_element)
driver.execute_script("arguments[0].removeAttribute('disabled')", input_element)
위에 두 가지를 알려줬다. readonly는 읽기전용을 해제한다는 뜻이고 disabled은 비활성화를 해제한다는 뜻이다.
그런데 저걸 추가해도 똑같이 오류(InvalidElementStateException)가 발생하였고 다시 물어보니 전체 오류 메시지를 보내라고 해서 결국 다 물어봤다.
input_element.clear() 메서드 호출 시 InvalidElementStateException 오류발생이 맞지만 문제의 원인을 모른다고 하여서 하.. 짜증이 나긴했지만 오히려 빙AI가 디버깅을 하거나 해당 요소의 HTML 코드를 출력하는 코드를 알려줬다.
그러니까 이렇게 안내를 해주었고 저 코드를 쓰니까 정확히 value값만 변경이 된 것을 확인할 수 있었다.
최종적으로 바뀐 코드
driver.get(IDOR)
inputs = driver.find_elements(By.TAG_NAME, 'input')
for input_element in inputs:
value = input_element.get_attribute('value')
if value == 'bee':
print(input_element.get_attribute('outerHTML')) #get_attribute : 특정 요소의 값 반환
driver.execute_script("arguments[0].value = 'aaaaa'", input_element)
print(input_element.get_attribute('outerHTML')) #바꼈는지 확인
'Web' 카테고리의 다른 글
Metasploitable, OWASP-ZAP, 그리고 Security Onion으로 공부하기 #1 웹, 네트워크 기초 이론 공부 (0) | 2023.11.02 |
---|---|
Metasploitable, OWASP-ZAP, 그리고 Security Onion으로 공부하기 #0 준비 단계 (0) | 2023.10.30 |
Selenium과 Requests의 차이 (0) | 2023.04.29 |
IIS 설치 방법 (0) | 2023.02.28 |
HTTP 작동방식 (요청과 응답) (0) | 2023.02.28 |