블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2011.07.25 22:02

[ Perl/TRunner ] Selenium Core + Plack -> Smolder

TRunner
View more presentations from Jeen Lee

2011/07/15 - [IT/Perl] - [ Perl/Smolder ] Web-based Continuous Integration Smoke Server

 지난번 Smolder 에 이어서 회사 사내 세미나에서 발표했던 TRunner 입니다.
 TRunner 는 뭐 특별한 게 아니라 이미 기존에 있던 모든 것들을 뭉뚱그려놓은 것입니다.

 기본적으로 Dancer 상에서 Selenium Core 에서 사용하는 기본적인 js 스태틱 파일들을 올려놓은 상태에서, Selenium Core 의 테스트 결과를 Smolder 로 날릴 수 있게끔 하는 것입니다.

  이때 Smolder 는 TAP 형식만을 받으니, Selenium Core 의 테스트 결과를 이래저래 슥샥슥샥 만지작거릴 필요도 있기도 하죠. :-)

  Selenium Core 의 정적인 기능을 동적인 페이지 위에 올리고, 필요한 부분에는 selenium-core.js 를 직접 만지며 수정도 하구요.

  Selenium IDE 에서 뽑아내는 Test Suite/Case 세트를 TRunner 용으로 YAML 로 바꿔서 읽어들이게끔 하구요.

  기본적인 아이디어는 용사장(a.k.a @y0ngbin) 으로부터 얻어서 구현하고... 기본기능 구현 뒤 미비한 점은 @aanoaa , @y0ngbin  두 분이 추가로 조정해주셨습니다.

  하고자 하는 것은 간단하게 Plack::Builder 를 통해서 어떤 Plack 기반의 웹어플이면 쉽게 Selenium Core 와 이 결과를 전송해서 Smolder 로 꾸준히 관리할 수 있게끔하는 그런 것이죠.

 
  보통 서버 프로그램들의 지속적인 유닛테스트처럼 브라우저단의 UI 나 기타 js 움직임등에 대해서도 지속적으로 체크해서 관리하자라는 게 모토입니다.

  각 브라우저/ OS 는 Selenium Core 의 결과 전송시의 Request Header 의 UserAgent 를 통해서 확인할 수 있으니, 이걸 Smolder 의 Platform / Architecture 로 대입시켜보는 것입니다.

  순수한 Silex Product 라서 다른 곳에서 쉽게 사용했으면 좋겠는데(Perl 쓰는...)... 
신고
IT 2008.12.09 15:07

[ Firefox, Selenium ] 그림파일은 읽지 않게 해줘요.

  난관에 봉착하고 그 난관을 넘어섰을 때 어떤 짜릿함을 느낀다고 할까요. 끙끙 앓으면서 문제를 해결했을 때의 그 참맛이라고 할까요.
 
  Selenium 을 Mechanize 로 대신 쓰는 이유는 Mechanize 자체는 Java script 를 해석할 수 없기 때문이라고 했습니다. Selenium 자체는 브라우저에 의존하기 때문에 브라우저에서 JS 로 컨트롤할 수 있는 부분은 거의 모든 부분을 컨트롤 할 수 있죠.
 하지만 그만큼 쓸데없는 연결이 발생하게 마련입니다. 처리하는 중에 쓸데없이 그림 파일을 읽을 필요도 없거니와, 그거 읽는 데 소비할 시간이 아깝다는 것이죠.

그림1. Firefox 환경설정 - 내용


 물론 Firefox 설정화면에서 위의 "그림 자동으로 읽기"의 체크를 해제하면 그림은 읽지 않게 할 수 있습니다. 하지만 Selenium 은 매번 실행시에 임시 profile 을 만들고 그것을 사용하기 때문에 기존 브라우저 설정을 그대로 적용할 수는 없습니다.

