genpaku's footprint

忘れてもいいように、技術で日々が少し便利になることを書いていきます

Solr 5.4.1でschema.xmlを使う

Solr5.4.1ではデフォルトではschema.xmlを使えない

Solr5.4.1ではスキーマ定義の変更はスキーマAPIでのみ変更が可能になっています。 Schema.xmlを定義しても、上書きしてしまいます。

従来通りのSchema.xmlをcoreのconfフォルダ内にセットしたい場合は、 solrconfig.xmlの設定を変更する必要があるようです。

手順は下記のとおりになります。

1.デフォルトでconfフォルダ内にある managed-schema を schema.xmlに変更します。

2.solrcofig.xml内の設定を下記のように変更します。

<!-- <schemaFactory class="ManagedIndexSchemaFactory">
   <bool name="mutable">true</bool>
   <str name="managedSchemaResourceName">managed-schema</str>
 </schemaFactory>
-->
<schemaFactory class="ClassicIndexSchemaFactory"/>

3.coreをリロードします。

結果は Schema Browser screen で確認できます。 ※ 確認するためには、2. のschema.xmlを少し変更する必要があります。

<参考URL>

Managed Schema Definition in SolrConfig - Apache Solr Reference Guide - Apache Software Foundation

Solr 5.4.1にWindowsでサンプルドキュメントを登録する

WindowsでサンプルドキュメントをSolrに登録する

まずは、Solrインストールフォルダに移動してSolrを起動します

bin\solr start

Linuxでは通常、postコマンドを使うみたいなんですが、Widowsだと使えない...

Apache Solr -

でもWindows用にpostツールが用意されているそうです。

Post Tool - Apache Solr Reference Guide - Apache Software Foundation

というわけで言われるがままにそこに書いてあるコマンドを実行してみます。

java -jar example\exampledocs\post.jar example\exampledocs\*.xml

結果は

SimplePostTool version 5.0.0
SimplePostTool: FATAL: Specifying either url or core/collection is mandatory.

なるほどね、core/collectionが必須ですよと。

わかりました。じゃあ、まずはcoreを作らないといけないみたいです。 というわけで下記のコマンドを実行します。

bin\solr create -c collection1

そのうえで、core/collectionを指定してサンプルドキュメントを登録します。

java -Dc=collection1 -jar example\exampledocs\post.jar example\exampledocs\*xml

無事登録できました。

Solr 5.4.1をwindowsにインストールする

SolrをWindowsにインストールする

参考URL:

http://lucene.apache.org/solr/quickstart.html

まずは、Javaがインストールされていることを確認します。

コマンドプロンプトを開いて下記のコマンドを実行します。

java -version

f:id:crossroad19931110:20160515122607p:plain

修正: 動作環境が、java8以上になっていたので修正

System Requirements

その後、下記のURLより、solr-5.4.1.zipをダウンロードします。

www.apache.org

ダウンロードが完了したら適当なフォルダに解凍します。

解凍したフォルダに移動して下記のコマンドを実行します。

bin\solr start

f:id:crossroad19931110:20160217215326p:plain

管理画面にアクセスして無事、Solrが起動していることを確認します。

http://localhost:8983/solr/#/

以上、思った以上に簡単でした。f:id:crossroad19931110:20160515122607p:plain

Selenium WebDriver でページを操作してみる

3回目の今日は実際にSeleniumでページを操作してみたいと思います。

内容はこのブログのページ内検索を利用して、検索を実施して結果として予想通りに検索できるかをテストします。

