지식메모

반응형


swipe를 이용한 상하좌우 스크롤 및 스크롤 새로고침 구현

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
 
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.NoSuchElementException;
 
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
//import org.junit.Test;
import org.testng.annotations.Test;
 
 
public class Utilities extends AndroidDriver<WebElement> implements TakesScreenshot {
    Dimension size  =  manage().window().getSize();
 
    /**
     * 위로 스크롤
     */
    public void scrollUp() throws Exception {
        Thread.sleep(2000);
        
        int starty = (int) (size.height * 0.80);
        int endy = (int) (size.height * 0.20);
        int startx = size.width / 2;
        System.out.println("startx = " + startx + " ,endy = " + endy + " , starty = " + starty); 
        
        //올리기
        this.swipe(startx, endy, startx, starty, 0);
        Thread.sleep(2000);
    }
    
    /**
     * 아래로 스크롤
     */
    public void scrollDown() throws Exception {
        Thread.sleep(2000);
        int starty = (int) (size.height * 0.80);
        int endy = (int) (size.height * 0.20);
        int startx = size.width / 2;
//        System.out.println("startx = " + startx + " ,endy = " + endy + " , starty = " + starty); 
        
        //내려가기
        swipe(startx, starty, startx, endy, 0);
        Thread.sleep(2000);
    }
    
    /**
     * 스크롤 새로고침
     */
    public void pullToRefresh() throws Exception {
        Thread.sleep(1000);
        int starty = (int) (size.height * 0.5);
        int endy = (int) (size.height * 0.9);
        int startx = (int) (size.width*0.01);
//        System.out.println("startx = " + startx + " ,endy = " + endy + " , starty = " + starty); 
        
        //내려가기
        swipe(startx, starty, startx, endy, 0);
        Thread.sleep(2000);
    }
 
 
    /**
     * 오른쪽에서 왼쪽으로 Swipe
     */
    public void swipeToLeft() throws Exception {
        Thread.sleep(2000);
        int starty = (int) (size.width * 0.80);
        int endx = (int) (size.width * 0.20);
        int startx = size.height / 2;
        
        swipe(startx, starty, endx, starty, 0);
        Thread.sleep(2000);
    }
    
    /**
     * 왼쪽에서 오른쪽으로 Swipe
     */
    public void swipeToRight() throws Exception {
        Thread.sleep(2000);
        int starty = (int) (size.width * 0.80);
        int endx = (int) (size.width * 0.20);
        int startx = size.height / 2;
 
        swipe(endx, starty, startx, starty, 0);
        Thread.sleep(2000);
    }
        
    
}
 
 
cs


반응형
반응형




UI Automator Viewer 를 사용하여 화면 정보 얻기

UI Automator Viewer 는 Android SDK를 설치하면 같이 설치된다. 경로는 sdk 설치된 폴더에서 sdk/tools 폴더 안에 uiautomatorviewer.bat 파일로 있다.

폰을 연결한 후 viewer를 실행시킨 뒤 왼쪽 상단 device screenshot을 클릭하면 현재화면이 나타난다. 각 구성요소를 선택하면 우측에 정보가 나타난다.


▲uiautomator viewer 실행 후 화면 정보 얻어오는 모습


이제 여기서 얻은 정보를 로보티움에 사용한다.


버튼 클릭하기

Solo.clickOnView(View view) 로 클릭

ex) solo.clickOnView(solo.getView(id)); 버튼의 resourceid를 입력하여 클릭

네이버 앱인 경우 메뉴버튼을 누르고자 할 때


메뉴버튼의 resource-id 는 header_open_slide 인걸 볼 수 있다.

그리하여 solo.clickOnView(solo.getView("header_open_slide"));  이렇게 해주면 메뉴버튼을 누를 수 있다.


텍스트를 찾아 클릭하기

solo.clickOnText(java.util.regex.Pattern.quote(String text));

해당 text를 찾아 클릭한다.

ex) solo.clickOnText(java.util.regex.Pattern.quote("확인")); 확인이 써져있는 버튼을 클릭



그리드뷰 구성에서 항목 선택하기

solo.clickInList(int line); 

그리드뷰로 구성된 화면에서 resource-id가 없는 경우가 있는데 이럴 때 index 번호로 클릭할 수 있었다. 각 영역에는 index가 있었다.