2008/11/19 - [IT] - [ Selenium ] Selenium RC 를 사용해보자. II

 위의 포스트에서도 소개했듯이, 그럴때는 Selenium 의 독자적인 profile 을 준비해야합니다.  임시 profile 을 생성할 시에 이 profile 을 우선적용하는 것이지요. 그럼 "그림 자동으로 읽기"에 관한 설정 정보는 어떤 것일 까요?


  URL 입력창에 about:config 로 들어가서 image 라는 설정이름을 가진 것들 중에 그럴 듯한 것을 훑어봤습니다. 그리고 설정화면에서 "그림 자동으로 읽기"를 해제하면 permissions.default.image 가 2로 바뀌죠.
  그럼 이것을 user preference java script 에 추가합니다.

  user_pref("permissions.default.image", 2);


  하지만 문제가 생겼습니다. 대상이 되는 서비스는 img 태그에 그림만을 지정한 것이 아니라 어떤 백그라운드 처리를 위해서 몇가지 img 태그에 그림파일이 아닌 url 이 적혀 있었던 것이었습니다. 다행히 그림용 URL 과는 달리 이런 URL 은 domain 이름부터가 달랐습니다.
  이 경우는 <그림 1>의 "그림 자동으로 읽기" 의 "예외목록..." 버튼을 누르면 설정이 가능합니다.
하지만 이 설정의 경우에는 about:config 에서 아무리 찾아봐도 등장하지 않았습니다. 그래서 찾아본 결과, Firefox 의 Profile Folder 의 Hostperm.1 파일에서 관리하고 있다고 합니다. 아래의 URL 을 참고해주세요.

  Profile Folder : http://kb.mozillazine.org/Profile_folder
  Hostperm.1   : http://kb.mozillazine.org/Hostperm.1

  하지만 profile folder 를 뒤져봐도 hostperm.1 이라는 파일은 어디에 있는 지 안보입니다. 다시 찾아본 결과 이에 대한 설정은 profile folder 의 permissions.sqlite 에서 관리하고 있다고 합니다. 일반 텍스트 파일도 아니고 SQLite 라니... 일단 이 파일을 Selenium 의 Firefox Profile 디렉토리에 복사하고 내용을 보도록 하겠습니다.

  sqlite3 permissions.sqlite

  해서 내용을 보면, permissions.sqlite DB 에는 moz_hosts 라는 테이블 하나 뿐입니다. 테이블 구성은 id, host, type, permission 이 있는데요. 위의 Hostperm.1 을 참고해서 다음처럼 등록했습니다.

  INSERT INTO moz_hosts VALUES(1, 'image.blahblah.net', 'image', 2);
  INSERT INTO moz_hoss VALUES(1, 'image2.blahblah.net', 'image', 2);
 
  그리고 Selenium 을 돌려서 해당 사이트에서 확인한 결과 image.blahblah.net 과 image2.blahblah.net 이라는 도메인을 가진 그림파일은 읽어오지 않게 되었습니다.
  그림 파일을 읽어오지 않으니, Selenium 으로 하는 작업 시간도 어느정도 단축할 수 있습니다. 특별히 그림을 판독하는 기능도 없거니와, 그림이 이건지 저건지 알 필요도 없으니까요.

  여기서 대전제를 먼저 쓰는 것을 잊어버렸는데요. Selenium 은 disk cache 를 사용할 수 없습니다. cache 를 사용할 수 있다면 여러번의 작업시 매번 똑같은 사이트를 들락날락 거리는 데 이미지를 매번 읽을 필요는 없겠죠. 하지만 memory cache 는 사용할 수 있습니다. 한번의 작업에 같은 사이트를 들락날락 거릴때는 cache 를 사용할 수 있죠. 하지만 작업이 끝나면 그 cache 는 지워져버리지만요.

  Selenium 을 통해서 Firefox 의 세세한 부분까지 알게되니(라고 쓰고 '알아야 한다니' 라고 읽습니다) .. 참...
  아무튼 사실 Selenium의 이야기를 가장한 Firefox 의 이야기였습니다.
신고
IT/Perl 2008.12.04 17:05

[ Perl, PHP ] Job Queue 를 통해 친해지길 바래?


  현재 진행중인 프로젝트의 구성에서... Web 은 PHP 로 다른 사람에 의해 만들어 지고 있고, 백그라운드에서 작동하는 녀석은 제가 Perl 로 쓰고 있습니다.

