【2021년도판】Python + Selenium 자주 사용하는 조작 메소드 정리

소개



웹 스크래핑으로 Selenium을 사용하고 있으며, 이것이 1 년 이상 지났습니다.

언제나 「어라?? 이것 어떻게 쓰는 거야??」가 되어, 매회 조사하고 있는 것 지루해하기 시작했으므로, 이 기사에 정리해 가기로 했습니다.

ChromeOptions



필요한 옵션을 설정하지 않으면 드물게 다음과 같은 시간 초과 오류가 발생합니다.
Timed out receiving message from renderer: 600.000

이 건에 대해서, Stack Overflow의 답변 에서는, 이하의 옵션 설정을 실시하면 문제 없다고 합니다. (덧붙여서 "쓸모없는 늘어나는 인수 옵션"이라고 불리고 있으며, 바로 그대로 ...)
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument("enable-automation")
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-infobars")
options.add_argument('--disable-extensions')
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-browser-side-navigation")
options.add_argument("--disable-gpu")
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')
prefs = {"profile.default_content_setting_values.notifications" : 2}
options.add_experimental_option("prefs",prefs)

driver = new ChromeDriver(options);

요소 탐색



부모 요소
driver.find_element_by_xpath('//div[@id="cnfm_btn"]').find_element_by_xpath('..')

자식 요소
driver.find_element_by_xpath('//div[@id="cnfm_btn"]/div')

다음 요소(이전)
driver.find_element_by_xpath("//p[@id='one']/preceding-sibling::p")

다음 요소(후)
driver.find_element_by_xpath("//p[@id='one']/following-sibling::p")

클래스 이름으로 찾기 (단수)
driver.find_element_by_class_name('content')

클래스 이름으로 찾기 (복수)
driver.find_elements_by_class_name('content')

텍스트 콘텐츠로 찾기
최근 React 등으로 작성된 사이트는 ID 등의 키를 이용하여 요소를 탐색하는 것이 어려워지고 있습니다.
예를 들어 Twitter는 로그인 버튼에 id="login" 와 요소를 식별하기 위한 키가 없기 때문에 탐색이 조금 어렵습니다. .


그래서 하나의 타개책으로 텍스트 내용에서 찾는 방법이 있습니다. (Stack Overflow의 답변)

· 부분 일치
driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]")

· 완전 일치
driver.find_elements_by_xpath("//*[text()='My Button']")

ID, 클래스명(부분 일치)으로 검색
이쪽도 마찬가지로 React등으로 작성된 사이트는 ID, Class등의 키를 이용해 요소를 탐색하는 것이 어려워지고 있습니다. ID, 클래스 이름의 부분 일치로 찾는 방법이 있습니다.
driver.find_element_by_xpath("//div[contains(@class, 'playerStateIcon')]")

요소 조작



삭제
JavaScript를 실행하여 요소를 삭제할 수 있습니다.
#クラス名で特定して削除する場合
element = driver.find_element_by_class_name('classname')
driver.execute_script("""
var element = arguments[0];
element.parentNode.removeChild(element);
""", element)

명시적인 대기 처리



WebDriverWait.until 메서드를 사용하면 HTML 요소가 특정 상태가 될 때까지 기다리는 명시적 대기 시간을 설정할 수 있습니다. 자세한 내용은 여기 .

클릭 가능 여부 판정
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "cnfm_btn")))

선택 가능 여부 판정
WebDriverWait(driver, 10).until(EC.element_located_to_be_selected((By.ID, "cnfm_btn")))

좋은 웹페이지 즐겨찾기