예를 들면 위 사진에서 index 5번 사진을 클릭하고 싶으면 solo.clickInList(6); 을 해주었더니 클릭되었다. index+1 로 값을 넣어주면 선택이 되었다.



레이아웃 index를 사용하여 클릭하기

solo.clickOnImage(int index);

버튼은 있는데 resource-id가 없는 경우가 있었다.  그래서 찾아보니 clickOnImage로 클릭할 수가 있었는데 레이아웃 index를 사용하였다.


위 사진에서 보듯이 버튼에는 id가 없지만 레이아웃 자체에 index가 있었다. solo.clickOnImage(2) 를 해주니 클릭은 되었는데 다른 영역에도 index가 있어서 구분하여 사용하는 방법을 알아봐야할 것 같다.



스크롤 및 슬라이드 하기

solo.drag(float fromX, float toX, float fromY, float toY, int stepCount) 를 이용하여 스크롤 동작 확인

변수 설명

float fromX : 가로좌표 시작점

float toX : 가로좌표 도착점

float fromY : 세로좌표 시작점

float toY : 세로좌쵸 도착점

int stepCount : 드래그 속도(숫자가 작을수록 드래그가 빠름)


상하 스크롤의 경우 X좌표 고정 후 Y좌표로 구현 ex) solo.drag(100,100,50,350,40) 가로는 100,100위치에 고정 세로로 50부터 350까지 드래그

좌우 슬라이드일 경우 반대로 Y좌표 고정 후 X좌표로 구현

단, 해상도에 따른 정확한 좌표를 구하는 방법이 필요하다. 720x1280 기준의 좌표와 400x800 기준의 좌표는 다를 것이다. 절대좌표가 있는지는 모르겠음.


스크롤 내리기

solo.scrollDown();

드래그가 아닌 그냥 스크롤로 화면을 내려준다.



텍스트 찾기

solo.searchText(String text);

text를 찾는다. 반환 값은 boolean 값. ex) boolean text_search = solo.searchText("안녕");


solo.waitForText(String text);

특정 문자열이 나타날 때까지 기다린다. 기본값은 20초 이며 찾으면 true, 못 찾으면 false를 반환


solo.waitForText(String text, int minimumNumberOfMatches, long timeout);

minimumNumberOfMatches : 일치되는 최소 개수

timeout : 대기 시간 설정 (단위 밀리세크 1000ms =1초)


텍스트 입력하기

solo.enterText(int index,String text);

index : 텍스트 입력 창의 index값

text : 입력할 텍스트

ex) solo.enterText( 1, "안녕하세요");


solo.enterText(android.widget.EditText editText, String text);

editText : 텍스트 입력 창의 editText id 값

text : 입력할 텍스트

ex) solo.enterText((EditText)solo.getView("id"), "안녕하세요");


EditText 내 텍스트 삭제

solo.clearEditText(int index); 

index : EditText의 index 


또는 solo.clearEditText(android.widget.EditText editText);
ex) solo.clearEditText((EditText)solo.getView("id"))







반응형
반응형




사전환경셋팅이 되어있어야 한다.

java 와 Android sdk가 설치되어 있어야 하고 환경변수도 설정되어 있어야한다.



http://recorder.robotium.com/downloads/re-sign.jar



re-sign.jar



위 링크에서 re-sign.jar 파일을 받아서 실행한다.


그럼 아래와 같은 창이 뜨고 여기다 재서명할 apk를 끌어다 놓으면 된다.






이런 창이 뜬다면 zipalign 파일이 없다는 것이므로 해당파일을 ~~sdk/tools 폴더에 붙여넣어준다.




zipalign 파일은 sdk 가 설치된 폴더에 보면 build-tools 라는 폴더가 있는데 

들어가서 아무 폴더에서 쉽게 찾아볼 수 있다.



zipalign.exe



재서명이 끝나면 아마 apk 명 끝에 -debug라고 붙은 apk가 생성되었을 것이다.

(또는 직접 정해준 파일명으로)


이 apk 를 사용하면 끝이다.


이렇게 간단한 방법이 있었다니..






반응형
반응형




Android Run 시 아래와 같은 에러가 났을 경우


[2016-02-15 11:25:55 - Dex Loader] Unable to execute dex: Multiple dex files define

[2016-02-15 11:25:55 - Test] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define


android-support-v7-appcompat 프로젝트가 Library 에 추가 되었는지 확인해본다.


해당 프로젝트 우클릭 - Properties - Android 탭 하단에서 볼 수 있다.