2008/11/18 - [IT] - [ Selenium ] 웹서비스 테스트 자동화와는 별 상관없는 작업을 위해...
2008/11/18 - [IT] - [ Selenium ] Selenium RC 를 사용해보자. I
2008/11/19 - [IT] - [ Selenium ] Selenium RC 를 사용해보자. II

  이전 Selenium 을 소개했을 때, Test용이 아닌 용도로 사용한다고 했던 게 이것을 위해서 인데요. 웹에서 어떤 파라메터를 날리면 Selenium 쪽에서 그 파라메터를 받아서 백그라운드에서 열심히 달리는 구조입니다.
  그럼 웹에서 어떻게 Selenium 쪽으로 파라메터를 넘겨줄까요?
  제일 간단하게 생각할 수 있는 것이...
  Web 에서 직접 Selenium 을 기동하는 것, 하지만 한번 움직이면 Selenium 으로 5초 이상의 딜레이가 생기는 것은 어쩔 수 없겠죠. Web 에서 이 5초이상 이란 시간은 참 기다려주기 애매할 수 있습니다. 심하면 30초까지 생각할 수 있으니까요.
  다른 방법이 있습니다. 좀 하드코어한 방식으로는 PHP에서 system 으로 ...

  system('perl selenium-work-1.pl doSomething saillinux see fate_stay_night &');

  이렇게 날리는 방법...

  하지만 이런 식이라면 제대로된 파라메터를 날리기 힘듭니다. 예를들어, 다단계 배열이나 해쉬(연상배열) 같은 것을 어떻게 넘기느냐 하면 좀 애매하죠. 뭐 더 하드코어하게 간다면... 매번 파라메터를 JSON 으로 변환해서 이걸 파일로 덤프합니다. 그리고 파일이름을 지정해줄 수도 있겠죠?
 ...
 ...
 설마 이렇게 할 것이라고 생각하는 것은 아니시겠죠?

 제 해법은 Job Queue 입니다. memcached와 Live Journal 의 개발자로 유명하며, 현재 Perl 용 Google App Engine 을 만들고 있는 Brad Fitzpatrick의 Gearman 이 제 눈에 끌렸습니다. TheSchwartz 같은 경우도 생각해 볼 만하지만, TheSchwartz 의 경우라면 전용 DB 를 필요로합니다. 거기에 3-5초 정도의 작업 딜레이도 발생하게 됩니다(3-5초 정도에 한번씩 매번 DB 에 Job 이 등록되었는 지를 확인하기 때문이죠).
  Gearman 은 Client 에서 Job 을 날림과 동시에 Worker 가 움직이게 됩니다.

  Gearman 은 어떻게 입수하느냐. 당연히 CPAN 입니다.
  sudo cpan -i Gearman::Server
  sudo cpan -i Gearman::Client
  sudo cpan -i JSON

  이렇게 cpan 모듈을 인스톨합니다. 중간 중간에 나오는 의존모듈도 같이 인스톨해주시면 됩니다.  Gearman::Server 를 설치하면 gearmand 라는 gearman 데몬용 파일을 실행할 수 있습니다.

  sudo gearmand --daemon --pidfile=/tmp/gearmand.pid --debug=1

  프로세스 리스트를 확인하시면 gearmand 는 데몬으로 작동하는 것을 확인할 수 있습니다.
  그리고 Job 을 날릴 PHP 쪽도 Gearman 라이브러리를 설치해야 합니다. PHP 의 pear 로 간단하게 인스톨 할 수 있습니다.
 
   sudo pear upgrade http://bugs.joestump.net/code/Net_Gearman/Net_Gearman-0.0.4.tgz

  Net_Gearman 의 설치가 끝났다면 php 쪽의 소스는 이와 같습니다.
  client.php
  1. <?php
  2.  require_once 'Net/Gearman/Client.php';
  3.  $data = array( 'who' => 'saillinux', 'what' => 'fate_stay_night', how => 'haak' );
  4.  $pid = getmypid();
  5.  $set = new Net_Gearman_Set();
  6.  $task = new Net_Gearman_Task( 'job', $data, $pid, Net_Gearman_Task::JOB_BACKGROUND);
  7.  $client = new Net_Gearman_Client(array('localhost'));
  8.  $client->runSet($set);
  9. ?>

  짧게 코드를 설명하자면... $data 에 위와 같은 연상배열을 넣고, 6번째에 Task 를 추가합니다.   
  Net_Gearman_Task 에서 첫번째 인수는 function 이름입니다. 어떤 놈에게 일을 시킬까 하는 것인데, 물론 이 function 은 Worker 쪽에 정의되어 있어야 합니다.
  두번째 인수는 Worker 에 넘길 인수입니다. 이 인수는 JSON 으로 파싱해서 넘어가게 됩니다.
  7번째 줄에서 Net_Gearman_Client에서 배열에 localhost 를 넣었습니다. Worker 는 복수의 서버를 지정할 수 있습니다.
  그외에 대해선 문서를 참고하세요.

  위와 같은 Job 이 client 쪽에서 날아온다면, 이것을 받을 Worker 가 기동중이어야 합니다. 그리고 Worker는 아래와 같은 코드로 이루어져 있습니다.
  worker.pl
  1. use strict;
  2. use warnings;
  3. use Gearman::Worker;
  4. use JSON;
  5.  
  6. my $worker = Gearman::Worker->new;
  7. $worker->job_servers(qw/localhost/);
  8. $worker->register_function(
  9.   job => sub {
  10.     my $job = shift;
  11.     my $args = from_json( $job->arg );
  12.     print $args->{who}." ".$args->{how}." ".$args->{what}."¥n";
  13.   });
  14. $worker->work while 1;

  위의 client 에서 job 이라는 function 으로 job 을 날린 것을 $worker->register_function 으로 등록된 job 이라는 function 에서 처리합니다. JSON 으로 넘어온다고 했으니 넘어온 JSON($job->arg)을 해석합니다. 그리고 받은 인수를 찍어냅니다.

  일단 하나의 터미널에서 worker.pl 을 실행시키고, 다른 터미널에서 client 를 실행시킵니다. 그러면 client 에서 job 이 worker 로 넘어가서, worker 는 그 job 에 맞게 정의된 행동을 수행하겠죠.

  그럼 예외의 경우를 살펴보도록 하자면...
  client 에서 job 은 계속 날리는 데, worker 는 죽어있는 상태입니다(이런 상황이 걱정된다면 worker 를 여러개 띄워놓는 것도 한 방법이 될 수도 있습니다). 이렇게 되면 일하는 놈이 없으니까 당연히 일은 못하게 됩니다. job 은 계속 queue 에 쌓여 있겠죠. 그리고 worker 가 살아난다면, 쌓여있는 job 을 하나씩 처리해나가게 됩니다. gearmand 가 어느 정도 큐에 담아둘 수 있는 지는 잘 모르겠습니다. 메모리 여유분 만큼이려나요?
  그럼 gearmand 데몬 자체가 job 을 잔뜩 쌓아놓고 있는데 죽어버렸다면 어떻게 될까요? 이경우는 queue 에 쌓인 job 은 소실됩니다. 그래서 불안하시다면, TheSchwartz 나 Q4M 을 써서, DB 에 job 을 넣는 형식을 쓰는 것도 선택중의 하나가 되겠죠.
  (피드백 주신 a3r0/Luz_Luna님++)

  뭐, 제가 하려는 건 Selenium Agent 를 가동하기 위해 적당한 인수를 받아서 넘겨주는 것 밖에 없으니까요.
  아무튼 이런 식으로 Perl 과 PHP 간의 유대관계를... 쿨럭.. 아니, 그것보다 이런 식으로 Web 상에서 처리하기에는 좀 지지부진한 처리를 Job Queue 를 통해서 해결해보시는 것은 어떠실런지요?
  뭐 관리의 문제를 제외한다면(제외하기 힘들겠지만)... 여러명이 각자의 특색에 맞는 언어를 선택하는 것은 나쁘지 않다고 생각합니다. 저마다의 개성이겠죠. (물론 사람에 따라서 나쁘다고 생각하실 분도 있으시겠죠...;;)

  http://ido.nu/kuma/2008/01/20/implemented-reblogging-server-with-gearman/
 
  위의 링크를 참고로 했습니다.
