[Selenium] click되지 않는 element를 javascript 명령어로 click하기

kyeongjun_min·2022년 4월 13일
0

UI 테스트 자동화

목록 보기
2/3
post-thumbnail

포스트를 작성하는 기능을 자동화하는 도중, text를 입력하는 영역에 글을 쓸 수 없는 이슈를 맞닥뜨렸다.

이슈 내용은 다음과 같았다.

  1. html의 글을 쓰는 영역에 input 태그가 없다.
  2. 때문에 글을 쓰는 영역에 존재하는 모든 div, p, span 태그에 send_keys 해봤으나, 에러가 발생했다.
  3. 해당 element를 찾을 수 없다던가, 해당 element에 수행할 수 없는 명령이라는 에러가 돌아왔다.
  4. 글을 쓰는 영역은 article 태그로 묶여있었으나, article 아래의 div 태그까지는 접근 가능했지만 그 아래의 p, span에는 find_element(By.XPATH)로 접근할 수 없었다.



플레이스홀더 문구가 쓰여있는 최하단의 span에 접근 가능한 방법은 article/div/div/div.../span[1] 형식 뿐이였다.

한참 구글링을 하던 중, click되지 않는 element를 js 명령어로 click하는 포스트를 발견했다.

포스트의 설명에 따르면 click 명령을 내렸으나 click되지 않는 것은, click이 되었으나 click에 따른 명령어를 받지 못한 경우라고 한다.


예시로, a 태그에 href 속성이 있는 경우에는 a 태그에 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 명령을 내릴 수 있는것 같다.
앞으로 알아보고 정리해보도록 하겠다.



참조

  1. 가장 큰 도움이 됐던 click되지 않던 이유와 js 사용을 알려준 포스트 : https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=kiddwannabe&logNo=221430636045
  2. 유사한 네이버 블로그 포스트 작성으로 ActionChains를 알게된 포스트 : https://kissi-pro.tistory.com/entry/Python-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%9E%90%EB%8F%99-%ED%8F%AC%EC%8A%A4%ED%8C%85-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0-2-%EC%A0%9C%EB%AA%A9-%EB%B3%B8%EB%AC%B8-%EC%9E%91%EC%84%B1
  3. arguments란? : https://jacobgrowthstory.tistory.com/63
  4. selenium의 execute_script에서 arguments[0]란 무엇을 의미하는가? : https://stackoverflow.com/questions/49871432/what-does-arguments0-and-arguments1-mean-when-using-executescript-method-fro
profile
QA Engineer, 즐겁게 기록을 시작

0개의 댓글