[Python] Selenium 사용법

webdriver 다운로드

Selenium 사용전 사용하는 브라우저에 맞는 webdriver를 다운로드받아서 해당 파일이 있는 곳을 PATH에 추가해두는 것이 좋다. https://pypi.org/project/selenium/ 의 Drivers 섹션을 참고.

특정 페이지를 열기

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("blog.dasomoli.org")

페이지를 열고 난 후 기다리기

어느 페이지를 열고 난 후 동작을 시작하려면 해당 페이지가 열렸을 때 나타나는 element를 기다려서 동작을 시작해야 한다. link text라면 다음과 같은 식으로 기다릴 수 있다. 아래에서 20은 20초를 의미한다. 첫번째 인자가 괄호로 둘러싸여 있음에 유의하라.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Ult-Build-1")))

다음처럼 어느 태그가 나타나길 기다릴 수도 있다.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.TAG_NAME, "h1"), "Project INTEGRATED_BUILD_SYSTEM_TOOL"))

페이지 내의 특정 element 찾기

element = driver.find_element_by_name("userName")

element가 찾기 쉽게 id나, class name 등으로 되어 있다면 find_element_by_id() 혹은 find_element_by_class_name() 등으로 쉽게 찾을 수 있다. 아니라면 tag name 등으로 찾은 후 돌리면서 찾아본다. 함수명이 element가 아닌 elements 임에 유의하라.

import re

ultp = re.compile('^Ult-Build-[12].*')
ult_req = { }

elements = driver.find_elements_by_tag_name("tbody")
for tag in elements:
    if ultp.match(tag.text):
        wordlist = tag.text.split()
        if len(wordlist) >= 2:
            ult_req[wordlist[0]] = wordlist[1]

키 입력이나 클릭하기

찾은 element가 input과 같은 입력이 가능한 element라면 바로 send_keys()로 입력이 가능하다.

from selenium.webdriver.common.keys import Keys

element = driver.find_element_by_id("j_username")
element.send_keys("dasomoli")

element = driver.find_element_by_name("j_password")
element.send_keys("password", Keys.ENTER)

직접 element를 찾기 어렵다면 근처 element를 찾은 후 click한 후 key를 입력할 수도 있다.

from selenium.webdriver.common.action_chains import ActionChains

elements = driver.find_elements_by_class_name("setting-name")
for element in elements:
    if element.text == "P4_Shelve_CLs":
        shelve_element = element

actions = ActionChains(driver)
actions.move_to_element_with_offset(shelve_element, shelve_element.rect['width'] + 5, shelve_element.rect['height'] / 2).click().send_keys("12345678", Keys.ENTER)
actions.perform()

send_keys() 대신 click() 을 이용하면 마우스 클릭이 가능하다. 마우스 클릭 지점을 찾기 힘들 때는 context_click()을 사용하면 우클릭되는데, 이 때 나타나는 context menu로 클릭 지점을 대충 파악할 수 있다.

마우스 클릭 등으로 선택된 element를 얻기

actions = ActionChains(driver)
actions.move_to_element_with_offset(workspace_element, workspace_element.rect['width'] + 23, workspace_element.rect['height'] / 2).click()
actions.perform()
element = driver.switch_to.active_element

select form에서 값 선택

from selenium.webdriver.support.ui import Select

select = Select(element)
if value != "":
    select.select_by_visible_text(value)
else:
    select.select_by_index(0)

참고

  1. Selenium with Python – Read the Docs
  2. Selenium Documentation
  3. Selenium Browser Automation Project (한글 버전도 있다)

Logitech G1과 G403 wireless 마우스 크기 비교

딜레이 없는 괜찮은 무선 마우스가 하나 갖고 싶다고 생각하던 중에 Black Friday를 맞아 로지텍 G403과 G900을 싸게 팔길래 고민고민하던 중에 원래 쓰던 G1과 크기 비교를 하고 싶은데, 찾아봐도 없길래 내가 올린다. 결국 내가 산 건 G403.

G1에 비해 좀 크고, 묵직하다.  손이 작은 나도 G1을 잡으면 마우스 등이 손바닥 안쪽의 상단까지만 닿는데, G403은 조금 더 깊이 닿고, 마우스 등이 손바닥 안쪽의 상단 3/4이 닿는다. 모양이 달라서 쥐는 방법이 좀 달라진다.

G1과 G403의 크기 비교

G1과 G403의 크기 비교

G1과 G403의 크기 비교

G1과 G403의 크기 비교

KVM 스위치 ATEN CS692 사용법

HDMI/USB/Keyboard/Audio 를 두개 연결해서 전환할 수 있는 KVM 스위치 ATEN CS692를 퇴사한 동료가 쓰던 것을 물려받아(?) 쓰고 있는데,

이상하게 특정 마우스만 꽂으면 이상하게 튀고, 웨이브 모양을 그리며 움직이는 거다;; 상하로 움직이는데 좌우로 움직이고 막… 다른 마우스 꽂으면 잘 되고.. -_-;;

그래서 접지나 호환성 문제가 있나 하고 넘어갔다가, 오늘 매뉴얼을 찾아 읽어보니 Mouse Emulation mode가 켜져 있으면 그렇더라. 끄니까 잘된다.

KVM에 핫키 설정이 있었다는 사실을 모르고, 스위치로만 눌렀더니…

어쩐지 컨트롤키랑 여러개 막 치다보면 키보드 램프가 돌아가며 깜박깜박하고, 어떨 땐 막 제멋대로 화면 전환이 되더라니… 램프 깜박거릴 때 ESC 누르기 귀찮았는데… 어쩐지… 어쩐지…

원래는 Scroll lock 두번 누르는 것으로 시작되는 명령 모드가, Scroll lock을 Ctrl로 변경할 수도 있어서, 이게 Ctrl로 변경되어 있어서.. Ctrl키를 많이 쓰다보면 막 제멋대로….

[Scroll lock], [Scroll lock], [Enter] 하면 다른 화면 전환.

[Scroll lock], [Scroll lock], m, [Enter] 하면 Mouse emulation mode Enable / Disable.

[Scroll lock], [Scroll lock], w, [Enter] 하면 Switching mouse-port 라던가. 암튼, 휠 버튼 더블클릭으로 마우스 전환. 이건 Mouse emulation mode가 켜져 있어야 동작한다고 한다. 누르면 근데 아마 저절로 Mouse emulation mode가 On되는 듯.

[Scroll lock], [Scroll lock], x, [Enter] 하면 Scroll lock 두번 누를 때 Scroll lock 대신 Ctrl키를 사용할 수 있다.


모르거나 이상하면 매뉴얼을 읽어보자.