이번 포스팅에서는 셀레늄(selenium), 셀레니움 문법 변경 사항, 셀레니움4에서 AttributeError가 발생되는 원인을 파악하고 자주 사용되는 “find_element” 에러 문제 해결 방법을 정리해보았습니다.
셀레니움, 셀레늄(Selenium)은 자동화 웹 테스팅 도구로, 웹 브라우저를 자동화하여 웹 애플리케이션을 테스트하고 스크래핑하는 데 자주 쓰입니다. Selenium은 여러 언어(Java, Python, C#, 등)에서 사용할 수 있습니다.
셀리니움은 다양한 브라우저(Chrome, Firefox, Safari, 등)를 지원하며, 브라우저를 제어하여 자동으로 특정 작업을 수행할 수 있습니다. 예를 들어, 로그인이 필요한 웹사이트에 접근해서 로그인 작업을 수행하고, 해당 웹사이트에서 필요한 정보를 수집할 수 있습니다.
셀레니움은 웹 테스팅에 많이 사용되지만, 웹 크롤링을 비롯한 다른 목적으로도 사용됩니다. 웹 크롤링에서는 Selenium을 사용하여 브라우저를 자동화하고, 웹사이트에서 필요한 정보를 수집합니다.
Selenium은 마치 우리가 웹사이트를 이용하는 것처럼 홈페이지를 제어할 수 있습니다. 이를 통해 더욱 효과적이고 정확한 웹 크롤링이 가능하도록 해주는데요,
22년 말 부터 셀레니움이 업데이트 되면서 이전에 잘 사용하던 코드들이 아래와 같은 오류를 발생시키기 시작했습니다.
AttributeError: ‘WebDriver’ object has no attribute ‘find_element_by_id’
AttributeError: ‘WebDriver’ object has no attribute ‘find_element_by_name’
AttributeError: ‘WebDriver’ object has no attribute ‘find_element_by_tag_name’
이번 포스팅에서는 우선 셀레니움4 변경점에 대해서 가볍게 정리해보고 주요 에러 발생 요인이 되는 find_element 중심으로 AttributeError 해결방법 – 셀레니움 문법 변경에 대해 정리해보았습니다.
셀레니움 문법 변경 개요 (셀레니움4 변경 사항)
셀레니움 문법 변경 개요를 정리하면 아래와 같습니다.
1. W3C 프로토콜 준수
Selenium WebDriver의 주요 변경 사항 중 하나는, 브라우저와의 상호 작용을 위한 프로토콜로 W3C 표준 프로토콜을 준수한다는 것입니다. 이전에는 API 기반의 JSON 프로토콜을 사용했으나, 이로 인해 브라우저마다 Selenium 명령이 다르게 작동하는 문제가 발생했습니다. 이에 따라 W3C 표준 프로토콜을 준수함으로써, 브라우저에 상관없이 Selenium 명령이 일관성 있게 동작하도록 개선되었습니다.
2. Selenium IDE
Selenium IDE는 Chrome 확장 프로그램으로, 브라우저에서 사용하는 마우스 클릭, 키 입력 등을 녹화하여 스크립트 자동 생성을 지원하는 도구입니다. Selenium IDE는 Java, NodeJS, Python의 자동 코드 생성을 지원하며, Selenium 4.0에서는 더 많은 기능을 제공합니다.
3. Selenium Grid 4 (Docker Container)
Selenium Grid는 Selenium을 사용하여 여러 대의 머신에서 테스트를 병렬로 실행할 수 있는 도구입니다. Selenium 4.0에서는 Docker Container를 사용하여 Selenium Grid를 실행할 수 있습니다. 이를 통해 하나의 스크립트로 원격 실행이 가능하며, 다수의 가상 머신에서 Selenium을 배포하고 실행할 수 있습니다.
이러한 변경으로 인해 Selenium 4.0은 이전 버전보다 더욱 강력한 자동화 도구가 되었으며, 브라우저와의 상호작용에서 발생할 수 있는 문제를 해결하는 데 도움을 줍니다. 또한 Selenium IDE와 Selenium Grid가 개선되어, 보다 다양한 테스트 환경에서 사용할 수 있는 강력한 자동화 도구를 제공합니다.
셀레니움 문법 변경 : find_element 에러 해결 방법
사실 위와 같은 셀레니움4를 사용하다 보면 아래와 같이 자주 사용하는 find_element 에러를 가장 처음 만나게 되는 것 같습니다.
find_element 메소드는 HTML 소스 코드에서 해당하는 요소를 찾아주는 메소드로 아래와 같은 속성값에 일치하는 요소를 찾아줍니다.
By.ID | 태그의 id값으로 추출 |
By.NAME | 태그의 name값으로 추출 |
By.XPATH | 태그의 경로로 추출 |
By.LINK_TEXT | 링크 텍스트값으로 추출 |
By.PARTIAL_LINK_TEXT | 링크 텍스트의 자식 텍스트 값을 추출 |
By.TAG_NAME | 태그 이름으로 추출 |
By.CLASS_NAME | 태그의 클래스명으로 추출 |
By.CSS_SELECTOR | css선택자로 추출 |
셀레니움 문법 변경사항 개요
셀레니움 문법 변경에 대한 주요 사항은 아래와 같습니다.
셀레니움4에서는 문법이
find_element_by_***()
메서드를 모두
find_element(By.***, ***) 와 같은 형태로 변경되었습니다.
또한 아래와 같은 추가 선언도 필요합니다.
1 | from selenium.webdriver.common.by import By |
각각의 셀레니움 문법 변경에 대해 상세 정리하면 아래와 같습니다.
find_element(By.ID, ‘id값’)
find_element(By.ID, 'id값')
메서드는 HTML 요소의 id
속성을 사용하여 해당 요소를 찾습니다. HTML 문서 내에서 유일한 id
속성값을 갖는 요소를 찾아서 반환합니다.
1 2 3 4 5 6 7 | # 변경 전 element = driver.find_element_by_id(‘myid’) # 변경 후 from selenium.webdriver.common.by import By element = driver.find_element(By.ID, ‘myid’) |
find_element(By.NAME, ‘name값’)
find_element(By.NAME, 'name값')
메서드는 HTML 요소의 name
속성을 사용하여 해당 요소를 찾습니다. name
속성값이 유일한 요소를 찾아서 반환합니다.
1 2 3 4 5 6 7 8 | # 변경 전 element = driver.find_element_by_name(‘myname’) # 변경 후 from selenium.webdriver.common.by import By element = driver.find_element(By.NAME, ‘myname’) |
find_element(By.XPATH, ‘XPath 표현식’)
find_element(By.XPATH, 'XPath 표현식')
메서드는 XPath 표현식(태그의 경로)을 사용하여 요소를 찾습니다. XPath는 문서 내에서 요소의 위치를 지정하기 위한 표현식 언어입니다. 이 메서드는 다양한 XPath 표현식을 사용하여 요소를 찾을 수 있습니다.
1 2 3 4 5 6 7 8 | # 변경 전 element = driver.find_element_by_xpath(‘//path/to/element’) # 변경 후 from selenium.webdriver.common.by import By element = driver.find_element(By.XPATH, ‘//path/to/element’) |
find_element(By.LINK_TEXT, ‘링크 텍스트’)
find_element(By.LINK_TEXT, '링크 텍스트')
메서드는 링크 텍스트를 사용하여 요소를 찾습니다. 이 메서드는 링크 텍스트가 정확하게 일치하는 요소를 찾아서 반환합니다.
1 2 3 4 5 6 7 8 | # 변경 전 element = driver.find_element_by_link_text(‘my link’) # 변경 후 from selenium.webdriver.common.by import By element = driver.find_element(By.LINK_TEXT, ‘my link’) |
find_element(By.PARTIAL_LINK_TEXT, ‘부분 링크 텍스트’)
find_element(By.PARTIAL_LINK_TEXT, '부분 링크 텍스트')
메서드는 링크 텍스트의 부분 문자열을 사용하여 요소를 찾습니다. 이 메서드는 링크 텍스트의 일부 문자열이 포함된 요소를 찾아서 반환합니다.
1 2 3 4 5 6 7 8 | # 변경 전 element = driver.find_element_by_partial_link_text(‘partial link’) # 변경 후 from selenium.webdriver.common.by import By element = driver.find_element(By.PARTIAL_LINK_TEXT, ‘partial link’) |
find_element(By.TAG_NAME, ‘태그 이름’)
find_element(By.TAG_NAME, '태그 이름')
메서드는 HTML 태그 이름을 사용하여 해당 태그를 갖는 요소를 찾습니다. 이 메서드는 특정 태그를 갖는 요소를 모두 찾아서 리스트로 반환합니다.
1 2 3 4 5 6 7 8 | # 변경 전 element = driver.find_element_by_tag_name(‘mytag’) # 변경 후 from selenium.webdriver.common.by import By element = driver.find_element(By.TAG_NAME, ‘mytag’) |
find_element(By.CLASS_NAME, ‘클래스 이름’)
find_element(By.CLASS_NAME, '클래스 이름')
메서드는 HTML 요소의 class
속성을 사용하여 해당 요소를 찾습니다. class
속성값이 일치하는 요소를 찾아서 반환합니다.
1 2 3 4 5 6 7 8 | # 변경 전 element = driver.find_element_by_class_name(‘myclass’) # 변경 후 from selenium.webdriver.common.by import By element = driver.find_element(By.CLASS_NAME, ‘myclass’) |
find_element(By.CSS_SELECTOR, ‘CSS 선택자’)
find_element(By.CSS_SELECTOR, 'CSS 선택자')
메서드는 CSS 선택자를 사용하여 요소를 찾습니다. CSS 선택자는 문서 내에서 요소의 스타일을 지정하기 위한 표현식 언어입니다. 이 메서드는 다양한 CSS 선택자를 사용하여 요소를 찾을 수 있습니다.
1 2 3 4 5 6 7 8 | # 변경 전 element = driver.find_element_by_css_selector(‘#myid’) # 변경 후 from selenium.webdriver.common.by import By element = driver.find_element(By.CSS_SELECTOR, ‘#myid’) |
셀레니움 find_element 기존 문법, 신규 문법 비교
마지막으로 셀레니움 문법 변경에 대해 기존 문법과 신규 문법을 비교하면 아래와 같습니다.
기존 문법 (셀레니움3) | 신규 문법 (셀레니움4) |
find_element_by_id(‘id값’) | find_element(By.ID, ‘id값’) |
find_element_by_xpath(‘경로’) | find_element(By.XPATH, ‘경로’) |
find_element_by_name(‘이름’) | find_element(By.NAME, ‘이름’) |
find_element_by_tag_name(‘tag 이름’) | find_element(By.TAG_NAME, ‘태그 이름’) |
find_element_by_class_name(‘클래스 이름’) | find_element(By.CLASS_NAME, ‘클래스 이름’) |
find_element_by_link_text(‘링크 문자’) | find_element(By.LINK_TEXT, ‘링크 문자’) |
find_element_by_css_selector(‘css 선택자’) | find_element(By.CSS_SELECTOR, ‘css 선택자’) |
이번 포스팅에서는 우선 셀레니움4 변경점에 대해서 가볍게 정리해보고 주요 에러 발생 요인이 되는 find_element 중심으로 AttributeError 해결방법 – 셀레니움 문법 변경에 대해 정리해보았습니다.
앞선 포스팅에서 정리한 프로그래밍/코딩 관련 글은 아래와 같습니다.
ChatGPT API 사용 방법 3분내 끝내기 (1) Text-Davinci-003 특징 및 OpenAI 계정 생성하기