현상
오랜만에 이전에 Selenium으로 만들어두었던 Python 코드를 살펴봤다. 실행을 시켜보고자 Selenium 패키지와 크롬 드라이버를 새로 설치하고 실행시켰더니 아래와 같은 에러가 발생했다.
원인
기존에 selenium 3.141.0을 사용하다가 최신 버전인 selenium 4.9.1을 설치해서 테스트했는데, 확인해보니 Selenium의 버전이 올라가면서 find_element 관련 함수에 변경이 있었던 모양이다.
find_element_by_xpath, find_element_by_id, find_element_by_xpath와 같이 검색 기준 별로 함수를 제공하는 대신 find_element 함수로 통합된 것으로 보인다.
해결
find_element_by_XXX 함수 대신 find_element 함수를 사용하면 된다. element를 찾을 때 사용할 기준을 By.XXX으로 지정하고, 검색할 값을 전달한다.
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')
예시 )
find_element(By.ID, "id")
find_element(By.NAME, "name")
find_element(By.XPATH, "xpath")
find_element(By.LINK_TEXT, "link text")
find_element(By.PARTIAL_LINK_TEXT, "partial link text")
find_element(By.TAG_NAME, "tag name")
find_element(By.CLASS_NAME, "class name")
find_element(By.CSS_SELECTOR, "css selector")
테스트
테스트한 코드는 아래와 같다. 간단하게 로그인을 하기 위해 name을 기준으로 요소를 찾아 값을 세팅한다.
기존 코드
from selenium import webdriver
from selenium.webdriver.common.by import By
if __name__ == '__main__':
login_url = f"{map_auth_info['url']}/users/sign_in"
driver = webdriver.Chrome('driver/chromedriver.exe')
driver.get(login_url)
driver.find_element_by_name('username').send_keys(info['id'])
driver.find_element_by_name('password').send_keys(info['passwd'])
driver.find_element_by_name('commit').click()
수정 코드
from selenium import webdriver
from selenium.webdriver.common.by import By
if __name__ == '__main__':
login_url = f"{map_auth_info['url']}/users/sign_in"
driver = webdriver.Chrome('driver/chromedriver.exe')
driver.get(login_url)
driver.find_element(By.NAME, 'username').send_keys(ad_info['id'])
driver.find_element(By.NAME, 'password').send_keys(ad_info['passwd'])
driver.find_element(By.NAME, 'commit').click()
참고 문서
https://sualchi.tistory.com/13721870
https://selenium-python.readthedocs.io/locating-elements.html