신고
IT 2008.11.26 14:33

[ Selenium ] Selenium AES, 지속적인 회귀테스트를 위해서...


  Selenium AES 는 openqa 에서 만든 것은 아니고, 일본의 onozaty 라는 프로그래머가 Selenium RC 를 개량한 것이 Selenium Auto Exec Server입니다. 기존 Selenium RC 의 기능에서 추가로 자동으로 실행된다는 것인데요. config 에서 특정시간을 지정해서 매일 그 시간에 테스트를 수행합니다. SMTP 계정을 지정하는 것으로 테스트 결과를 메일로 통보받을 수도 있습니다.

  Selenium 으로 테스트 케이스를 만들고, 스크립트로 이리저리 굴리면서 cron 으로 돌리고.. 해당결과는 mail로 보내는 스크립트를 하마터면 쓸 뻔한 때에 이와 같은 것을 발견해서 기쁘기 그지 없습니다. Selenium RC 를 개량한 만큼, 이전의 Firefox 3 를 쓰기위한 패치를 쓴다거나 할 필요도 없습니다. 이미 전부 패치된 상태이기 때문이죠. 기존의 Selenium RC 에서 할 수 있었던 것도 모두 가능하구요.

 Windows, Linux, Mac OSX 에서 사용이 가능하구요. Windows 같은 경우는 IE, FF 를 동시에 테스트할 수 있겠네요. 저같은 경우는 Ubuntu Desktop 에서 Firefox 만을 대상으로 했습니다.

 우선 Selenium AES 의 기능을 정리하자면 아래와 같습니다.
  • 테스트 정기실행
  • Subversion 연계
  • 테스트 결과를 메일로 송신
  • 브라우저 상에서 테스트 상황 확인
  • 테스트 실행 API 제공
  • HTMLSuite 복수지정
  • HTMLSuite 자동작성
  • 복수 브라우저 실행
 Selenium AES 는 아래에서 다운로드 가능합니다.

