728x90
반응형
SMALL
엘레먼트 (element)
웹브라우저에서 로그인도 하고 버튼도 클릭하고 검색창에 텍스트를 입력한다. 브라우저 상에서 보이는 버튼, 검색창, 사진, 테이블, 동영상 등등 이 모든 것들을 엘레먼트 (element, 요소) 라고 부른다. 셀레니움은 브라우저에서 특정 요소를 클릭하고 텍스트를 입력하고 사진등을 받아오고 텍스트를 가져오는 등등 어떠한 위치에 있는 무언가를 부를 때 요소라는 개념으로 접근한다. 다양한 방법으로 요소로 접근할 수 있는데 대부분 xpath 를 사용한다.
river.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]') # xpath 로 접근
driver.find_element_by_class_name('ico_search_submit') # class 속성으로 접근
driver.find_element_by_id('ke_kbd_btn') #id 속성으로 접근
driver.find_element_by_link_text('회원가입') # 링크가 달려 있는 텍스트로 접근
driver.find_element_by_css_selector('#account > div > a') # css 셀렉터로 접근
driver.find_element_by_name('join') # name 속성으로 접근
driver.find_element_by_partial_link_text('가입') # 링크가 달려 있는 엘레먼트에 텍스트 일부만 적어서 해당 엘레먼트에 접근
driver.find_element_by_tag_name('input') # 태그 이름으로 접근
driver.find_element_by_tag_name('input').find_element_by_tag_name('a') # input 태그 하위태그인 a 태그에 접근
driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]').find_element_by_name('join') # xpath 로 접근한 엘레먼트의 안에 join 이라는 속성을 가진 tag 엘레먼트에 접근
요소 클릭
driver.find_element_by_id('ke_kbd_btn').click()
요소 찾기 (Locating Elements)
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
options = webdriver.ChromeOptions()
options.add_argument('window-size=1920,1080')
driver = webdriver.Chrome('chromedriver', options=options)
driver.implicitly_wait(5)
driver.get(url='https://www.google.com/')
search_box = driver.find_element_by_xpath('//*[@id="tsf"]/div[2]/div[1]/div[1]/div/div[2]/input')
search_box.send_keys('greeksharifa.github.io')
search_box.send_keys(Keys.RETURN)
elements = driver.find_elements_by_xpath('//*[@id="rso"]/div[*]/div/div[1]/a/h3/span')
for element in elements:
print(element.text)
print(element.text, file=open('gorio.txt', 'w', encoding='utf-8'))
sleep(3)
driver.close()
XPath로 요소 찾기
표현식 | 설명 |
nodename | nodename을 name으로 갖는 모든 요소 선택 |
/ | root 요소에서 선택 |
// | 현재 요소의 자손 요소를 선택 |
. | 현재 요소를 선택 |
.. | 현재 요소의 부모 요소를 선택 |
@ | 속성 (attibutes)를 선택 |
* | 모든 요소에 매치됨 |
@* | 모든 속성 요소에 매치됨 |
node() | 모든 종류의 모든 요소에 매치됨 |
| | OR 조건의 기능 |
표현식 | 설명 |
/div | root 요소의 div 요소 |
./div | 현재 요소의 자식 요소 중 div 요소 |
/* | name에 상관없이 root 요소를 선택 |
./* 또는 * | context 요소의 모든 자식 요소를 선택 |
//div | 현재 웹페이지에서 모든 div 요소를 선택 |
.//div | 현재 요소의 모든 자손 div 요소를 선택 |
//* | 현재 웹페이지의 모든 요소를 선택 |
.//* | 현재 요소의 모든 자손 요소를 선택 |
/div/p[0] | root > div > p 요소 중 첫 번째 p 요소를 선택 |
/div/p[position()<3] | root > div > p 요소 중 첫 두 p 요소를 선택 |
/div/p[last()] | root > div > p 요소 중 마지막 p 요소를 선택 |
/bookstore/book[price>35.00] | root > bookstore > book 요소 중 price 속성이 35.00 초과인 요소들을 선택 |
//*[@id="tsf"]/div[2]/ | id가 tsf인 모든 요소의 자식 div 요소 중 3번째 요소를 선택 |
//title | //price | title 또는 price 요소를 선택 |
텍스트 입력
driver.find_element_by_id('ke_awd2_btn').send_keys('텍스트 입력')
텍스트 삭제
driver.find_element_by_id('ke_awd2_btn').clear()
단축키 입력
from selenium.webdriver.common.keys import Keys
# 컨트롤 + V
driver.find_element_by_id('ke_kbd_btn').send_keys(Keys.CONTROL + 'v')
# 다른 방법
from selenium.webdriver import ActionChains
ActionChains(driver).key_down(Keys.CONTROL).send_keys('V').key_up(Keys.CONTROL).perform()
# 위에서 driver 대신 요소를 입력해도 좋음.
Window / Frame 이동
예전에 만들어진 사이트라면 frame을 사용한 경우가 있다. frame 안에 들어 있는 요소는 find_element 함수를 써도 그냥 찾아지지 않는 경우가 있다. find_element 함수는 frame 내에 있는 요소를 찾아주지 못하기 때문에 특정 frame으로 이동해야 할 때가 있다.
# 이동할 프레임 요소 지정
element = driver.find_element_by_tag_name('iframe')
# 프레임 이동
driver.switch_to.frame(element)
# 프레임에서 빠져나오기
driver.switch_to.default_content()
https://selenium-python.readthedocs.io/index.html
728x90
반응형
LIST
'App Programming > Web Crawler' 카테고리의 다른 글
[Web Crawler] 셀레니움 (Selenium) (4) (0) | 2022.02.15 |
---|---|
[Web Crawler] 셀레니움 (Selenium) (3) (0) | 2022.02.15 |
[Web Crawler] 셀레니움 (Selenium) (1) (0) | 2022.02.15 |
[Web Crawler] BeautifulSoup으로 다양한 데이터 추출하기 (0) | 2022.02.14 |
[Web Crawler] HTML 기본태그 (6) (0) | 2022.02.14 |