Selenim IDEを試してみる

PHP
Webサイト作成 TIPS

Seleniumは、主にJavascriptで実装されたWebアプリケーションのテストツールです。FireFoxのアドオンSelenium IDEで、Seleniumのテストケース作成を支援するツールですが、単体でもブラウザー操作を記録・再生するツールとして利用できます。

インストール

下記サイトから、ダウンロードしてインストールできます。
https://addons.mozilla.org/ja/firefox/addon/2079

ブラウザー操作の記録

  1. Firefoxの「ツール」→「Selenium」から、SeleniumIDEを起動します。
  2. SeleniumIDE起動後は、ブラウザー操作を記録するモードになっています。
  3. 適当なサイトを開いて、フォームに何か入力したり、リンクやボタンをクリックすると操作した内容が記録されます。
  4. ブラウザー操作の記録を停止します。
    • 下図の矢印にあるボタンで、ブラウザー操作の記録のオン・オフ切り替わります。

    selenium-ide-record.png

    ブラウザー操作の再生

    1. 「現在のテストケースを実行」ボタンをクリックすると、先ほど記録した操作が自動で再生されます。
      • 下図の矢印にあるボタンが、「現在のテストケースを実行」ボタンです。

      selenium-ide-replay.png

      • Seleniumから派生したもので、Molybdenumというものもあります。 — AG {2010-08-23 (月) 18:21:57}

ScrollViewの子LinearLayoutでheightをmatch_parentにできない

ScrollViewの子のLinearLayoutでheightをmatch_parentにできない時

Androidアプリの画面レイアウトをxmlで編集しているとき、
ScrollViewの入れ子にしてあるLinearLayoutでどうしてもheightをmatch_parentにしたいことがありました。

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </LinearLayout>
 
 </ScrollView>

しかし、子のLinearLayoutでandroid:layout_height=”match_parent”とすると、
「This LinearLayout should use android:layout_height=”wrap_content”」という警告が出ます…
警告を無視してレイアウトの編集を断行しても、heightがmatch_parentになってくれてないことに気付きます(T_T)

結論としてはScrollViewの子のLinearLayoutでは性質上、heightをmatch_parentにすることはできないようです。

なので親のScrollViewをLinearLayout等に変えるか、もしくはmatch_parentにするのを諦めるかという選択になります。

今思うと、ページをスクロールさせるんだからwrap_contentでページの高さを自動調整させるのが普通だろという気がします。
どうしてもmatch_parentにしたかった理由は以下に書きますので興味のある方は読んでみてください。

理由

画面がPortraitの時はスクロールバーを使わず、どんな端末でも画面の左下にボタンを表示させ、画面がLandscapeの時はスクロールバーを使って画面が切れないようにしたかった。

結局match_parentを使うのを諦めたのですが、「横画面にした時だけスクロールバーを表示させる」という手法があると思います。
まだ調べられていませんが、発見し次第追記したいと思います。

※追記(5/29)
画面の向きによってレイアウト変更する方法がありました。
手順↓

プロジェクトのresの中に「layout-land」というフォルダを作り、そのフォルダ内にLandscapeの時用のxmlファイルを作ります。
尚、Landscape用のxmlファイルの名前は、「layout」フォルダに入っている該当のxmlファイルと同じにします。

以上でとても簡単に問題が解決できました..!

by 芦野輝明
twitter→https://twitter.com/teriyakiegg

Android

ScrollView can host only one direct child

Android 画面がスクロールしない

ScrollView can host only one direct child

Androidの画面をスクロールさせる、ScrollViewを利用すると、上記のエラーが発生してしまうことがあります。
ScrollViewの中には、子要素を一つしか入れられないのです。

でも、TextViewとかLinearLayoutとか、いっぱい子要素あるじゃん…とか思いますが、要は一つのLinearLayoutで囲んであげれば解決です。

 例)
 <ScrollView
        android:id="@+id/ScrollView01"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
 
     <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:baselineAligned="false"
            android:gravity="center_horizontal"
            android:orientation="vertical" >
             <TextView
                android:id="@+id/explanation"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:text="@string/account_explanation"
                android:textColor="@color/green_text" >
            </TextView>
           …以下中身
      </LinearLayout>
 </ScrollView>
 

