반응형

wait 는 말 그대로 '기다리라' 는 뜻입니다. 여기에는 2가지 타입이 있습니다. 바로 implicitly wait 과 explicitly wait 입니다.

하지만 여기서 implicitly wait 과 explicitly wait 를 배우기 전에 time.sleep 을 배우겠습니다.

time.sleep

time.sleep 은 물리적인 시간을 기다리는 명령어입니다.
사용하는 방법은 time.sleep(초) 를 사용하여 구글 웹페이지가 열린 후 1초, 5.5초, 10초를 기다립니다.

import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('start-maximized') chrome_options.add_argument('incognito') driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) driver.get(url='https://www.google.com/') time.sleep(1) # 1초 기다림 time.sleep(5.5) # 5.5초 기다림 time.sleep(10) # 10초 기다림 driver.quit()

컴퓨터의 사양과 상관없이 무조건 입력한 초가 지나야 다음 동작을 합니다. 그렇기에 적절하게 상황에 따라 사용하면 좋습니다.

 

Implicitly Wait

implicitly wait 는 웹페이지가 로딩 될때까지 기다리고 다음 동작을 합니다. 쉽게 설명하자면, 예를들어 구글 웹페이지를 오픈했는데 웹페이지를 불러올 때까지 최대 implicitly_wait(초) 까지 기다리라는 뜻입니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('start-maximized')
chrome_options.add_argument('incognito')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

driver.get(url='https://www.google.com/')
driver.implicitly_wait(10) # 10초까지 기다리고 다음 동작

driver.quit()

위 예제에서 implicitly_wait(10)을 했는데 10초동안 웹페이지가 로딩될때까지 기다리고 10초가 넘어가면 웹페이지가 로딩이 됐던 안됐던 다음 명령어를 실행하겠다 는 뜻입니다. 이 또한 상황에 적정한 시간을 설정하면 됩니다.

time.sleep 과 implicitly_wait가 다른 점은 컴퓨터 성능이 좋아서 웹페이지 로딩하는데 1초가 걸렸습니다. 하지만 time.sleep은 무조건 10초를 기다리고 다음 동작은 하고, implicitly_wait는 1초가 됐을 때 다음 동작을 합니다.

Explicitly Wait

implicitly_wait의 경우는 모든 웹페이지가 호출될 때까지 기다리는지만, 컴퓨터 환경(PC성능 또는 서버, 네트워크 등)에 따라 전체가 아닌 일부가 먼저 노출되는 경우가 있습니다. (참고..이것을 동적 DOM이라고 부릅니다.)

예를들어서 implicitly_wait를 사용하여 웹페이지는 1초만에 넘어왔는데 넘어온 웹페이지의 일부분이 자바스크립트로 구현되어 있어서 그 일부분이 화면상에서 렌더링 되느라 비교적 늦게 브라우저에 표시되었다고 가정하면 (ex. 쿠팡 또는 광고 노출) 동작하는데 문제가 발생합니다.

이러한 문제를 해결하기 위해서 explicitly_wait 를 사용합니다. 즉, 내가 설정한 것이 표시가 될때까지 뭐뭐 할때까지 기다려라 라는 의미입니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support import expected_conditions as EC

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('start-maximized')
chrome_options.add_argument('incognito')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

driver.get(url='https://www.google.com/')

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, "gNO89b")))

driver.quit()

time.sleep 과 implicitly_wait 에는 괄호 안에 초를 사용하였지만, explicitly_wait는 사용하는 방법이 조금 다릅니다.
element 라는 변수에 WebDriverWait(driver, 10) 즉, driver는 셀레니움 구동한 드라이버가 10초까지 설정한 무엇이 나타날때까지 기다린다는 뜻입니다.
그 다음 .until(EC.presence_of_element_located((By.CLASS_NAME, “gNO89b”))) 의 EC.presence_of_element_located라는 것은 괄호안에 요소가 나타날때까지 기다리라는 의미인데, 괄호안에 요소는 하기와 같습니다.
(By.ID, ‘아이디이름’)
(By.CLASS_NAME, ‘클래스명’)
(By.XPATH, ‘xpath경로’)
(By.NAME, ‘네임명’)
(By.CSS_SELECTOR, ‘CSS셀렉터’)
(By.PARTIAL_LINK_TEXT, ‘텍스트링크일부분’)
(By.LINK_TEXT, ‘텍스트링크’)

