PCにインストールされているブラウザをC#で自動操縦する

PCにインストールされているブラウザをC#で自動操縦する

 

まずは、Windowsなのだから、IEはインストールされているとして、

 ・Firefox

 ・Chrome

が、インストールされているかを確認する。

 

方法は、ぐぐった結果レジストリ

HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\

に、[firefox.exe]、[chrome.exe]があれば、インストールされていると判断する。

 

 

後は、Nugetで

 ・Selenium WebDriver

 ・Selenium WebDriver Support Classes

 ・Selenium.WebDriver.ChromeDriver

 ・Selenium.WebDriver.IEDriver

をインストールする。

 

早速

 IWebDriver driver = new ChromeDriver();

 driver.Url = "www.example.com";

 

と、やるとChromeが起動して、指定したURLにアクセスする。

 

だけど・・・・・

ログを吐くようなコマンドプロンプトのウィンドウも出てくる。

 

オブジェクトブラウザで見て、

 

IE

>|cs|

                    InternetExplorerOptions ieOptions = new InternetExplorerOptions();

                    InternetExplorerDriverService ieDriverService = InternetExplorerDriverService.CreateDefaultService();
                    ieDriverService.HideCommandPromptWindow = true;
                    driver = new InternetExplorerDriver(ieDriverService, ieOptions);

||<

 

Firefox

 だと出ない

 

Chrome

>|cs|

                    ChromeOptions chromeOptions = new ChromeOptions();

                    ChromeDriverService chromeService = ChromeDriverService.CreateDefaultService();
                    chromeService.HideCommandPromptWindow = true;
                    driver = new ChromeDriver(chromeService, chromeOptions);

||<

 

で、出ないようになった。

 

ブラウザに表示されるフォームに自由に値を設定したり、

ボタンをクリックしたり、javascriptの起動と何でも出来る。

 

これで遠隔操作でもされると、マズいね。

 

 

 

 

 

VS2013 と SQL Server Compact 4.0 SP1

[2015/09/29 追記]

 Windows10 + VS2015に対して

 

[2015/04/16 追記]

 最後に追記あり

 

Windows XPが、後1ヶ月のサポートになったので、環境を

  「Windows8.1 + IE11 + VS2013」

で、新しく構築。

 

早速、以前のプロジェクトを読み込んでみたが、いつものVSとは違い

アップグレートウィザードが走らずに普通に読み込めた。

 

自分は、SQL Server Compactが大のお気に入りで、

クライアントPCで完結するアプリで、DBが必要な場合には

SQL Server Compactで決まり。

 

 

以前のプロジェクトのDBテーブルの変更があったので、

VS2013を起動して、[ツール] - [データベースへの接続]を選択したが、

データソースに、SQL Server Compactがない・・・・・・。

 

 

こりゃ、別途インストールが必要なのかと思い、

MSのサイトから、SQL Server Compact 4.0 SP1をインストールした。

 

 

さて、DBに繋ごうと、[データベースへの接続]を選択したが

「じぇ、じぇ、じぇ・・・!」

 

相変わらず、データソースがない。

 

 

で、ぐぐってみると、

VS2013から、大好きなSQL Server Compactはサポートされないらしい。

MSDN Blog

http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx

 

ローカルでDB使いたければ、LocalDBを使えと、いうことらしい。

 

 

でも、ネット上では、LocalDBは重いとか、配布が大変だとかで

よい評判は聞かない。

(開発者がSQL Serverをターゲットの開発に使うのは良いらしい。)

 

 

MSに対して、引き続きVS2013でも、サポートするように嘆願しているらしい。

 

 

嘆いていても、はじまらないので、ぐぐってみました。

 

 

捨てる神あれば、拾う神ありで、CodePlexで公開されていました。


SQL Server Compact Toolbox
http://sqlcetoolbox.codeplex.com/documentation

 

これをインストールすると、今までのサーバーエクスプローラとは違うウィンドウが開くが、今までと同じように使える。

 

これで問題解決かと思いきや、

なんと、

 

なんと、

セットアップファイルを作成する段階で、

必須コンポーネントのところに、「必要なブートストラップが見つかりません。」と警告が出る。

 

構わず、セットアップファイルを作るとエラーにはならず作成される。

 

実行環境にインストールしてみると、案の定

ファイルまたはアセンブリ 'System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

と、エラーになる。

 

実行環境にユーザ自身で、MSのサイトからインストールしてもらうしかないのか????

 

で、調べた結果

VS2012 のマシンの

Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Bootstrapper\Packages

にある

 

SQL Server Compact Edition 4.0

 

を、

 

VS2013のマシンの

\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\Bootstrapper\Packages

 

にコピーしてみた。

 

 

とりあえず、これで必須コンポーネントの警告は消えた。

ライセンス的に問題があるのか、現在調査中・・・・・

 

だれか知りませんか~

 

 

 追記:

警告は消えたけど、manifestには含まない・・・・・・orz

 

 

[2015/04/16 追記]

上記の件が、

Visual Studio 2013 で SQL Server Compact がサポートされない問題に対応 | SHIN-ICHI の技術ブログ