Scalatra 2.3でスタンドアローン版jarをビルドする

Scala

Scalatraのスタンドアローン版jarのビルドについは下記ガイドが参考になりますが、sbt-assemblyプラグインの組み込みかたが省略されています。
http://www.scalatra.org/2.3/guides/deployment/standalone.html

sbt-assemblyの組み込み手順は下記の通りです。

  • src/main/scala/com/example/JettyLauncher.scala

ガイド通り、埋め込みJettyを起動するobjcet JettyLauncherを追加します。

  • project/plugins.sbt

plugins.sbtに下記行を追加します。

 addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")

変更後のplugins.sbtの例は下記の通りです。

 addSbtPlugin("com.mojolly.scalate" % "xsbt-scalate-generator" % "0.5.0")
 
 addSbtPlugin("org.scalatra.sbt" % "scalatra-sbt" % "0.3.5")
 
 addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
  • project/build.scala

下記パッケージのインポートを追加します

 import sbtassembly.Plugin._
 import AssemblyKeys._

Projectの引数に下記を追加します。(scalatraSettingsの後ろなど)

 ++assemblySettings 

するとsettingsの1行目は下記のようになります。

 settings = ScalatraPlugin.scalatraWithJRebel ++ scalateSettings ++ assemblySettings ++ Seq(

libraryDependanciesのjetty-webappの”container”を”container;compile”に置き換えます。

 "org.eclipse.jetty" % "jetty-webapp" % "9.1.3.v20140225" % "container;compile",

変更後のbuild.scalaの例は下記の通りです。

 import sbt._
 import Keys._
 import org.scalatra.sbt._
 import org.scalatra.sbt.PluginKeys._
 import com.mojolly.scalate.ScalatePlugin._
 import ScalateKeys._
 import sbtassembly.Plugin._
 import AssemblyKeys._
 
 object MyScalatraWebAppBuild extends Build {
   val Organization = "com.example"
   val Name = "My Scalatra Web App"
   val Version = "0.1.0-SNAPSHOT"
   val ScalaVersion = "2.11.1"
   val ScalatraVersion = "2.3.0"
 
   lazy val project = Project (
     "my-scalatra-web-app",
     file("."),
     settings = ScalatraPlugin.scalatraWithJRebel ++ scalateSettings ++ assemblySettings ++ Seq(
       organization := Organization,
       name := Name,
       version := Version,
       scalaVersion := ScalaVersion,
       resolvers += Classpaths.typesafeReleases,
       libraryDependencies ++= Seq(
         "org.scalatra" %% "scalatra" % ScalatraVersion,
         "org.scalatra" %% "scalatra-scalate" % ScalatraVersion,
         "org.scalatra" %% "scalatra-specs2" % ScalatraVersion % "test",
         "ch.qos.logback" % "logback-classic" % "1.0.6" % "runtime",
         "org.eclipse.jetty" % "jetty-webapp" % "9.1.3.v20140225" % "container;compile",
         "org.eclipse.jetty" % "jetty-plus" % "9.1.3.v20140225" % "container",
         "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar")),
         "org.scalatra" %% "scalatra-json" % "2.3.0",
       ),
       scalateTemplateConfig in Compile <<= (sourceDirectory in Compile){ base =>
         Seq(
           TemplateConfig(
             base / "webapp" / "WEB-INF" / "templates",
             Seq.empty,  /* default imports should be added here */
             Seq(
               Binding("context", "_root_.org.scalatra.scalate.ScalatraRenderContext", importMembers = true, isImplicit = true)
             ),  /* add extra bindings here */
             Some("templates")
           )
         )
       }
     )
   )
 }

これで、jettyを埋め込んだスタンドアローン版をビルドできます。

 sbt clean assembly