EC.presence_of_element_located 말고 종류가 많이 있습니다.

EC.title_is(...)
EC.title_contains(...)
EC.presence_of_element_located(...)
EC.visibility_of_element_located(...)
EC.visibility_of(...)
EC.presence_of_all_elements_located(...)
EC.text_to_be_present_in_element(...)
EC.text_to_be_present_in_element_value(...)
EC.frame_to_be_available_and_switch_to_it(...)
EC.invisibility_of_element_located(...)
EC.element_to_be_clickable(...)
EC.staleness_of(...)
EC.element_to_be_selected(...)
EC.element_located_to_be_selected(...)
EC.element_selection_state_to_be(...)
EC.element_located_selection_state_to_be(...)
EC.alert_is_present(...)

위 방법 중에서 가장 많이 사용하는 것은 EC.presence_of_element_located 와 EC.element_to_be_clickable 이니 상황에 따라 사용하면 됩니다.

즉, 위 3가지 방법 중 상황에 맞는 것을 자유롭게 사용하시면 됩니다.

참조 :

 

GitHub - grafeen/selenium_ex04

Contribute to grafeen/selenium_ex04 development by creating an account on GitHub.

github.com

 

반응형
반응형

테스트 자동화에서 가장 많이 사용하는 기능 5가지를 선정하라면, 하기와 같다.

  • get( )
  • wait( )
  • find_element( )
  • send_keys( )
  • click( )

 

1. get( )

get 명령은 새 브라우저를 시작하고 크롬 웹드라이버 에서 주어진 URL을 엽니다 . 단순히 문자열을 지정된 URL로 사용하고 테스트 목적으로 엽니다.

Selenium IDE를 사용한다면 open 명령어와 비슷합니다.

예시:

driver.get("https://google.com");

'드라이버'는 모든 작업을 수행할 Chrome 웹 드라이버이며 위의 명령을 실행한 후 다음과 같이 표시됩니다.

 

wait()

wait 는 말 그대로 ‘기다리라’는 뜻이다. implicitly wait 또는 explicitly wait 를 사용하는데, 이 부분은 다음 시간에 배우기로 하고 많이 사용하는 것 중에 하나다 라고 기억해주면됩니다.

find_element()

이 기능은 페이지의 요소에 액세스하려는 경우에 중요합니다. 검색을 수행하기 위해 "Google 검색" 버튼에 액세스하려고 한다고 가정해 보겠습니다.

요소에 액세스하는 방법은 여러 가지가 있지만 내가 선호하는 방법은 요소의 XPath를 찾는 것입니다. XPath는 웹 페이지에서 요소의 최종 위치입니다.

F12를 클릭하면 페이지를 검사하고 현재 있는 페이지에 대한 배경 정보를 얻을 수 있습니다.

 
 

선택 도구를 클릭하면 요소를 선택할 수 있습니다.

검색창을 왼쪽 버튼으로 클릭하면 파란색으로 표시된 부분이 노출됩니다. 오른쪽으로 클릭하고 "Copy Xpath" 를 선택하면 검색창의 Xpath 가 복사됩니다. 

self.driver.find_element_by_xpath('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div[2]/div[2]/input')

새 세션의 요소가 변경되고 다음에 스크립트를 수행할 때 작동하지 않으면 일반 XPath가 변경될 수 있기 때문에 일반 XPath보다 전체 XPath를 선호합니다.

다른 find_element 함수의 개요입니다. 

 

send_keys( ) 및 click( )

Send_keys( ) 와 click( ) 기능은 find_element 기능을 사용하여 선택한 필드에 텍스트를 입력 또는 클릭을 하는 데 사용됩니다.

