반응형

 

 

파이썬 셀레니움을 이용해 자동으로 크롬 창을 열어 특정 HTML 요소에 접근해보는 포스팅을 따라해봄

 

 

 

글의 목차

 

1. 파이썬 셀레니움을 이용하는 간단한 테스트를 위한 준비물

2. 파이썬과 셀레니움을 이용한 자동화 테스트를 진행하는 방법

  1) HTML DOM 객체 접근

  2) 윈도우와 프레임 접근

  3) 테스트하기 이상적인 시간

  4) 셀레니움과 파이썬 유닛 테스트 연동

3. 파이썬 셀레니움의 한계

  1) 정리

 

 

※ 기초 예제 1에서는 목차 1,2만 다루고 2-1부터 3-1까지는 기초 예제 2에서 다룰 예정

 

 

 

1. 파이썬 셀레니움을 이용하는 간단한 테스트를 위한 준비물

pip install selenium

cmd 창에서 위의 명령어를 입력하여 selenium을 설치해준다

 

 

+셀레니움을 사용하기 위해서는 추가적으로 드라이버 설치가 필요하다

 

아래 링크에서 본인이 사용할 블라우저의 드라이버를 선택해서 설치하자

ChromeEdgeFirefox, and Safari

 

(만약 드라이버 실행 후 아래와 같은 문구가 나온다면 다른 버전의 크롬 드라이버가 필요한 것이니 당황하지 말고

본인이 사용하는 크롬 버전을 확인 후, 그에 맞는 버전의 드라이버를 추가해서 exe 파일을 교체해주면 된다)

selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 94
Current browser version is 96.0.4664.93 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

 

 

로컬에서 셀레니움을 테스트한다면, 위의 과정만 진행해도 괜찮다

하지만 원격에서 셀레니움을 테스트하려고 한다면, 셀레니움 서버를 추가적으로 설치해줘야 한다

셀레니움 서버는 자바로 쓰여졌으므로 JRE1.6 또는 그 이상의 버전이 서버에 설치되어있어야 한다

 

다운로드는 아래 링크를 방문 ㄱㄱ

Selenium’s download page.

 


 

 

2. 파이썬과 셀레니움을 이용한 자동화 테스트를 진행하는 방법 (1-6)

1의 단계를 마쳤으면 파이썬 셀레니움 테스트를 진행할 준비가 끝났으니 아래의 단계를 진행해보자

 

 

1. Web driver와 Key 클래스 추가

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

webdriver 클래스는 브라우저에 접근이 가능하도록 해주고

Keys 클래스는 Shift 등을 포함한 키보드 입력을 도와준다

 

 

2. 이전에 설치한 브라우저 웹 드라이버 (크롬 드라이버)의 경로 생성

driver = webdriver.Chrome('./chromedriver')

로컬 환경에서 테스트한다면, 이 명령어는 로컬에서 크롬을 실행시키는 것과 같아서

close() 메소드를 사용할때까지 닫히지않는다

 

 

3. get() 메소드를 사용하여 웹사이트를 로드

driver.get("https://www.python.org")

 

 

4. 입력한 페이지 로드가 완료됐다면 .title 속성을 사용하여 웹페이지 제목 텍스트를 출력해볼수있다

print(driver.title)

파이썬 인터프리터에서 직접 실행해보면 이렇게 출력이됨

 

셀레니움으로 브라우저 창을 띄우면 자동화된 테스트 소프트웨어에 의해 제어되고 있다는 문구도 확인이 가능하다

 

 

5. 검색창에 접근해보자

f12를 눌러 HTML 엘레먼트 리스트에서 검색어 입력을 받는 DOM을 찾아 특정 값을 입력해준다

CSS 클래스, ID, name 등의 속성을 이용하여 DOM 접근이 가능하다

 

find_element_by_name() 메소드를 이용하면 된다

search_bar = driver.find_element_by_name("q")

파이썬 인터프리터에서 직접 실행하는 경우, 위와같은 워닝창이 뜨는데

 

 

한번 더 입력했더니 그냥 수용해줘서 그냥 썼음

 

 

 

6. DOM 엘레먼트 선택을 하고 clear() 메소드를 사용하여 기존에 있던 검색 창의 값을 초기화 시켜준다

그러고 전달하고 싶은 값을 send_keys() 메소드를 사용하여 입력해준다

search_bar.clear()
search_bar.send_keys("getting started with python")

search_bar.send_keys(Keys.RETURN)
#search_bar.send_keys(Keys.ENTER) - 이 방식도 위와 동일하게 작용

Keys.RETURN을 주어 엔터 입력과 동일하게 사용

 

 

 

위의 과정을 거치는 동안 셀레니움을 통해 열었던 크롬 창의 url 이 바뀌어 있는것을 알수있다

 

print(driver.current_url)

 

print를 통해 url을 출력해보면 아래와 같이 나온다

 

'https://www.python.org/search/?q=getting+started+with+python&submit='

 

close() 메소드를 이용하여 열었던 크롬 창을 닫을수있다

driver.close()

 

 

 

위의 코드를 취합해본 코드

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('./chromedriver')
driver.get("https://www.python.org")
print(driver.title)
search_bar = driver.find_element_by_name("q")
search_bar.clear()
search_bar.send_keys("getting started with python")
search_bar.send_keys(Keys.RETURN)
print(driver.current_url)
driver.close()

 

셀레니움을 이용한 웹 크롤링의 기본을 다뤄보았다

 

 

 

