반응형

selenium AttributeError 'Webdriver' object has no attribute 'find_element_by ... 에러

글. 수알치 오상문 

 

셀레니움 상위 버전(4)에서 나타나는 에러입니다. find_element_by...() 함수를 사용하지 말고 다음 예제처럼 사용해야 합니다. 먼저 다음처럼 임포트를 추가합니다. 

 

from selenium.webdriver.common.by import By

 

driver(또는 browser 같은)라는 인스턴스를 사용한다고 가정할 때...

driver.find_element(), driver.find_elements() 함수에서 아래 옵션을 지정하여 사용합니다.

 

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     선택자로 추출

 

즉, 다음 예제처럼 사용합니다.

 

elem = driver.find_element(By.NAME, "q")

title = driver.find_element(By.XPATH, r'//*[@id="bestList"]/ol/li[1]/p[1]').text

driver.find_element(By.XPATH, r'//*[@id="divYes24SCMEvent"]/div[2]/div[2]/a').click()

 

 

[참고] 셀레니움 3, 4 비교 

셀레니움 3 셀레니움 4 (Python 3.7 이상)

Python

caps = {}
caps['browserName'] = 'firefox'
caps['platform'] = 'Windows 10'
caps['version'] = '92'
caps['build'] = my_test_build
caps['name'] = my_test_name

driver = webdriver.Remote(cloud_url, desired_capabilities=caps)

Python

from selenium.webdriver.firefox.options import Options as FirefoxOptions

options = FirefoxOptions()
options.browser_version = '92'
options.platform_name = 'Windows 10'
cloud_options = {}
cloud_options['build'] = my_test_build
cloud_options['name'] = my_test_name
options.set_capability('cloud:options', cloud_options)

driver = webdriver.Remote(cloud_url, options=options)

 Java

driver.find_element_by_class_name("className");
driver.find_element_by_css_selector(".className");
driver.find_element_by_id("elementId");
driver.find_element_by_link_text("linkText");
driver.find_element_by_name("elementName");
driver.find_element_by_partial_link_text("partialText");
driver.find_element_by_tag_name("elementTagName");
driver.find_element_by_xpath("xPath");

driver.find_elements_by_class_name("className");
driver.find_elements_by_css_selector(".className");
driver.find_elements_by_id("elementId");
driver.find_elements_by_link_text("linkText");
driver.find_elements_by_name("elementName");
driver.find_elements_by_partial_link_text("partialText");
driver.find_elements_by_tag_name("elementTagName");
driver.find_elements_by_xpath("xPath");

 Java

driver.findElement(By.className("className"));
driver.findElement(By.cssSelector(".className"));
driver.findElement(By.id("elementId"));
driver.findElement(By.linkText("linkText"));
driver.findElement(By.name("elementName"));
driver.findElement(By.partialLinkText("partialText"));
driver.findElement(By.tagName("elementTagName"));
driver.findElement(By.xpath("xPath"));

driver.findElements(By.className("className"));
driver.findElements(By.cssSelector(".className"));
driver.findElements(By.id("elementId"));
driver.findElements(By.linkText("linkText"));
driver.findElements(By.name("elementName"));
driver.findElements(By.partialLinkText("partialText"));
driver.findElements(By.tagName("elementTagName"));
driver.findElements(By.xpath("xPath"));
 

Python

pip install selenium==4.0.0

Python

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)

driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=options)

Python

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
service = ChromeService(executable_path=CHROMEDRIVER_PATH)

driver = webdriver.Chrome(service=service, options=options)

<출처> https://www.selenium.dev/documentation/webdriver/getting_started/upgrade_to_selenium_4/

 

반응형

+ Recent posts