http://code.google.com/p/selenium-extension/
http://selenium-extension.googlecode.com/files/selenium-autoexec-server-0.3-dist.zip

위의 zip 파일을 받아서 풀어보면 setting.properties 에서 설정정보를 추가합니다.
browser=*firefox /usr/lib/firefox-3.0.4/firefox
startURL=http://www.google.com/                                                                                                                           

autoExecTime=13:24

#suiteRepo=http://192.168.0.1/svn/trunk/selenium                                                                         
#suiteRepoUsername=                                                                                                                                        
#suiteRepoPassword=                                                                                                                                        
#suiteDir=
mail.host=smtp.naver.com
#mail.port=465                                                                                                                                             
#mail.ssl=true                                                                                                                                             
mail.username=username
mail.password=password
mail.to=mail@to.com
mail.from=admin@naver.com

 위의 browser, startURL, autoExecTime 은 필수입니다. browser 에는 "*firefox, *iexplorer" 처럼 복수의 브라우저를 지정해줄 수 있죠. 전 Ubuntu 데스크톱에서 Firefox 만을 사용하기에 이처럼 지정했습니다.
 startURL 은 Test 를 수행할 대상 URL 을 지정하는데요. 이러면 하나의 URL 만을 대상으로 테스트할 수 있는 건 아닌가 하는 생각을 합니다. 여러 서비스를 테스트해야하는 데, 이게 가능한지는 모르겠군요.
 autoExecTime 은 매번 자동실행되는 시간을 지정합니다. 위처럼 지정되어 있다면 Selenium AES 를 작동시킬 때에
14:01:35.057 INFO - Auto exec first time: Thu Nov 27 13:24:00 JST 2008
 이처럼 뜹니다. 이미 지나가버렸다면 다음 날이 대상이 되겠구요. Selenium AES 가 돌아가면 이 시간이 되면 매번 실행이 되겠죠? 하루에 여러번 테스트를 하고 싶을 때는 어떻게 할까요? 음.. 회귀테스트를 그렇게 자주 해야하는 것인가요? 아마 아니될거라고 생각합니다. :-)
 
  http://localhost:4444/selenium-server/autoexec

 에 접속하면 웹 페이지에서 테스트를 수행할 수 있습니다.
  "Run Test" 버튼을 누르면 테스트가 작동하고, 이 페이지는 30초에 한번씩 갱신되고.. 그때에 따라서 페이지의 내용이 바뀌게 됩니다.
 
 여기에서 실행하는 테스트들은 mail 로 전송되지 않고, autoExecTime 에서 지정한 시간에 작동하는 테스트시에 그 결과를 메일로 보내주게 됩니다. 물론 settign.properties 에서 mail.* 부분이 설정되어 있어야 되겠죠.
