[python 인터넷, selenium] selenium iframe 처리하기

selenium 실습을 하는 도중 iframe에 많이 막히는 것 같습니다.

iframe 처리에 대해 알아보겠습니다.

 

메일을 작성하는 실습이 있는데 메일 본문을 작성하는 부분이 iframe으로 되어 있습니다.

iframe은 html안에 또 다른 html이 오는 경우이기 때문에 switch_to_frame() 함수를 사용해 iframe 안에있는 elenemt를 확인할 수 있게 해줘야 합니다. 그리고 iframe에서 원래있던 전체 웹 페이지로 나오려면 switch_to_default_content() 함수로 빠저나와야 합니다.

만약 iframe 태그에 name 속성이 있다면 driver.switch_to_frame("iframe name 값")으로 해당 iframe으로 focus를 맞춰줄수 있습니다. 그런데...

chrome의 개발자 도구로 소스를 확인해 보면 iframe에 대한 name도 없습니다.

 

iframe 값을 가져오는 방법은 여러가지가 있을 수 있습니다. 그중 iframe 태그를 확인하는 방법과 iframe을 감싸고 있는 상위 div 태그의 class로 확인하는 방법을 알아보겠습니다.

 

먼저 iframe 태그로 확인하는 방법입니다.

하나의 tag를 확인하는 함수는 find_element_by_tag_name 입니다. 그리고 여러개의 tag를 확인하는 함수는 find_elements_by_tag_name 입니다. 

find_elements_by_tag_name를 사용하면 현재 웹 페이지에서 해당 tag를 모두 배열로 가져오게 됩니다.

driver.find_elements_by_tag_name('div')로 하면 웹 페이지의 처음부터 끝까지 순서대로 div를 모두 가저오게 됩니다. 이걸 이용해 현재 웹 페이지에서 iframe을 모두 찾아올 수 있습니다.

 
 
 
# -*- coding: utf-8 -*-
import time
from selenium import webdriver
 
# chromedriver로 브라우저를 설정합니다.
driver = webdriver.Chrome('./chromedriver')
 
# find_element_by_ 함수를 사용해 element를 찾을때 최대 30초까지 기다립니다.
driver.implicitly_wait(30)
 
# 회사 메일(worksmobile) 사이트를 엽니다.
driver.get('https://mail.worksmobile.com/')
 
# 로그인을 위한 계정을 입력합니다.
driver.find_element_by_id('user_id').send_keys('tongchun@ngle.co.kr')
 
# 로그인 시작을 클릭합니다.
driver.find_element_by_id('loginStart').click()
 
# 비밀번호를 넣습니다.
driver.find_element_by_id('password').send_keys('123456')
 
# 로그인 버튼을 클릭합니다.
driver.find_element_by_id('loginBtn').click()
 
# 메일쓰기 버튼(링크)을 찾아 클릭합니다.
driver.find_element_by_link_text('메일쓰기').click()
 
# 보내는 사람을 지정합니다.
driver.find_element_by_id('toInput').send_keys('tongchun@ngle.co.kr')
 
# 제목을 넣습니다.
driver.find_element_by_id('subject').send_keys('selenium은 즐기고 계신가요?')
 
# 현재 웹페이지에서 iframe이 몇개가 있는지 변수에 넣고 확인해 봅니다.
iframes = driver.find_elements_by_tag_name('iframe')
print('현재 페이지에 iframe은 %d개가 있습니다.' % len(iframes))
 
# 배열로된 iframes 변수를 for문을 이용해 하나씩 확인해 봅니다.
# enumerate() 함수를 사용하면 배열의 index(순번)을 확인할 수 있습니다.
for i, iframe in enumerate(iframes):
try:
print('%d번째 iframe 입니다.' % i)
 
# i 번째 iframe으로 변경합니다.
driver.switch_to_frame(iframes[i])
 
# 변경한 iframe 안의 소스를 확인합니다.
print(driver.page_source)
 
# 원래 frame으로 돌아옵니다.
driver.switch_to_default_content()
except:
# exception이 발생했다면 원래 frame으로 돌아옵니다.
driver.switch_to_default_content()
 
# 몇 번째 frame에서 에러가 났었는지 확인합니다.
print('pass by except : iframes[%d]' % i)
 
# 다음 for문으로 넘어갑니다.
pass
 
# 확인된 ifrime으로 변경합니다.
driver.switch_to_frame(iframes[1])
 
# 메일 본문을 작성하는 editor element를 지정합니다.
editor = driver.find_element_by_class_name('workseditor')
 
# editor element에 글을 작성합니다.
editor.send_keys('안녕하세요. 김동춘입니다.\nselenium은 재미 있나요?\n어려워 하지 마세요. 인생이 다 그래요. 해보면 벌거 아니에요.\n좋은하루 보내세요~')
 
# ifrime에서 원래 frame으로 돌아옵니다.
driver.switch_to_default_content()
 
# 보내기 버튼을 클릭합니다.
driver.find_element_by_id('sendBtn').click()
 
 
 
 
 

위 코드처럼 iframe을 모두 불러온 다음 for문을 이용해 iframe안에 소스를 확인할 수 있습니다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

메일 본문을 작성하는 editor가 몇번째 iframe에 있는지 확인하고 switch_to_frame() 함수로 들어갈 수 있습니다.

 

다음은 iframe 상위에 있는 div 태그의 class를 이용하는 벙법입니다.

iframe이 있는 html 소스는 아래와 같이 되어 있습니다.

 

 
 