Library 를 보면 android-support-v7-appcompat 프로젝트가 추가 되었는지 볼 수 있는데 필자의 경우 android-support-v7-appcompat 라이브러리가 사라져 있었다.






이런 경우 android-support-v7-appcompat 라이브러리 프로젝트를 따로 import 시켜주어야 한다. 



이 프로젝트는 아마 처음 Android Project를 새로 생성할 때 OS 4.4.4 킷캣 이상 버전으로 생성하면 자동으로 생성되었던 라이브러리이다.

(android-support-v7-appcompat 이게 생성 안되게 프로젝트를 생성하는 방법이 있다곤 하는데 우선 급한 불 부터 꺼보겠다)


그런데 이게 가끔 지멋대로 프로젝트가 사라진다거나 이상하게 깨지는 경우가 많다. 

그래서 이게 생성안되게 새 프로젝트 생성시 4.1.2로 만들곤 한다.


혹시 몰라 첨부..


android-support-v7-appcompat.zip



android-support-v7-appcompat를 import 하였다면 이제 작업하는 프로젝트에 추가해주어야 한다.


Add 버튼을 누르면 라이브러리 프로젝트 선택화면이 나온다.




android-support-v7-appcompat를 선택하고 ok를 누르면







초록색으로 체크표시가 되고 추가가 될 것이다. Apply를 눌러 적용시키고


이제 다시 한번 프로젝트를 Run 해본다.


그래도 안된다면 다음 링크를 참고해본다.


http://stackoverflow.com/questions/7870265/unable-to-execute-dex-multiple-dex-files-define-lcom-myapp-rarray


http://www.androidside.com/bbs/board.php?bo_table=B56&wr_id=27196



반응형
반응형






HP 에서 공식적으로 나온 방법


https://support.hp.com/kr-ko/document/c04912794


위 링크대로 하는 것을 추천드립니다. 훨씬 간단합니다.

모두 끝나고 나면 아래와 같이 사용자 지정 프린터라는 항목이 생길 것입니다.




이 프린터를 선택하고 출력하시면 됩니다.





어처구니가 없는 일이 발생했다. 

얼마 전에 HP Deskjet 2540 모델이 정품 잉크값(9900)도 저렴하고 프린터 가격도 괜찮아서 구매했었는데 

가족관계증명서를 출력하려고 했더니 프린터지원불가랜다..


프린터 이용목적 1순위가 민원 문서 출력이었는데..


아 동사무소 직접가서 발급받으면 1000원 내야하는데.. 절망하던 찰나에 

혹시나 해서 찾아보니 해결방법이 있었다.


우선 지금 쓰고 있는 프린터는 HP deskjet 2540 시리즈 중 2545 모델이며

네트워크 연결 유형으로 사용하고 있었다.



이 모델은 민원발급이 불가능한 모델로 2540 시리즈와 호환되는 프린터 드라이버를 설치해 발급이 가능하다.


k550 드라이버를 설치해주어야 한다.



그 방법은 우선 윈도우7 기준으로 

제어판 - 장치 및 프린터 - 프린터 추가를 누른다.






로컬 프린터 추가 클릭








새 포트 만들기 선택 후 Standard TCP/IP port 선택해주고 다음







다음화면에서 현재 쓰고 있는 네트워크 프린터의 ip를 입력해주어야 한다.


ip를 찾는 방법은 HP 프린터 드라이버를 설치하면 함께 제공되는 

HP Deskjet 2540 시리즈 프로그램을 실행하고 IP 주소 업데이트를 클릭한다.





그럼 아래와 같은 화면에 이전 ip가 나타난다.

이 ip를 적어주면 된다.


또는 아래에 나와있는 ip주소 찾는 방법을 참고한다.








호스트 이름 또는 ip 주소에 입력하면 포트이름도 자동으로 입력된다.


그리고 프린터를 검색하고 사용할 드라이버를 자동으로 선택 체크 해제 하고 다음 클릭







프린터 드라이버 선택화면이 나오는데

 HP - HP Officejet Pro K550 Series 를 선택하고 다음을 누른다.






다음다음 진행하면서 프린터를 추가한다. 그럼 장치 및 프린터에 K550 아이콘이 생성된다.






이제 출력만 하면 된다.

가족관계증명서 또는 주민등록등본 교부 홈페이지에 가서 출력을 시도한다.


인쇄시 프린터 선택 화면이 나오는데 