Google에 "testing"를 입력하고 Google 로고를 클릭한다고 가정해 보겠습니다. 

google_tray = driver.find_element_by_xpath('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div[2]/div[2]/input')
google_search = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/picture/img')

google_tray.send_keys("testing")
google_search.click()

요소를 각각의 변수에 저장한 다음 더 명확하게 하기 위해 요소에 대해 기능을 수행했습니다.

결국 다음과 같이 끝납니다.

 

 

반응형
반응형

webdriver.ChromeOptions() 함수를 실행할 때 크롬 드라이버의 경로만 매개변수로 지정 해줍니다.

여기에 chrome_options 매개변수를 추가로 입력하면 브라우저 크기, 시크릿모드, headless 모드 등 다양한 옵션을 설정할 수 있습니다. 아래는 대표적으로 많이 사용하는 옵션들로 맨 하단에 참고 부분에는 좀 더 많은 옵션들을 확인할 수 있습니다.

 

  • headless : headless 모드 설정
  • disable-gpu : gpu를 사용 안하도록 설정
  • lang=ko_KR : 한국어로 실행되도록 설정
  • start-maximized : 브라우저 최대화
  • window-size=1920,1080 : 1920*1080 브라우저 크기로 오픈
  • incognito : 시크릿모드
  • disable-popup-blocking : 팝업 차단 해제

아래 간단한 예시로 크롬 브라우저를 실행할 때, 창을 최대화하면서 시크릿 모드로 구글 사이트로 진입하는 코드입니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

chrome_options = webdriver.ChromeOptions() # 크롬 옵션 객체 생성
chrome_options.add_argument('start-maximized')
chrome_options.add_argument('incognito')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

driver.get(url='https://www.google.com/')

driver.quit()

 

참고 : 

 

GitHub - grafeen/selenium_ex03

Contribute to grafeen/selenium_ex03 development by creating an account on GitHub.

github.com

 

 

List of Chromium Command Line Switches « Peter Beverloo

 

peter.sh

 

 

반응형
반응형

'Selenium webdriver 로 웹페이지 띄우기' 를 진행하며 chrome webdriver를 실행했는데, 아래와 같은 warning이 뜨는 경우가 있습니다.

 

DeprecationWarning: executable_path has been deprecated, please pass in a Service object 

 

이런 경우 service 키워드를 사용하면 됩니다.

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.get(url='https://www.google.com/')

driver.quit()

 

아래는 실행 결과후 console 창에 

 

참고 : 

반응형
반응형

Selenium webdriver로 웹페이지 띄우기(1) 에서는 chromedriver를 직접 다운 받아서 폴더에 넣고 경로를 지정해서 웹페이지 띄우는 방법을 보여드렸습니다.

 

chromedriver를 다운 받는 것은 어느 사이트를 보던 흔하게 있는 예제였는데요, 제가 이번에 보여드릴 예제는 webdriver-manager 라는 패키지를 설치함으로서 chromedriver 설치 및 경로 지정 없이 사용하는 방법을 알려드리겠습니다.

 

먼저, 새로운 프로젝트를 만들거나 혹은 지난 시간에 했던 프로젝트에 새로운 python 파일을 만듭니다.

 

저는 새로운 프로젝트를 만들었습니다. (새로운 프로젝트 생성 시, selenium 을 다시 설치하셔야 합니다.)

지난 시간에 selenium 설치하는 방법을 터미널을 통해 패키지를 설치하거나 pycharm IDE의 python interpreter 를 통해 패키지를 설치하는 방법을 알려드렸는데요, 이번에도 동일하게 어떤 것을 사용하시던 무방합니다.

 

다시 한번 복습겸 방법을 알려드리면 아래와 같습니다.

 

 첫번째 : 터미널로 pip install webdriver-manager 를 입력하고 엔터를 치면 설치가 됩니다.

 두번째 : File -> Settings -> Project: XXXX 로 적혀있는 부분 클릭 -> Python Interpreter 클릭 -> 여기서 [+] 버튼 클릭 -> 검색창에 webdriver-manager를 입력 후 [Install Package] 버튼을 클릭하면 됩니다.

