Web

셀레니움에서 clear()안써지는 경우 다른 해결법 (value 값 변경)

만보만보잠만보 2023. 4. 8. 20:35

 

현재 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'))  #바꼈는지 확인