HP Officejet Pro K550 Series 가 민원발급가능으로 보여질 것이다!!






HP Officejet Pro K550 Series 을 선택하고 출력해주면 끝!!


이제 집에서 민원발급이 가능해져서 다행이다..









반응형
반응형




가끔가다 보면 뭐 한것도 없는데 하드디스크 용량이 가득차있었습니다.


딱히 설치한 프로그램도 없고 그냥 계속 써왔었거든요.


어느 프로그램이 용량이 그리 잡아먹는지 알 수 있는 방법이 없었습니다.


그래서 찾아보던 중 괜찮은 프로그램이 있어서 소개합니다.



TreeSize Free

공식 홈 다운로드 링크

https://www.jam-software.com/treesize_free/



하드디스크의 폴더를 트리형식으로 간결하게 보여줍니다.


위 홈페이지에서 다운로드 받으시고 설치하시면 끝


프로그램을 실행해서 C드라이브 Scan을 수행합니다.





그럼 스캔을 시작하게 되고 폴더별 용량이 쭉 나오게 됩니다.




좌측 > 버튼을 누르면 하위 폴더가 쭉 나오죠. 

이렇게 트리 형식으로 쭉 폴더 별로 용량정보가 나옵니다.



가장 많은 폴더를 찾아 들어가보니 AppData가 용량을 많이 잡아먹고 있었네요

그 중에서도 Temp 폴더..

 Temp 폴더는 프로그램의 빠른 실행을 위해 임시파일들이 저장되는 파일인데 많이도 쌓였군요.





그래서 필요없는 파일들을 지워주니 용량이 많이 확보 되었습니다.

혹시 모르니 어떤 파일인지 알아보시고 삭제하는게 좋을 것 같네요


그 외에도 삭제 후 남아있는 쓰레기폴더 등도 많이 보여서 삭제해주었구요


깔끔하게 보여주니까 정리하기 편하네요!



반응형
반응형




sdk 를 업데이트 하려는데 자꾸 로그에



Download interrupted: peer not authenticated 


이런게 뜨면서 설치가 되지 않았다.


그래서 찾아보니 옵션을 수정해주어야 된다고 한다.


sdk 매니저 상단 Tools > Options 에 들어간다.





그리고 하단 others에 


Force https;// 를 체크해준다.






Close 한뒤 설치를 다시 시도해본다.


설치가 진행된다!








반응형
반응형




자바에서 프로그램을 만든 뒤 프레임바 아이콘을 바꾸고 싶었다.


바로 요놈을 바꿔주고 싶었다.





그래서 프로젝트 내 이미지 파일을 복사한 뒤 아이콘을 변경하기로 했다.




icon 폴더 생성 후 p.png 파일을 넣었다.


그런다음


ImageIcon img = new ImageIcon("icon/p.png");

        win.setIconImage(img.getImage());



이렇게 코드를 넣어주고 실행하면 변경됐으나 


 Runnable JAR 즉 실행가능한 JAR 파일로 생성하여 실행하면 변경되지가 않았다.


왜 jar 파일로만 생성하면 안되는 걸까해서 찾아본 결과 이미지가 있는 폴더도 같이 묶어주어야 했다.




먼저 프로젝트 우클릭 > properties 에 들어간 뒤 Java Build Path 에 들어간다.


Source 탭에서 Add Folder 를 선택한다.






그런다음 이미지가 있는 폴더를 체크해준다.

여기서는 icon 폴더





적용한 다음 저 위치의 경로를 추출하기 위해 다음 코드를 써준다.


1
2
3
4
 URL imageURL = 클래스명.class.getClassLoader().getResource("p.png");
 ImageIcon img = new ImageIcon(imageURL);
 JFrame객체.setIconImage(img.getImage());
 
cs



이렇게 해주면 프레임바 아이콘이 교체된다.

한번 이클립스에서 실행해보고 적용됐는지 확인해본다.





적용한 다음 프로젝트 우클릭 > Export > Java > Runnable JAR file 선택













Launch configuration 에서 실행될 클래스 지정해주고


Library Handling 에서 두번째 선택한 뒤 finish 해준다.


이유는 모르겠으나 두번째로 해야 적용이 되었다.








그리고 생성된 jar 파일을 실행해보고 아이콘이 바뀌었나 확인해본다.


그럼 어느 컴퓨터를 가도 아이콘은 적용되어 있을 것이다.














반응형

+ Recent posts