이렇게 테스트 결과와 함께 동봉된 result.zip 에는 자세한 테스트 항목과 그 결과들을 볼 수 있습니다.

 suiteRepo* 를 지정했을 때는 테스트 실행시에 지정 리포지트리에서 가장 최신 리비젼 파일을 얻어서 suiteDir에 옮겨서 테스트를 실행합니다. suteDir 의 기본 디렉토리는 [Selenium-AES]/suite/ 로 지정되어 있습니다(이미 테스트용 Suite 가 있을 겁니다).

 이외에도 HTTP 리퀘스트로 테스트를 실행합니다.

 http://localhost:4444/selenium-server/autoexec/command/run

 그러면 그 결과를 반환해주겠죠. Query 에 type=json 을 붙이면 JSON 형식으로 결과가 반환되게 됩니다.

 그럼 Test 를 정의한 HTMLSuite 는 어떻게 만들까요? 지난번에 소개해드릴 Selenium IDE 로 액션을 녹화해서 거기에서 나온 TestSuite 를 HTML 로 뽑아냅니다. 이때의 파일이름에 "case", "Case" 가 포함되면 됩니다. 복수의 HTMLSuite 를 만들기 위해서는 파일이름에 "suite", "Suite" 가 포함되어야 합니다.  [Selenium-AES]/suite/ 디렉토리에 샘플로 제공된 파일이 있으니 쉽게 참고하실 수 있을 겁니다.

  http://www.enjoyxstudy.com/selenium/autoexec/

 에서 제가 사용하려는 부분만을 간단하게 뽑아서 소개했습니다. 자세한 내용은 여기에서 확인하시면 되겠습니다.
신고
IT 2008.11.19 20:18

[ Selenium ] Selenium RC 를 사용해보자. II


 애초 Selenium 사용목적은 Test 목적이 아니었다 라는 것은 처음부터 말해왔습니다.
 Agent 로 사용할 Selenium 에서 필요한 기능은 바로 "파일 다운로드"인데요. 하지만 브라우저 자체 설정에서 매번 다운로드 매니저를 띄우고... javascript 의 confirm 이나 alert 이 아닌 대화창은 Selenium 으로 조작이 불가능하더군요.

 결국은 Firefox 설정을 만지는 수 밖에 없겠다 싶어서 [ 환경설정 ] 에서 뭐가 없나 찾아봤지만 뭐 별다른 것없어서... 결국은 about:config 로 직접 수정해보기로 했습니다.

  - http://kb.mozillazine.org/About:config_entries

 Firefox 에서 about:config 의 reference 를 보고 그럴 듯한 것들을 찾아서 바꿔보았습니다. browser.download.* 이 그럴듯한 것으로 보이길래, 해당 값들을 적당하게 수정해서 다운로드 하니.. 과연 다운로드 매니저가 안뜨더군요.

 그래서 Selenium RC Server 의 Firefox 에서 위에서 한 설정을 그대로 씌우고 작동을 했는데...
 결과는 안먹히덥니다. Selenium RC 에서 작동한 firefox 는 변경된 설정을 따르지 않는지 어떤지 잘 모르겠습니다. 뭔가 자기 나름대로의 기본값이 있나본데요.

 결국 검색해서 찾아낸 것은 -firefoxProfileTemplate 라는 옵션입니다.
 
 * 우선은, profile 이라는 디렉토리를 만들고,
 * 그리고 prefs.js 라는 파일을 만들어서, 변경할 옵션들을 모조리 거기에 잡아넣습니다.

 설정값은 아래의 링크를 참고했습니다.

 - http://clearspace.seleniumhq.org/message/31350

 그런데 위의 링크의 설정으로도 다운로드 매니저가 나오더군요. 그래서 다시 about:config 를 뒤지면서 그럴 듯한 놈을 찾아서 바꿔보았습니다. 제가 사용할 설정은 다음과 같습니다.

 * profile/prefs.js
user_pref("browser.download.dir", "/home/leejj/Desktop");
user_pref("browser.download.downloadDir", "/home/leejj/Desktop");
user_pref("browser.download.folderList", 2);
user_pref("browser.download.manager.showWhenStarting", false);
user_pref("browser.download.manager.useWindow", false);
user_pref("browser.startup.homepage_override.mstone", "ignore");

 위의 설정들이 어떤 내용인가에 대해서는 언급하지 않겠습니다. 위의 about:config reference 를 참고해주세요.

 이게 끝이 아닙니다. 방금전에 다시 해봤는데 안되더군요; 아무튼 원인은 mimeType.rdf 를 설정해주어야 하더군요.
 일반적으로 다운로드를 위해서 링크나 버튼을 클릭하면 아래와 같은 다운로드 매니저가 등장합니다.
[다시 묻지 않음]을 선택하면 [환경설정] 의 프로그램 탭에 등록되게 됩니다. 이 경우에는 "파일 저장"으로 등록이 되죠.
 

  [환경설정] - [프로그램] 탭에서는 위의 다운로드 매니저에서 등록한 파일 형식 Comma Separated Vars 는 파일저장으로 실행이 등록 되어 있습니다.

  그럼 이렇게 지정한 mime-type 을 mimeType.rdf 파일로 적어줘야할 필요성이 있습니다.
  Firefox 환경설정은 Selenium RC Server(여기에서는 Ubuntu) 에서 /etc/firefox-3.0/profile 에 있습니다.
 하지만 여기에서는 위의 형식들이 등록되어 있지 않습니다. 어디에 등록되어 있는 지 몰라서, 생각을 바꾸기로 했습니다.

  Selenium RC Server 는 매번 실행시에 브라우저의 커스텀 프로파일을 생성합니다. 클라이언트에서 RC 를 움직여서 Firefox 가 움직이고 있을 때 /tmp/customProfile****************/ 이라는 디렉토리가 생기죠. RC 에 의해 실행되고 있는 Firefox 에서 위처럼 파일을 다운로드 할때, [ 파일 저장 ]으로 하고 [ 다시 묻지 않음 ] 을 클릭하니... 그곳에 있는 mimeType.rdf 파일의 사이즈가 바뀌더군요.
  그래서 재빨리 그곳에 있는 mimeType.rdf 를 퍼와서 위의 prefs.js 가 있는 디렉토리와 같은 디렉토리에 넣어줍니다.

 * CSV 파일을 항상 저장하도록 설정하는 mimeType.rdf
<?xml version="1.0"?>
<RDF:RDF xmlns:NC="http://home.netscape.com/NC-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <RDF:Description RDF:about="urn:mimetype:text/csv"
                   NC:value="text/csv"
                   NC:editable="true"
                   NC:fileExtensions="csv"
                   NC:description="CSV document">
    <NC:handlerProp RDF:resource="urn:mimetype:handler:text/csv"/>
  </RDF:Description>
  <RDF:Description RDF:about="urn:mimetype:externalApplication:text/csv"
                   NC:prettyName=""
                   NC:path="" />
  <RDF:Seq RDF:about="urn:mimetypes:root">
    <RDF:li RDF:resource="urn:mimetype:text/csv"/>
  </RDF:Seq>
  <RDF:Description RDF:about="urn:mimetype:handler:text/csv"
                   NC:alwaysAsk="false"
                   NC:saveToDisk="true">
    <NC:externalApplication RDF:resource="urn:mimetype:externalApplication:text/csv"/>
  </RDF:Description>
</RDF:RDF>

 물론 다운로드 해야할 파일 형식이 다른 것이 있다면 이렇게 추가해주어야할 것입니다.
 
 그리고 selenium-server 를 다시 띄워줄 때는 위에서 말한 -firefoxProfileTemplate 를 지정해줘야 합니다. 인수는 파일이 아닌 profile 디렉토리를 지정합니다.

 $ java -jar selenium-server.jar -firefoxProfileTemplate profile

 그리고 어떤 다운로드를 위한 버튼을 클릭하는 케이스를 IDE 로 만들어서 Client 코드로 실행합니다. 그러니 Selenium RC Server 의 Firefox 에서는 방금전과 같은 다운로드 매니저는 일절 출몰하지 않고, 그대로 진행되더군요. Download Directory 로 설정한 /home/leejj/Desktop 에서는 다운로드된 파일이 제대로 박혀있습니다.

 뭔가 이러면 되겠지 하던 게 제대로 안먹고.. 거기에 가장 치명적인 오타때문에 몇 십분을 허비한 것 같습니다. 아무튼 이걸로 원하는 Agent 를 위한 기능은 다 구현할 수 있겠다는 생각으로 맘이 편안해지기는 합니다. (뭐 당연히 구현할 때도 쩔쩔댈 일이 있을지도 모르겠지만요...)
신고
IT 2008.11.18 11:16

[ Selenium ] 웹서비스 테스트 자동화와는 별 상관없는 작업을 위해...


  Selenium 은 이미 2년전 쯤에 한번 크게 주목받은 웹 테스트 자동화 툴입니다. 요즘도 몇몇 군데에서는 사용하고  있는 곳도 있는데... 제 주위의 개발자들 사이에서는 "이름만 들어봤다" 정도더군요.

** 추기
** 야후에서는 Selenium 으로 테스트 많이 한다더군요.(salelinux 님 曰)
** 사실 Google Video 에서 Selenium 검색해도 많은 강의가 나와있기도 합니다.

  사실 이번에 이 Selenium 을 사용하게 된 계기는 웹 테스트 자동화 라는 타이틀과는 전혀 별개의 동작을 위해서입니다. Test 가 목적이 아니라, 실제로 작업을 수행하는 Agent 의 기능에 주목을 한 것이죠.

  그럴려면 WWW::Mechanize 같은 것으로도 충분하지 않느냐? 라고 하시기도 하실테지만... WWW::Mechanize 같은 경우에는 JavaScript 동작에서는 어떻게 할 수 없다는 단점이 있어서 입니다.

  아무튼 오늘은 간단하게 Selenium IDE 만을 사용해보았습니다. Selenium IDE 란, Firefox 의 확장 플러그인으로 제공되며, 위에서 언급한 웹 테스트를 위한 툴입니다.

- http://release.openqa.org/selenium-ide/1.0-beta-2/selenium-ide-1.0-beta-2.xpi

  위의 URL 에서 확장 플러그인을 인스톨하고, FF 를 재기동합니다.(IE도 있지만, 제 환경 상 FF 기준으로 가겠습니다.)

  그리고 [도구] - [ Selenium IDE ] 를 실행하면 아래와 같은 화면이 나옵니다.

  뭐, 자세한 튜토리얼은...

  - http://wiki.seleniumhq.org/download/attachments/400/Selenium+IDE.swf?version=1

  이것을 보고 대강 이해했습니다. 작업을 녹화해서 간편하게 커맨드와 타입/값을 지정하고, 녹화한 작업을 다시한번 수행할 수 있습니다. 이렇게 만든 작업은 HTML 로 Export 가 가능하구요(HTML 이 Selenium 포맷인 듯...).
일단 처음 사용해보고는 이것저것 가능할 것 같다라고 생각하고 있습니다.

  일단은 그래서 Selenium IDE 로 "사내 스케쥴 관리" 서비스에서 작동 테스트를 해봤습니다. 위의 값들은 레코딩하면서 얻어낸 값이구요. 레코딩이 끝나고 재생을 시키면 레코딩한 순서대로 작업이 진행되고, 어떤 커맨드들로 그 값이 존재하느냐 라는 등등의 테스트 판정을 할 수 있었습니다. 작업분기는 어떻게 처리되는 지 모르겠군요. 안되는 듯 합니다만...

  ** 추기
  ** Selenium IDE 가 화면의 전환을 기다려주지 않고 혼자서 움직이면서 Element 를 못 찾겠느니 하는 얘기를 할 때가 있습니다. 그럴때는 command 를 click => clickAndwait 로 바꿔서 조금씩 기다려주면 되더군요. 참고하시기 바랍니다.

  Selenium-RC 라는 것을 사용해서 원격에서 클라이언트를 통해서 컨트롤이 가능하다고도 하네요.
  (.NET, JAVA, PHP, Perl 등을 지원한다고 하네요. 전 Perl 이 중요하니... 그걸로 되었다고 생각...;)
  이런 언어들을 사용해서 보다 자세한 작업 분기 및 여러가지 활용방안이 생겨나겠죠.

  아무튼 웹서비스 테스트와는 전혀 관계없이, 순전히 Agent 로 사용하는 목적은 복수의 웹서비스에서의 주문관련 처리를 한 곳에서 관리하기 위해 Agent로 사용하는 것입니다. 얼마만큼 생각대로 움직여 줄지, 혹은 제가 움직일 수 있을 지 아직은 모르겠지만...  뭐 어떻게든 되겠죠 뭐.
신고
TOTAL 464,492 TODAY 54

티스토리 툴바