자동화

 

winappdriver 에서 우클릭 메뉴를 클릭하고 싶었는데 도무지 클릭이 되지 않았다. 단순 요소로 클릭이 되지 않아서 xpath를 찾아서 해보았지만 그래도 실패.. 한참을 삽질하다가 중간에 스레드 슬립을 주어 시간을 좀 지연 시켰더니 겨우 됐다. 

 

우클릭 > 열기를 클릭해보려고 한다

먼저 우클릭 하는 방법을 알아야 하므로 이 링크를 참고하였다

 

https://yonoo88.tistory.com/1322

 

Winappdriver 주요 기능 사용법 in java

더블 클릭 public void DoubleClick(String name) { WebElement elementLocator = driver.findElementByName(name); actions.doubleClick(elementLocator).perform(); } 우클릭 public void RightClick(String nam..

yonoo88.tistory.com

 

 Root 세션을 받아와야 한다. Setup에서 WindowSession에 받아옴

WindowSession

Name으로 클릭하는 방법

그냥 name 으로 클릭하는 방법이 가장 간단하다 

예를 들면 이런식 - WindowSession.findElemnet(By.name("열기(O)")).click();

    public void RightClick(String name) {
    	//우클릭 구현
		WebElement elementLocator = winapp.findElementByName(name);
		actions.contextClick(elementLocator).perform();
        try {
			Thread.sleep(1000); //name를 찾기위한 지연시간 추가
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

        //이름으로 클릭
		WindowSession.findElemnet(By.name("열기(O)")).click();
       
    }

이름을 못 찾으면 중간에 지연시간을 추가해주면 동작한다. 이런 식으로 하면 바로 클릭이 가능한데 가끔 저게 안먹히는 녀석들이 있다. 그럴 땐 xpath로 하는 방법이 있다

 

Xpath로 클릭하는 방법

파일 탐색기의 xpath를 찾아야 한다. WinAppDriverUiRecorder 를 실행 시킨 후 Record를 클릭한다음 탐색기를 실행한다. 그리고 우클릭을 해보면 xpath가 나오는데

 

우클릭 열기의 xpath

 

저 xpath를 사용하여 클릭을 해주어야 한다. 일단 해당 폴더까지 마우스를 클릭까지 구현해준 다음 우클릭 코드를 작성

    public void RightClick(String name) {
    	//우클릭 구현
		WebElement elementLocator = winapp.findElementByName(name);
		actions.contextClick(elementLocator).perform();
        try {
			Thread.sleep(1000); //name를 찾기위한 지연시간 추가
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

        //이름으로 클릭
		WindowSession.findElemnet(By.name("열기(O)")).click();
       
    }

xpath를 보면 //Menu.. 부터 사용했으며 그 전 xpath는 Windowsession을 받아왔기 때문에 생략이 가능한 듯 하다.

 

 

코드를 실행해보면 우클릭 > 열기 버튼이 클릭되는데 열기 버튼을 누르기까지 약 20여초가 걸렸다. 왜 이렇게 오래 걸리는지 모르겠다. . 그렇다고 코드 중간에 Thread.sleep(1000)을 빼면 찾지를 못한다. xpath 를 탐색하는데 시간이 좀 걸리나 보다. 이것도 해결하는데 시간이 꽤 걸렸는데 안되는 이유는 2가지였었다.

 

1. xpath가 잘못된 경우 - xpath에 오타가 없는지 다른 xpath를 복사한건 아닌지 확인

2. 지연시간을 주지않아 동작하지 않은 경우

 

우클릭이 되지 않는다면 위 2가지를 다시 한번 살펴보아야 한다.

 

 

 

더블 클릭

 public void DoubleClick(String name) {
    	WebElement elementLocator = driver.findElementByName(name);
   	 	actions.doubleClick(elementLocator).perform();
    }

우클릭

    public void RightClick(String name) {
    	
		WebElement elementLocator = driver.findElementByName(name);
		actions.contextClick(elementLocator).perform();
    }

xpath 사용

driver.findElementByXPath("//ListItem[@ClassName=\"UIItem\"][@Name=\"폴더명\"]").click();

이클립스에서 xpath

UIRecorder에서 본 xpath, 빨간줄만 뽑아내어 사용

 

새로운 기능 사용할 때마다 추가 예정

 

 

 




자동화를 하면 항상 새 크롬창을 띄웠는데 현재 실행 중인 크롬 창에서 실행할 수는 없을까해서 검색해본 결과


무조건 한번은 새로 크롬을 새로 띄워야 한다는 결론에 도달.


그리고 그 크롬에서 적용 할 수 있었다.


첫번째 해야할 것은 (크롬드라이버 다운은 필수)


cmd에서 디버그용? 크롬을 실행시켜야 한다


chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile" 


이걸 cmd에서 실행해보면 크롬이 실행된다.


안된다면 C:\Program Files (x86)\Google\Chrome\Application\ 이 경로로 이동해서 실행해보거나


환경변수에 위 경로를 추가해준다.



이 크롬으로 계속 재활용할 수 있다.


이제 이걸 자바 코드 내에 cmd 실행을 시킨다음 실행해주면 된다.


참고로 코드 내에서 실행할 때는 완전한 경로로 해주어야 실행이 된다.


 Runtime.getRuntime().exec("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe --remote-debugging-port=9222 --user-data-dir=\"C:/selenum/AutomationProfile\"");


위 코드를 먼저 실행해 준 다음


ChromeOptions options = new ChromeOptions();

options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");

driver = new ChromeDriver(options); 


크롬 옵션을 추가해주어 실행된 크롬창을 사용하도록 지정해준다.(9222포트는 위 실행명령어 포트와 동일)



전체적인 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Automation {
 
    private static WebDriver driver;
 
    @BeforeClass 
    public static void setUp() throws Exception { 
        System.setProperty("webdriver.chrome.driver""C:\\chromedriver.exe");
            
        Runtime.getRuntime().exec("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe --remote-debugging-port=9222 --user-data-dir=\"C:/selenum/AutomationProfile\"");
 
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("debuggerAddress""127.0.0.1:9222");
        driver = new ChromeDriver(options);
        
        System.out.println(driver.getTitle());
        driver.manage().window().maximize();
        driver.get("https://www.naver.com");
        
    }
}
cs



 자동화 실행 후 현재 실행중인 크롬에서 확인해보려면  Runtime.getRuntime().exec 코드를 주석처리하고 실행하면 확인해볼 수 있다


주석처리를 안하면 실행할 때마다 새로운 크롬이 생성된다.



  1. 권석현 2020.02.01 21:16

    이 방법으로는 headless 옵션이 먹히지 않나요?

    • yonoo88 2020.02.01 21:21 신고

      Headless 는 코드에서
      options.addArguments("headless");

      이걸 추가해주면 되는 걸로 알고 있습니다

    • 초보 2020.02.13 12:28

      혹시 headless chrome으로 돌리시는거 성공하셨나요?





셀레니움으로 자동화를 하다보면 작업관리자에 chromedriver.exe가 수두룩하게 누적되어 있는 걸 볼 수 있다


이게 쌓이다보면 메모리를 상당히 잡아먹고 있는데 그래서 자동화가 한번 끝나면 프로세스를 종료하도록 하였다.

셀레니움에서 프로레스를 죽이는 기능이 있다고 하는데 이제 사용하지 않는 기능이라고 문서에 나와있었다




그렇다면 다른 방법으로 메소드를 다시 만들었을 것 같은데 아직 찾지 못했고 일단 급한대로 프로세스 죽이는 코드를 적용했다.



python 파이썬

- cmd에서 pip install psutil 로 설치 필수
1
2
3
4
5
6
7
import psutil 
 
for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()
 
cs



java 자바에서 사용


1
Runtime.getRuntime().exec("taskkill /F /IM chromedriver.exe /T");
cs



자동화 코드 이후에 추가해주면 chromedriver.exe가 없어지는 걸 볼 수 있었다.


GUI 구성하기

Qt designer로 생성한 .ui 파일 파이썬 .py로 변환

http://yonoo88.tistory.com/1209


GUI 구성상태


기능 : ID와 PW 입력 후 시작버튼을 누름 > 동작 완료 후 listWidget에 로그인 성공 표시


아래 코드를 보면 UI 객체 명 별로 코드가 구성되어 있다

핵심은 시작 버튼에 이벤트 처리를 해주는 것. 시작 버튼 객체명은  startButton  이다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
from PyQt5 import QtCore, QtGui, QtWidgets
from selenium import webdriver
import time
 
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(180234)
 
        self.listWidget = QtWidgets.QListWidget(Dialog)
        self.listWidget.setGeometry(QtCore.QRect(2016014161))
        self.listWidget.setObjectName("textBrowser")
 
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(80101616))
        self.label.setObjectName("label")
 
        self.label_2 = QtWidgets.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(80702116))
        self.label_2.setObjectName("label_2")
 
        self.startButton = QtWidgets.QPushButton(Dialog)
        self.startButton.setGeometry(QtCore.QRect(501307523))
        self.startButton.setObjectName("startButton")
 
        self.lineEdit_ID = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_ID.setGeometry(QtCore.QRect(303011320))
        self.lineEdit_ID.setObjectName("lineEdit_ID")
 
        self.lineEdit_PW = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_PW.setGeometry(QtCore.QRect(309011320))
        self.lineEdit_PW.setObjectName("lineEdit_PW")
 
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
 
#startButton 클릭시 autoExcute 함수 수행
        self.startButton.clicked.connect(self.autoExcute)
 
    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog""Naver Login"))
        self.label.setText(_translate("Dialog""ID"))
        self.label_2.setText(_translate("Dialog""PW"))
        self.startButton.setText(_translate("Dialog""시작"))
 
 #셀레니움 동작 코드 함수 autoExcute 생성
    def autoExcute(self):
        driver  = webdriver.Chrome('C://chromedriver.exe')
        driver.implicitly_wait(3)
        driver.get('http://www.naver.com')
        driver.maximize_window()
        id = self.lineEdit_ID.text()
        pw = self.lineEdit_PW.text()
        driver.find_element_by_class_name('lg_local_btn').click()
        driver.find_element_by_id('id').send_keys(id)
        driver.find_element_by_id('pw').send_keys(pw)
        driver.find_element_by_class_name('btn_global').click()
        time.sleep(3)
        driver.close()
#listWidget에 로그인 성공 표시
        self.listWidget.addItem('로그인 성공')
        # self.addItem()
 
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
 

cs


코드를 실행시킨 후 아이디와 암호 입력 > 시작을 누르면 로그인 자동화가 진행되고 끝나면 로그인 성공 텍스트가 나타난다







사전 작업은 링크 참고


파이썬에서 selenium을 이용하여 크롬 브라우저 띄우기

http://yonoo88.tistory.com/1200 





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from selenium import webdriver
import time
 
driver = webdriver.Chrome('C://chromedriver.exe')
driver.implicitly_wait(3)
driver.get('http://www.naver.com')
 
driver.maximize_window()
 
 
driver.find_element_by_class_name('lg_local_btn').click()
driver.find_element_by_id('id').send_keys('아이디')
driver.find_element_by_id('pw').send_keys('비번')
driver.find_element_by_class_name('btn_global').click()
 
time.sleep(3)
driver.close()
cs






JAVA

driver.manage().window().maximize(); //브라우저 확장

Python

driver.maximize_window()


JAVA

Thread.sleep(500); //단위 ms

Python

import time #(import 필요)

time.sleep(0.5)     # 단위 s


JAVA

Alert alert = driver.switchTo().alert(); //얼럿 창으로 스위칭

Python

alert = driver.switch_to_alert()


JAVA

alertText = alert.getText(); //얼럿 창 메시지 추출

Python

alertText = alert.text


JAVA

driver.find_element_by_id('user_id').sendKeys('id'); //id 요소 찾기와 입력값 채우기

Python

driver.find_element_by_id('user_id').send_keys('id')


JAVA

driver.quit();

Python

driver.close()


Python

driver.find_element_by_xpath('//*[@id="content"]/div/div[3]/button[2]').click() //xpath 클릭


표 출처 : https://wkdtjsgur100.github.io/selenium-xpath/


node




사전 작업이 필요(환경변수에 파이썬도 추가되어있는 상태)


selenium 설치 
cmd 창에서 pip install selenium 으로 설치한다.

크롬드라이버 내려받기

https://sites.google.com/a/chromium.org/chromedriver/downloads


경로는 편한 곳으로 내려받기



절대 파일명은 selenium.py 로 하지 말것! 모듈명이 selenium이라 이름이 같으면 실행이 안된다고 한다

멋 모르고 파일명을 selenium으로 해놨다가 삽질함

from selenium import webdriver

driver = webdriver.Chrome('C://chromedriver.exe')
driver.implicitly_wait(3)
driver.get('http://www.naver.com')

위 코드를 작성하고 파이썬 실행





+ Recent posts