포스트를 작성하는 기능을 자동화하는 도중, text를 입력하는 영역에 글을 쓸 수 없는 이슈를 맞닥뜨렸다.
이슈 내용은 다음과 같았다.
플레이스홀더 문구가 쓰여있는 최하단의 span에 접근 가능한 방법은 article/div/div/div.../span[1] 형식 뿐이였다.
한참 구글링을 하던 중, click되지 않는 element를 js 명령어로 click하는 포스트를 발견했다.
포스트의 설명에 따르면 click 명령을 내렸으나 click되지 않는 것은, click이 되었으나 click에 따른 명령어를 받지 못한 경우라고 한다.
하지만 링크가 아닌 onclick과 같은 js가 들어있는 경우에는 제대로 선택해 click() 명령을 하더라도 href 속성이 없기에 정상적으로 링크 이동이 불가능하다.
이럴 때에는 onclick 내부의 명령어가 실행되도록 해야한다.
포스트에서 총 2가지 방법을 소개해줬다.
# 방법 1
sample = driver.find_element(By.XPATH, "xpath")
sample.send_keys('\n')
이 방법은 해당 명령어의 위치에서 '\n'을 입력하여 엔터를 입력시켜 click()과 동일한 효과를 가지게 하는 방법이다.
나는 다음의 두 번째 방법을 사용해봤다.
# 방법 2
sample = driver.find_elemet(By.XPATH, "xpath")
sample.execute_script("arguments[0].click();", sample)
이 방법은 javascript 명령어를 사용하여 스크립트를 실행하는 명령이다.
arguments는 함수 호출 시, 전달인자들이 배열 형태로 저장된 객체이다.
arguments[0]은 그중 첫 번째 인자를 가리키며, 그 첫 번째 인자가 우리가 xpath로 찾아준 webElement인 'sample'이 되는 것이다.
따라서 webElement 'sample'에 대해 click() 명령을 js 명령어로 내리는 것이다.
아래는 내가 작성한 코드이다.
input_line = driver.find_elements(By.XPATH, "xpath")
driver.execute_script("arguments[0].click();", input_line[1])
action.send_keys("automation 텍스트 입력합니다.").perform()
이걸 해결하기위해 삽질하던 중, ActionChains에 대해 알게됐다.
정확한 내용은 아직 모르지만, 찾은 element에 이어서 selenium 명령을 내릴 수 있는것 같다.
앞으로 알아보고 정리해보도록 하겠다.