1.Facebook api를 사용해서 글등록시 연속으로 등록 시 스팸방지 에러메세지가 뜨며 등록이 되지 않는다. 결국 Htmlunit 라이브러리를 이용하여 가상브라우져에서 등록하는 방식으로 구현하였슴


2. 개발에 유의한점은 

- html 을 단순화하여 분석하기 위해 모바일 페이지로 접속(m.facebook.com)

- 한글/영문등 언어별로 페이지가 다르게 나타나므로 한글페이지로 접속하도록 http header 강제 설정


3. 소스 

- 아래 소스에서 ID, PW를 facebook 계정으로 바꾸어 사용하면 됨

import java.util.List; import org.apache.log4j.Logger; import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlInput; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class FacebookPost2 { private static Logger log = Logger.getLogger("facebook2"); public static void main(String[] args) throws Exception { new FacebookPost2().reg("", "test"); } public void reg(String title, String content) throws Exception{ String message = ""; message = content; WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_8); //브라우져 Header 설정 webClient.addRequestHeader("Accept-Language", "ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4, value"); webClient.addRequestHeader("Accept-Charset", "windows-949,utf-8;q=0.7,*;q=0.3"); webClient.setThrowExceptionOnScriptError(true); webClient.getCookieManager().setCookiesEnabled(true); webClient.setJavaScriptEnabled(true); //페이지 접속 HtmlPage page = (HtmlPage) webClient.getPage("http://m.facebook.com"); List<htmlform> htmlf = page.getForms(); //1번째 Form HtmlForm form = htmlf.get(0); //ID/PW 설정 form.<htmlinput> getInputByName("email").setValueAttribute(ID); form.<htmlinput> getInputByName("pass").setValueAttribute(PW); page = (HtmlPage) form.getInputByName("login").click(); Thread.sleep(100); log.error("button click"); //글 등록 page.<htmlelement> getElementByName("status").focus(); page.<htmlelement> getElementByName("status").setTextContent(message); page.<htmlelement> getElementByName("update").click(); //브라우져 닫기 webClient.closeAllWindows(); } }</htmlelement></htmlelement></htmlelement></htmlinput></htmlinput></htmlform>

<< 위코드는 약간의 수정이 필요합니다>>

 


http://krazyhe.tistory.com/23

 

Posted by 장안동베짱e :

개발환경 : JDK 1.5, Junit 3, HtmlUnit 2.7,  window XP

 

HtmlUnit 은 WebApplication 개발시 브라우저에서 테스트하지 않고 Java

프로그램을 단위 테스트 해볼수 있는 framework 이다. javascript, Ajax 를 완벽하게 지원할 뿐만 아니라 Internet Explorer, Firefox 두개의 브라우저에서 테스트 해볼수 있다.

 

(1) 환경설정

 

이것의 주요 목적은 개발된 웹사이트의 단위테스트와 정보를 리턴받기 위함이다.

http://htmlunit.sourceforge.net/ 에 주요내용이 있으므로 참고하기 바란다.

일단 왼쪽에 downloads 를 클릭해 파일을 다운받는다. 파일안 lib 폴더에

의존적인 class 들이 있으므로 그대로 복사해서 쓰면 된다.



HtmlUnit 을 돌리기 위해서 어떤 jar 버전이 의존적인지 확인해 볼려면 다음 페이지로 가서 확인하면된다. http://htmlunit.sourceforge.net/dependencies.html



다운받은 jar 파일을 복사해넣고 간단히 테스트 프로그램을 만들어서 실행해보자.

HtmlUnit 을 테스트하기위해서는 Junit 프레임웍을 사용해야한다.

windows > Preferences > Java Build Path 로 들어간다. Libraries 탭을 클릭해서 설정화면으로 들어가자. 화면에서 오른쪽 버튼중 Add Library 를 클릭하게 되면 eclipse 에서 제공하는 라이브러리 패키지 리스트가 제공된다. 그중 Junit 을 선택하게 되면 Junit3, Junit4 중 하나를 선택하게 되는데 나는 이전부터 Junit3 가 익숙해져 있어서 3 를 선택했다.



(2) 테스트 클래스 제작

 

이제 Junit 클래스를 하나 만든다. junit.framework.TestCase 클래스를 상속받아 만드는데 함수실행을 위해서는 함수명 앞에 testXXX 형태로 이름을 만들어야 framework 이 인식하게 된다. 사이트에서 사용한 예제는 Junit4 를 기반으로 했기 때문에 @Test 어노테이션을 사용할수 있지만 Juit3 에서는 못하기 때문에 함수명을 textXXX 로 만들수 밖에 없다.


import junit.framework.TestCase; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class WebSubmit extends TestCase { public void testHomePage() throws Exception { final WebClient webClient = new WebClient(); final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net"); assertEquals("HtmlUnit - Welcome to HtmlUnit", page.getTitleText()); final String pageAsXml = page.asXml(); assertTrue(pageAsXml.contains("")); final String pageAsText = page.asText(); assertTrue(pageAsText.contains("Support for the HTTP and HTTPS protocols")); } }

위 소스를 테스트 한 결과이다. 왼쪽에 보면 문제 없이 진행된 것을 볼수 있다.



그리고 로그를 확인해 보면 사이트로 전송받은 HTML 내용이 DEBUG 모드로

출력되어있는 것을 볼수 있다. Junit 은 기본적으로 Log4j 를 사용하기 때문에log4j 설정값이 들어있는 properties 를 패키지 제일 상단에 복사해 넣는다.



만약 log4j.properties 가 없다면 아래와 같은 에러가 날것이다. 그리고 HtmlUnit 에서 출력하는 상세로그를 확인할수 없어 디버그 하기 힘들다.

log4j:WARN No appenders could be found for logger (com.gargoylesoftware.htmlunit.WebClient).

log4j:WARN Please initialize the log4j system properly.



다음 테스트 내용은 브라우저에서 실행할 내용을 단위테스트 함수에서 실행하는 것이다. 보통 브라우저에서 회원가입이나 데이터를 입력해서 submit 을 해야되는 경우 할 때 마다 수많은 입력값을 넣어 테스트를 하고 실패했을 경우 다시 재입력해야되는 귀찮은 작업을 해야한다. 하지만 단위테스트 함수를 만들어 놓고 그 안에 입력값을 고정으로 해서 작업한다면 다시 재입력해야 되는 수고는 덜수 있을 뿐만 아니라 값을 넘기고 난 이후의 비즈니스 로직을 효과적이고 빠르게 테스트 해볼수 있을 것이다


public void testSubmittingForm() throws Exception {               final WebClient webClient = new WebClient();       // WAS 를 띄운다. 테스트 하고자 하는 페이지로 접근하여 데이타를 받아온다       final HtmlPage page1 = webClient.getPage("http://localhost:8080/test.html");       // HTML 에서 form 객체를 가져온다.       final HtmlForm form = page1.getFormByName("myform");             // Button 객체를 가져온다.       final HtmlSubmitInput button = form.getInputByName("button");       // Input text 객체를 가져온다.       final HtmlTextInput textField = form.getInputByName("userid");       textField.setValueAttribute("값변경"); // Input text 값을 변경한다.  

      // 버튼 클릭과 같은 기능을 한다. javascript 함수 호출이나 submit 기능을       // 구현해 놓았다면 그대로 실행될 것이다.       final HtmlPage page2 = button.click(); }

 


 http://mainia.tistory.com/529

 

Posted by 장안동베짱e :