にありましたので、本日追試。

 

もう一度、

BootStrapを
Windows8 VS2012 → Windows 8.1 VS2013

へコピー。

 

ClickOnce発行時に、[発行]-[必須コンポーネント]で

SQL Server Compact 4.0 SP1

がチェックできて、警告がないのを確認。

 

普通に、ClickOnceの発行。

 

Windows7のクリーンなマシンを用意して、インストールURLへアクセスして、インストールボタンをクリック。

 

無事に、SQL Server Comact 4.0 SP1がインストールされました。

 

又、ライセンス的にも問題がないようです。

 

[2015/09/29 追記]

環境をWindows10 + VS2015をクリーンインストール

 

VS2013と同じようにBootStrapをコピーしようとしましたが、Windows8.1とはで入れクトリ構成が違うようで、

 

C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Packages

 

に、コピーすると、警告が消えました。

 

[2017/10/05 追記]

VS2017では、Bootstrapsのパスが変わっています。

 

C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages

 

にコピーすると警告が消えました。

 

 

 

 

 

 

log4netでformのtextBoxにlogを出力

log4net関連で、備忘録。

 

WindowsFormに貼り付けたTextBoxに、log4netを使ってLogを出力する。

 

パクリ元はStackOverflow

http://stackoverflow.com/questions/14114614/configuring-log4net-textboxappender-custom-appender-via-xml-file

 

何のため?

ユーザに今、何が起こっているのかを知らせる。

プログレスバーは、作業全体のどれくらいが終わっているかのみを表示するが、こちらは、今、何をしているかを表示できる。

 

 

log4netのconfig

>|xml

    <!-- 通常ログ:FormXXXのTextBox1に出力 -->
    <appender name="OutToTextBox1" type="appName.FormXXX,  appName">
      <formName value="FormXXX"/>
      <textBoxName value="TextBox1"/>
<!-- このあたりは同じ -->
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMax" value="Error" />
        <param name="LevelMin" value="Trace" />
      </filter>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="&gt;&gt; - %message" />
      </layout>
    </appender>
 <root>
    <level value="INFO"/>
    <appender-refref="OutToTextBox1"/>
</root>

||<
 
 
TextBox1へ書き出すClassを作成(log4netのAppenderSkeltonを継承)
>|cs
public class TextBoxAppender : AppenderSkeleton
{
private TextBox _textBox;
public TextBox AppenderTextBox
{
get
{
return _textBox;
}
set
{
_textBox = value;
}
}
public string FormName { get; set; }
public string TextBoxName { get; set; }

private Control FindControlRecursive(Control root, string textBoxName)
{
if (root.Name == textBoxName) return root;
foreach (Control c in root.Controls)
{
Control t = FindControlRecursive(c, textBoxName);
if (t != null) return t;
}
return null;
}

protected override void Append(log4net.Core.LoggingEvent loggingEvent)
{
if (_textBox == null)
{
if (String.IsNullOrEmpty(FormName) ||
String.IsNullOrEmpty(TextBoxName))
return;

Form form = Application.OpenForms[FormName];
if (form == null)
return;

_textBox = (TextBox)FindControlRecursive(form, TextBoxName);
if (_textBox == null)
return;

form.FormClosing += (s, e) => _textBox = null;
}
_textBox.Invoke((MethodInvoker)delegate
{
_textBox.AppendText(loggingEvent.RenderedMessage + Environment.NewLine);
});
}
}

||<
 
 
実際に書き出すフォームで
 
>|cs
var textBoxAppender =newTextBoxAppender();
        textBoxAppender.TextBoxName="textBox1";
        textBoxAppender.FormName="FormXXX";
        textBoxAppender.Threshold= log4net.Core.Level.All;var consoleAppender =new log4net.Appender.ConsoleAppender{Layout=new log4net.Layout.SimpleLayout()};varlist=newAppenderSkeleton[]{ textBoxAppender, consoleAppender };
        log4net.Config.BasicConfigurator.Configure(list);

||<

以上でファイルに出力するLogをtextBoxにも出力出来た。

 

log4netでハマった・・・・

log4net

 Nugetからインストールして、使い回しのconfig取り込んでと、

メチャ簡単なんで使いました。

 

でも・・・・・・

 開発マシンには、キチンとログが出る。

 実行環境へインストールすると、何も出ない?????なんで~

 

出力されないからと、設定ファイルを疑って半日。

 

もしかして設定ファイルが読み込まれていないのか??????

 

 

 

原因は、

 AssemblyInfo.csに

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "./Log4net.Config.xml", Watch = true)]

と、相対パスlog4netの設定ファイル位置を書いたのだが、

セットアップで、アプリケーションファイルを見ると、

なんと、、、

 

データファイル(自動)となってました・・・・・・・

含むに変えると、キチンと出力された。

 

読み込まれないんなら、実行時にファイルがないとエラーになって欲しい。

 

これだけで、半日ツブした。

はい、バカなのは私です。

 

 

怒りをブツけるところがないので、ここへ。