webdriver-manager 패키지가 설치되고 나면 팝업창을 전부 닫아주세요.

 

저는 이전 시간과 마찬가지로 main.py 를 전부 지우고 작성하겠습니다.

하기와 같이 명령어를 입력하시면 됩니다.

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get(url='https://www.google.com/')

driver.quit()

전체를 보면 아래와 같습니다.

실행을 해보도록 하겠습니다. 실행은 마우스 오른쪽 버튼을 클릭하고, Run 'main' 하시거나 단축키 Control + Shift + F10 을 누르면 크롬 브라우저로 구글 웹페이지가 열렸다가 닫히는 것을 보실 수 있습니다. 

이전과 달라진 소스코드는 아래 영역으로, chromedriver를 다운 받아서 경로 지정하는 부분이 ChromeDriverMaanager().install() 로 경로 지정할 필요없이 알아서 설치가 되는 장점이 있습니다.

driver = webdriver.Chrome(ChromeDriverManager().install())

 

소스코드 : 

 

GitHub - grafeen/selenium_ex02

Contribute to grafeen/selenium_ex02 development by creating an account on GitHub.

github.com

 

 

반응형
반응형

지난 시간에는 Selenium 설치방법 에 대해 알아봤습니다.

 

웹페이지를 브라우저로 열기 위해서는 크롬의 경우 chromedriver, 파이어폭스의 경우 geckodriver와 같은 webdriver 프로토콜이 필요합니다. (자세한 설명은 selenium 웹페이지에서 보시면 나와 있으니 궁금하신 분은 검색으로...)

 

거의 모든 예시는 chrome 브라우저를 가지고 들으며, 실제적으로 많이 사용하기 때문에 저 또한 chrome 브라우저를 통해 보여드리겠습니다.

 

chromedriver를 통해 웹페이지를 띄우는 방법은 2가지가 있습니다.

 

일단 첫번째는 많이들 사용하는 방법으로 chromedriver를 다운 받아서 경로를 지정하여 호출하는 방법입니다.

 

1. 구글에서 chromedriver를 입력하시면, 아래와 같이 ChromeDriver 웹페이지가 있습니다. 이걸 클릭해주세요.

2. ChromeDriver 사이트에 들어가면 Current Releases 에 각종 버전들이 있습니다. 일단 어떤 버전들이 있구나 보시면 됩니다.

3. 그리고 내가 사용하는 크롬 브라우저를 실행 시키고, 브라우저 창에 chrome://settings/help 를 입력해주면 현재 내가 사용하는 버전을 알 수 있습니다.

저는 96.04664.93 버전을 사용하고 있네요. (21년 12월 기준)

4. 현재 브라우저 버전을 기억하고 ChromeDriver 웹페이지를 보시면 96.04664.45 버전을 볼 수 있습니다. 맨 뒤의 숫자들보다는 맨 앞의 숫자를 맞춰서 다운 받아주시면 됩니다. (예를 들면 내가 현재 96.0.4664.93 버전인데 97.04692.36 버전을 받으면 동작이 제대로 안되는 경우가 발생합니다.)

 

96.04664.45 버전을 클릭하면 아래와 같이 각종 OS에 맞는 버전을 다운 받습니다. 저는 win10이기 때문에 chromedriver_win32.zip을 받았습니다.

5. 받은 파일의 압축을 풀면 chromedriver.exe 가 나오는데, 이걸 이전 시간에 만들었던 프로젝트 폴더 내에 넣어줍니다. (chromedriver.exe 파일 앞에 물음표가 있는데 무시하셔도 됩니다.)

6. main.py 파일을 사용해보겠습니다. main.py 내용 전부 삭제하시고, 하기와 같은 명령어를 입력하시면 됩니다.

(엄청 단순하죠? 처음이니까...쉬엄쉬엄...가야죠)

from selenium import webdriver

driver = webdriver.Chrome('./chromedriver.exe')
driver.get(url='https://www.google.com/')