結果は下記のとおり。

    [TestClass]
    public class SearchTest
    {
        [TestMethod]
        public void SearchResult0()
        {
            // Firefox用のWebDriverをインスタンス化
            var driver = new FirefoxDriver();

            // 暗黙の待ち時間を設定 ・・・ ①
            driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0,0,5));
            
      //ブログを表示します。
            driver.Navigate().GoToUrl("http://genpaku1110.hatenablog.com/");
            
      //ブログのサイト内検索で「おしゃれな喫茶店」を入力します。
            IWebElement seachbox = driver.FindElement(By.Name("q"));
            seachbox.SendKeys("おしゃれな喫茶店");
            
      // 検索ボタンをクリック
            IWebElement submit = driver.FindElement(By.ClassName("search-module-button"));
            Actions builder = new Actions(driver);
      builder.Click(submit).Perform();

            // 結果が0件であることをテストする・・・そんな記事書いてないですからね。
            IWebElement result = driver.FindElement(By.CssSelector("#main-inner > p:nth-child(3)")); // ・・・②
            Assert.AreEqual("この期間に記事はありません", result.Text);

        }
}

ほとんどコメントで書いてしまいましたが、苦労した点としては①の「暗黙の待ち時間を設定」のコードがないと時たまテストが失敗するということです。 また便利だと思ったのは、②のCSSセレクタがそのまま使えることですね。

あとは、繰り返しの操作をまとめて使えば結構テストでも使えるのでないでしょうか。 また気が向いたら調べてみたいと思います。

Selenium WebDriverでステータスコードをチェックしたい・・・できない!?

結論としては方法が見つかりませんでした。

残念です。

仕方ないので、とりあえずHttpClientを使ってチェックをしてみます。

    [TestClass]
    public class HTTPStatusTest
    {
        [TestMethod]
        public void HttpStatusTest()
        {
            Task<HttpResponseMessage> res = Get("http://genpaku1110.hatenablog.com/aaaa");
            Assert.IsTrue(res.Result.StatusCode.Equals(HttpStatusCode.OK));
        }

        private async Task<HttpResponseMessage> Get(string url)
        {
            using (var client = new HttpClient())
            {
                return await client.GetAsync(url);
            }
        }
    }

とりあえず、できましたが、Seleniumで操作してからチェックがしたかった。 ページのタイトルとかで判断するしかないですかね。 残念です。

<参考記事>

How To Get The HTTP Status Code In Selenium WebDriver « Ninth Avenue Software

www.atmarkit.co.jp

Selenium WebDriverでスクリーンショットをとる

今回は画面キャプチャを毎回とるのがめんどくさかったため、Seleniumを使って自動化してみます。

使う言語はC#でやってみます。

1. VisualStudioプロジェクトを作る

まずはVisual Studio 2015を使ってプロジェクトを作ります。 今回は、テンプレートはコンソールアプリケーションを選択します。 テストに使いたい場合は、テストアプリケーションを使うのもおすすめです。 というか通常は後者のほうが多いと思います。今回は動作確認をしたいだけなので、コンソールアプリでサクっと作ります。

2. nugetを使って、Seleniumをインストールする

メニューバーから「プロジェクト > NuGetパッケージ管理」をクリックします。 「Selenium」で検索して、「Selenium WebDriver 」をサクッとインストールします。 f:id:crossroad19931110:20160119194953p:plain

3. Mainメソッド作る

今回は単純に1つのページを表示して、指定したフォルダにキャプチャを保存するというプログラムを作ります。 結果はこのような感じになります。

using System;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium;

namespace BlogSelenium
{
    class Program
    {
        static void Main(string[] args)
        {
            // Firefox用のWebDriverをインスタンス化
            IWebDriver driver = new FirefoxDriver();

            // Firefoxでページを表示する
            driver.Navigate().GoToUrl("https://www.google.co.jp/");

            // スクリーンショットをとる
            Screenshot ss = ((ITakesScreenshot)driver).
                GetScreenshot();

            // デスクトップにファイル名にタイトルをつけて保存する
            var title = driver.Title;
            var file = System.IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) ,title + ".png");
            ss.SaveAsFile(file, System.Drawing.Imaging.ImageFormat.Png);


        }
    }
}

4. 実行してみる

実行するとFirefoxが立ち上がって、ページが自動で遷移します。 そして実行が終わると無事ファイルが出来ていました。

f:id:crossroad19931110:20160119200402p:plain

めでたし、めでたし。 若干いまさら感のあるSeleniumですが、頑張れば色々できそうなので これかも少しずつ試して行きたいと思います。