<div class="editor_body">
<div>
<textarea tabindex="5" style="display: none; border: none; outline: none; resize: none; overflow: auto; width: 100%; height: 445px;"></textarea>
<textarea tabindex="5" style="display: none; border: none; outline: none; resize: none; overflow: auto; width: 100%; height: 445px;"></textarea>
<iframe style="width: 100%; height: 445px;" frameborder="0" smart-mod="wysiwyg" tabindex="5"></iframe>
</div>
</div>
 
 
 
 
 

iframe의 상위 div 중 <div "editor_body">를 이용하는 방법입니다.

find_element_by_css_selector() 함수로 editor_body 안의 iframe을 확인할 수 있습니다.

# -*- coding: utf-8 -*-

import time
from selenium import webdriver
 
# chromedriver로 브라우저를 설정합니다.
driver = webdriver.Chrome('./chromedriver')
 
# find_element_by_ 함수를 사용해 element를 찾을때 최대 30초까지 기다립니다.
driver.implicitly_wait(30)
 
# 회사 메일(worksmobile) 사이트를 엽니다.
driver.get('https://mail.worksmobile.com/')
 
# 로그인을 위한 계정을 입력합니다.
driver.find_element_by_id('user_id').send_keys('tongchun@ngle.co.kr')
 
# 로그인 시작을 클릭합니다.
driver.find_element_by_id('loginStart').click()
 
# 비밀번호를 넣습니다.
driver.find_element_by_id('password').send_keys('123456')
 
# 로그인 버튼을 클릭합니다.
driver.find_element_by_id('loginBtn').click()
 
# 메일쓰기 버튼(링크)을 찾아 클릭합니다.
driver.find_element_by_link_text('메일쓰기').click()
 
# 보내는 사람을 지정합니다.
driver.find_element_by_id('toInput').send_keys('tongchun@ngle.co.kr')
 
# 제목을 넣습니다.
driver.find_element_by_id('subject').send_keys('selenium은 즐기고 계신가요?')
 
# class selector를 이용해 iframe을 확인합니다.
editor_frame = driver.find_element_by_css_selector('.editor_body iframe')
 
# 확인된 ifrime으로 변경합니다.
driver.switch_to_frame(editor_frame)
 
# 메일 본문을 작성하는 editor element를 지정합니다.
editor = driver.find_element_by_class_name('workseditor')
 
# editor element에 글을 작성합니다.
editor.send_keys('안녕하세요. 김동춘입니다.\nselenium은 재미 있나요?\n어려워 하지 마세요. 인생이 다 그래요. 해보면 벌거 아니에요.\n좋은하루 보내세요~')
 
# ifrime에서 원래 frame으로 돌아옵니다.
driver.switch_to_default_content()
 
# 보내기 버튼을 클릭합니다.
driver.find_element_by_id('sendBtn').click()
 
 
 
 
 

html과 css를 이용해 여러 방법으로 elenemt를 확인할 수 있습니다.

[출처] https://dejavuqa.tistory.com/198

 

 

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
64 [python][자료구조] "pdf 취소선 검출" How to identify strike-out text from PDF files using Python 졸리운_곰 2024.07.18 583
63 [python][자료구조] 오픈 소스 Python PDF 파서 라이브러리 file 졸리운_곰 2024.07.16 451
62 [python][자료구조] 벡터화 | Vectorization file 졸리운_곰 2023.12.21 353
61 [python][자료구조] Python의 Loop? NO! , Python의 Vectorization? OK!!! file 졸리운_곰 2023.12.21 494
60 [python][자료구조] Python - MySQL 데이터 추가, 삭제, 업데이트 졸리운_곰 2023.05.13 527
59 [python][자료구조] Python의 JSON - 문자열을 JSON으로 변환하는 방법 졸리운_곰 2023.05.06 472
58 [python][자료구조] [Python] Logging to MongoDB (로그 남기기) file 졸리운_곰 2023.03.24 448
57 [python][자료구조] [스파르타 웹 개발 종합] 파이썬으로 크롤링하고 DB에 저장하기(request, bs4, mongoDB 패키지 사용) 졸리운_곰 2023.03.12 474
56 [python][자료구조] [MongoDB] Document Query(조회) – find() 메소드 졸리운_곰 2023.03.08 324
55 [python][자료구조] Python(flask)으로 mongoDB 제어하기 – pymongo file 졸리운_곰 2023.03.08 626
54 [python][자료구조] django sqlite3 MySQL로 전환하기 file 졸리운_곰 2023.03.02 439
53 [python][자료구조] django에서 db.sqlite3 데이터를 mysql로 옮기기 졸리운_곰 2023.03.02 470
52 [python][자료구조] Python - JSON 파일 읽고 쓰는 방법 졸리운_곰 2023.02.04 514
51 [python][자료구조] [인코딩] 유니코드 인코딩 처리 (특히 json 입출력 시) 졸리운_곰 2023.02.04 383
50 [python][자료구조] Dropbox API 사용하기 (with python) 졸리운_곰 2022.12.03 331
49 [Python][자료구조] SQLAlchemy Tutorial(한글) - 2 졸리운_곰 2022.12.03 418
48 [Python]][자료구조] SQLAlchemy Tutorial(한글) - 1 졸리운_곰 2022.12.03 312
47 [python][자료구조] python anaconda 에서 mysql 접속 졸리운_곰 2022.01.25 678
46 [python 자료구조] 림코딩의 파이썬으로 csv 다루기 강좌 (읽기,쓰기,수정,추가) 졸리운_곰 2022.01.16 592
45 python - 읽은 후 kafka 메시지를 삭제하는 방법 졸리운_곰 2021.07.13 956
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED