• 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
 
 

自作関数をIDE上で利用するには、 定義した js ファイルを[オプション]→[設定]にある「Selenium Core 拡張スクリプト」で指定する。

user.js

   1  function eachTag(name, attr, value, func) {
   2    var win = selenium.page().getCurrentWindow();
   3    var tags = win.document.getElementsByTagName(name);
   4    for (var i=0; i<tags.length; i++) {
   5      if (tags[i].getAttribute(attr) == value) { func(tags[i]); }
   6    }
   7  }
   8  
   9  function reportErrors() {
  10    eachTag('div', 'class', 'fieldWithErrors' , function(e) {LOG.warn(e.innerHTML);});
  11  }

例:エラー内容のデバッグ表示
コマンド対象
open/users/new
typenamemaiha
clickAndWaitcreate
getEvalreportErrors()

例:ランダムな文字列とか
コマンド対象
open/users/new
typenamemaiha
typepassjavascript{randomWord(8)}

(※ "function randomWord(size)" が user.js に定義済として)

posted by Png maiha on Sun 20 Sep 2009 at 18:44

waitForCondition を使う

waitForCondition(script, timeout)
Arguments:

    * script - the JavaScript snippet to run
    * timeout - a timeout in milliseconds, after which this command will return with an error

停止条件は activeRequestCount で判定する。

例:PrototypeでAjaxリクエストを待つ
コマンド対象
clickfoo_button
waitForConditionselenium.browserbot.getCurrentWindow().Ajax.activeRequestCount == 05000

例:jQueryでAjaxリクエストを待つ
コマンド対象
clickfoo_button
waitForConditionselenium.browserbot.getCurrentWindow().jQuery.active == 05000

参考

  • http://d.hatena.ne.jp/cinquanta/20090501/1241675577
  • http://codelevy.com/2007/11/05/selenium-and-ajax-requests
posted by Png maiha on Thu 17 Sep 2009 at 10:41

「今日の日付」のような動的な値が必要な場合には "javascript{}" を利用する。 同ブロック内部の文字列は実行時に javascript コードとして評価され、 その評価結果が値として利用される。

例:いずれもabcが入力される
コマンド対象
typeval1abc
typeval1javascript{ "abc" }
typeval1javascript{ "ABC".toLowerCase() }

例:今日の日付を入力
コマンド対象
typedatejavascript{ var d=new Date(); d.getFullYear()+"/"+ ... }

posted by Png maiha on Wed 16 Sep 2009 at 19:03
click         ボタンやリンクをクリックする
clickAndWait  クリック後にページ遷移を待つ

例:ログイン(失敗)
コマンド対象
typeusermaiha
typepassxxxxx
clicklogin
verifyTextPresentようこそmaihaさん#ページ遷移が終わってないので失敗する

click を clickAndWait に変更すると成功する

posted by Png maiha on Wed 16 Sep 2009 at 06:46

pause を使う

pause(waitTime)
Arguments:
    * waitTime - the amount of time to sleep (in milliseconds)
Wait for the specified amount of time (in milliseconds)

例:3秒待つ
コマンド対象
pause3000

例:DHTMLの書き換えを待つ
コマンド対象
clicklink=詳細設定を開く
pause200
typesearch_number20

posted by Png maiha on Tue 15 Sep 2009 at 20:54

WWW::Mechanize::Page#images

WWW::Mechanize::Page は、forms, links メソッドでそれぞれの要素の配列が取得できるが、画像(img)を取得するメソッドはまだないので簡易実装。

   1  require 'mechanize'
   2   
   3  WWW::Mechanize::Page.class_eval do
   4    def images
   5      @images ||= search('img').map do |img|
   6        case src = img['src']
   7        when %r{^https?://}
   8          src
   9        else
  10          (uri + src).to_s
  11        end
  12      end.uniq
  13    end
  14  end

forms, links では Page::XXX オブジェクトが返るので、 同様に Page::Image オブジェクトを作成するのが正しい姿であるが、 今はページの画像のURL一覧が欲しいだけなので、割愛。 そこは誰かに任せた。

   1  agent = WWW::Mechanize.new
   2  page  = agent.get('http://blog.s21g.com/')
   3  page.forms.size  # => 1
   4  page.links.size  # => 109
   5  page.images.size # => 17

とりあえず快適!

posted by Png maiha on Fri 28 Aug 2009 at 09:47

sinatra で画像ファイルを扱うためのメモ

下策:直接アクションにベタ書き

[ユースケース] この画像1個だけでいいんです

   1  get '/logo.png' do
   2    content_type :png
   3    send_file "logo.png"
   4  end

中策:パラメータとブロック引数で処理

[ユースケース] images/* に画像が多くてアクション列挙してられない

   1  get '/images/:file.:ext' do |file, ext|
   2    content_type ext
   3    send_file "images/#{file}.#{ext}"
   4  end

上策:Rackに任せる

[ユースケース] 速度、効率的にフロントで捌きたい

   1  use Rack::Static, :urls => ["/images"], :root => "public"

これで Rails/Merb でおなじみの public/images/* を捌く事ができる

posted by Png maiha on Tue 28 Jul 2009 at 18:37

ActiveRecord

   1  class Item < ActiveRecord::Base
   2    set_table_name :xxx_items
   3  end

DataMapper

   1  class Item
   2    include DataMapper::Resource
   3    def self.default_storage_name
   4      :xxx_item
   5    end
   6  end

  • DSLは用意されていないのでクラスメソッドで
  • リソース名なので単数系にしておく

確認

   1  Item.storage_name # => "xxx_items"

posted by Png maiha on Thu 7 May 2009 at 08:11

   1  >> $:.grep(%r{/gems/([^/]+-[0-9\.]+)/lib$}){$1}
   2  => ["addressable-2.0.2", "merb-auth-slice-password-1.0.8.1", "json-1.1.4.1", "extlib-0.9.10", ...

posted by Png maiha on Wed 11 Feb 2009 at 17:33

   1  pdf.start_new_page

オプション
名前説明
:layout利用するレイアウト:landscape
:size大きさ"LEGAL" "A4"
:left_marginマージン左50
:right_marginマージン右50
:top_marginマージン上50
:bototm_marginマージン下50

   1  pdf.start_new_page(:left_margin=>48, :size=>"A4")
   2  pdf.page_count  # => 2

posted by Png maiha on Thu 29 Jan 2009 at 19:29