참고 : https://www.browserstack.com/guide/python-selenium-to-run-web-automation-test

 

Selenium with Python : Getting Started with Automation | BrowserStack

Learn to use Selenium Python to run web automation tests with ease. Read this step-by-step tutorial on how to run your first test using Selenium & Python.

www.browserstack.com

 

 

https://stackoverflow.com/questions/1629053/typing-the-enter-return-key-in-selenium

 

Typing the Enter/Return key in Selenium

I'm looking for a quick way to type the Enter or Return key in Selenium. Unfortunately, the form I'm trying to test (not my own code, so I can't modify) doesn't have a Submit button. When working w...

stackoverflow.com

 

반응형
반응형

 

 

bs4 예제를 따라해보면서 마주친 오류들 기록

 

 

 

TypeError: can only concatenate str (not "Tag") to str

 

TypeError: can only concatenate str (not "list") to str

 

TypeError: can only concatenate str (not "ResultSet") to str

 

 

사용 코드

from bs4 import BeautifulSoup

html_doc = """
<html><head><title>The Dormouse's story</title></head>

<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

soup = BeautifulSoup(html_doc)


print("p : " + soup.p)

 

 

스택오버플로우 답변들을 참고해보니 파이썬에서 print 메서드string 타입만 +를 사용한 출력이 가능하고

그 외의 사용법은 모두 콤마를 사용하여 출력해야 오류가 없는것같다

 

그래서 위의 타입에러가 발생한 이유는 태그나 리스트, ResultSet 타입을 형변환없이

바로 출력했기 때문

 

 

따라서 위의 마지막 print 문을 다음과 같이 수정하면 오류가 발생하지 않는다

 

print("p : " + str(soup.p))

//Or

print("p : ",soup.p)

 

 

+번외

print("p : " + str(soup.p))
# p : <p class="title"><b>The Dormouse's story</b></p>

print("p : ",soup.a , "q")
# p :  <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> q

print("p : "+str(soup.a) + "q")
# p : <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>q

print("p : ",soup.a, "q")
# p :  <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> q

print("p : ",soup.a, " q")
# p :  <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>  q

print("p : "+str(soup.a) + " q")
# p : <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> q

print에 띄어쓰기가 어떻게 출력되는지 궁금해서 테스트해봄

 

 

 

 

참고 : https://stackoverflow.com/questions/60491093/python-scraping-problem-typeerror-can-only-concatenate-str-not-resultset-t

 

Python scraping problem "TypeError: can only concatenate str (not "ResultSet") to str"

I am fresh noobster who tries to learn python as well as use it for webscraping. So I watched a few videos to learn the basics on youtube, followed the tutorial, however I cannot figure it out why my

stackoverflow.com

 

반응형
반응형

 

 

 

파이썬 초보가 뚝딱뚝딱해보다 맞닥뜨린 오류

 

TypeError: write() argument must be str, not BeautifulSoup

문장만 읽어도 뭔가의 자료형 문제인가보다 싶어서 저 문제를 해결한 사람들의 답변을 따라해봄

 

print( str(bs4에서 가져온내용) )

 

이렇게 str으로 기존 출력 내용을 감싸서 출력을 했는데 이제는

 

'cp949' codec can't encode character '\xa0' in position 144794: illegal multibyte sequence

이런 오류로 진화했다

 

오류에 언급되어 있는것처럼,

출력 시 인코딩 문제인듯 싶어서 utf-8 인코딩 방식을 추가해준 방법을 따라해봤다

 

f = open("F:/kotraTest.txt",'wb')
f.write(soup.encode('utf-8'))
f.close()

또는

f = open("F:/kotraTest.txt",'w',encoding='utf-8')
f.write(str(soup))
f.close()

이렇게 되면 문제가 해결된다

 

 

 

이 방법들로 웹페이지 내용을 텍스트파일로 저장할 수 있었는데,

두가지 방법의 차이점이 문득 궁금해져서 각각의 방식으로 저장한 파일을 열어 라인 바이 라인으로 비교해봄

 

결과 값의 차이는 바이트 방식으로 파일을 저장한 두번째 방법이 enter가 한번씩 쳐져

좀더 간결한 텍스트 파일로 저장이 가능하다는 거였다

 

 

+추가로 파라미터로 사용한 wb에 대해 찾아봤더니

w는 read, write에서의 파일에 새로운 내용을 작성하거나 변경하는 등의 쓰기 기능을 수행할 때 사용하며

b는 이진파일인 binary file을 write 할때 지정해주어야 한다 함

 

대충 윈도우에서의 파이썬은 텍스트와 바이너리 파일을 구분 짓기위해 데이터를 읽거나 쓸 때,

자동으로 파일의 마지막 부분에 변화를 준다고 함

 

Binary files (이진 파일)이란,

사람이 읽을 수 없는 문자들로 이루어진 모든 파일들을 의미한다

 

JPEG, GIF 들과같은 이미지파일 일수도있고, MP3, PDF나 워드 파일과 같이 이진 문서 형식일 수 도있다

 

파이썬에서는 기본적으로 텍스트모드로 파일들을 오픈하며

바이너리 모드같이 특정 모드에서 파일을 사용하기 위해서는, wb와 같이 'b 문자'를 붙여 사용해야한다

 

 

 

 

결국 찾아본 내용을 합해보면 wb에서 b는 바이너리 모드에서 파일을 쓰기 모드로 사용한 것인데

나는 텍스트파일에 저장을 한것이므로 나의 방식에서는 w만으로 충분한듯

 

 

반응형

+ Recent posts