driver.quit()

전체를 보면 아래와 같습니다.

7. 실행을 해보도록 하겠습니다. 실행은 마우스 오른쪽 버튼을 클릭하고, Run 'main' 하시거나 단축키 Control + Shift + F10 을 누르면 크롬 브라우저로 구글 웹페이지가 열렸다가 닫히는 것을 보실 수 있습니다. 

 

코드를 보면, 

먼저 webdriver.Chrome() 함수를 사용하여 드라이버를 로드합니다. 이걸 driver라는 변수에 저장합니다.

webdirver.Chrome() 함수 내에는 pythonProject2 폴더내에 바로 chromedriver.exe 파일이 위치하기 때문에 ./ 를 사용했습니다. 

그리고 get(url) 함수를 사용하여, 해당 URL을 브라우저에서 띄우게 됩니다.

마지막으로 driver.quit() 를 사용하여 브라우저를 닫게 됩니다.

 

소스코드 :

 

GitHub - grafeen/selenium_ex01

Contribute to grafeen/selenium_ex01 development by creating an account on GitHub.

github.com

 

반응형
반응형

앞서 작성한 포스팅에서 Selenium Suite 패키지 중 가장 일반적으로 사용하는 것은 Selenium Webdriver 입니다.

Selenium 을 검색해보면 수 많은 자료들이 있는데 가장 기본적인 selenium webdriver 를 설치하는 방법이죠.

저 또한 설치하는 방법부터 시작하려고 합니다.

 

준비물 : Windows 환경, Pycharm

 

1. 최신 버전의 Python을 다운 받아서 설치합니다. (2021년 12월 6일 현재 3.10.0 버전)

 

2. Jet Brain사이트에 가서 Community 버전의 Pycharm IDE를 다운 받아서 설치합니다.

-> Pycharm 이란?  컴퓨터 프로그래밍, 특히 Python 언어에 사용되는 통합 개발 환경입니다.

 

3. Pycharm IDE를 실행 시킵니다.

File -> New Project -> (Location 변경 가능) Create 버튼을 클릭합니다.

프로젝트가 생성되면 하기의 이미지와 같이 나옵니다. 

4. selenium 을 설치하기 위해서 2가지 방법이 있습니다. 

 첫번째 : 터미널로 pip install selenium 입력하고 엔터를 치면 설치가 됩니다.

 두번째 : File -> Settings -> Project: XXXX 로 적혀있는 부분 클릭 -> Python Interpreter 클릭하면, 아래와 같은 화면이 나옵니다.

여기서 [+] 버튼 클릭 -> 검색창에 selenium 입력 후 [Install Package] 버튼을 클릭하면 됩니다.

 

반응형
반응형

다른 application에서 재사용이 가능한 common 파일을 만들려면 core를 생성해야 한다.

 

생성하는 방법은 터미널에서 아래와 같이 입력한다.

 

>> django-admin startapp core

 

이 명령어를 치면, core 폴더가 생성된다. 

 

core에 model을 만들어서 그 model을 활용하여 확장이 가능하다.

반응형
반응형

core에 등록되어 있는 정보를 database에 저장을 하고 싶지 않으면 아래와 같이 입력한다.

 

abstract model은 model이지만 database에는 나타나지 않는 model이다.

 

class Meta:

    abstract = True

반응형
반응형

데코레이터란?

-> 현재 존재하는 함수의 구조를 바꾸지 않고도 기능을 추가할 수 있도록 해주는 파이썬의 디자인 패턴

     파이썬에서 함수를 객체로 인지하므로 함수 또한 다른 함수의 파라미터로 입력이 가능하고 리턴도 가능.

 

Decorator는 클래스 위에 쓴다. 

Ex.

@admin.register(models.User)

class CustomUserAdmin(UserAdmin):

blah blah~~~

 

위 decorator와 아래 코드는 같다.

하지만 위치는 다르다.

class CustomUserAdmin(UserAdmin):

admin.site.register(models.User, CustomUserAdmin)

반응형

+ Recent posts