「C#」タグアーカイブ

C#+Selenium+Chrome 実行時に謎のエラーが発生:unknown error: cannot parse internal JSON template: Line: 1, column: 1, Unexpected token.


C#で作成したWindows アプリを使用してGoogle Chromeを操縦しているとなぜか突然

unknown error: cannot parse internal JSON template: Line: 1, column: 1, Unexpected token.

このエラーが出る様になりました。

デスクトップPCでエラーは出ておらず、なぜかノートPCで発生する状況が続いていました。

Visual Studio、Google Chrome・・・

色々試しました。解決は本当に大変でした。

最悪ノートPCのハード的な問題が原因だと思ってPC買い替えまで考えてました。これで10万浮いたー。

ですが、このエラーの原因はSeleniumでChromeを操縦する時に使用していたディレクトリ中のファイルが何等かの原因で破損していた事が原因でした。

一旦、

C:\ChromeData

を丸ごと削除した上で、C#(+Selenium)のプログラムを実行したところ正常に動作する様になりました。

 

本当に今回はかなりハマりました。

同じ事象が起きてハマっている方の参考になればと思います。

このブログを書いている2020年8月時点で、このエラーについて解説しているサイトは1つもありませんでした。

 


ChromeでWEB上のPDFファイルを開く際に自動でダウンロードさせる設定メモ


WEB上で公開されているPDFファイルをChromeから開くと、Chrome上で標準では、表示されます。

PDF Viewerというソフトが行っている様です。

PDFページにアクセスした時に、自動でローカルに保存をする為の方法を探していて少しはまったのでメモしておきます。

ChromeでPDFページを自動でローカルに保存する手順


 

 

右上の…というのをクリック > 設定(S)

検索ワードの有力エリアが出て来るので「pdf」と入力し検索します。

設定画面から順に辿る事も可能ですが、面倒なので検索した方が効率が良いです。

サイトの設定 をクリックします。

ページを下にスクロールしてPDF ドキュメントをクリックします。

PDF ファイルをChromeで自動的に開く代わりにダウンロードする

のチェックを入れます。Chromeではチェックした時にチェックマークが青色になります。

ここまでの手順を行えば、WEBサーバに公開されているPDFファイルをChromeからアクセスすれば、自動でローカルに保存される様になります。

 

C#+Selenium+ChromeDriverで操縦しています。

この操作をちまちま設定するのは面倒なので、C#上で設定する方法がいまいちわかりません。

手順をブログで公開している人がいるのですが、うまくいきません。

誰か詳しい方コメントにて教えてくださいm(_)m

 

 

 

 

 


C#+Seleniumでスクレイピングする時の俺的メモ


メモ書きとして残しておきます。

スクレイピングをする時にはいつもIEをC#から自動操縦して取得していましたが、Seleniumを使った方がむっちゃ楽でおすすめです。

Selenium(セレニウム)と読みます。

Seleniumには、Google Crome/Firefox/IEとそれぞれの代表的なブラウザに対応したDriverが出ています。

Visual Studioを使用してSeleniumのパッケージをダウンロードする場合

メニュー > プロジェクト > NuGetパッケージの管理(N)

からSelenium系を見つけてインストールしておきましょう。

詳しくはググって他のサイトみてください。

XPathを簡単に調べる方法

Cromeを開いて調べたいツールの上で右クリック > 検証(I) > Copy > Copy XPath

これむっちゃ便利。

一瞬でスクレイピングしたい要素のXPathを取得できちゃいます。

初めて知ったけどむっちゃ便利でした。

Chromeのバージョンがあがるとエラーが発生する

2019/4/30 Cromeをいつも通りC#から操作しようとしたところエラーが発生しました。

エラーの内容はこちらです。

session not created: Chrome version must be between 70 and 73
(Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.17763 x86_64) (SessionNotCreated)

GoogleCromeのバージョンが74に上がった(手動で更新した)為に、Seleniumで使用するChromeDriverのバージョンを上げないと動作しない為に、このエラーが発生してしまっています。

GoogleCromeは原則として常に最新を使う事を推奨されています。

そこで私はChromeのバージョンをアップしました。

しかし、ChromeDriverが古くなり最新バージョン(74)に対応していない為に、今回のエラーが発生したという事です。

ChromeDiverのエラーでやったこと

メニュー > プロジェクト > 更新プログラム

Microsoft.Web.Xdt

Selenium.Chrome.WebDriver 

Selenium.WebDriver.ChromeDriver

更新モジュールが出ていたのでこれらを更新しました。

 


C#のプロジェクトにバイナリファイルをリソースで組み込んで、プログラムから復元するには?


C#+Visual Studio2010でテキストファイルをバイナリ化してリソースファイルに組み込みました。

そのリソースファイルから元のバイナリファイルを生成するコードです。

 

赤文字が定義したリソースファイル名です。
byte[] bs = Properties.Resources.resource_XXX;
System.IO.FileStream fs = new System.IO.FileStream(
“test.dat”,
System.IO.FileMode.Create,
System.IO.FileAccess.Write);
fs.Write(bs, 0, bs.Length);
fs.Close();

 

ここでは、 resource_XXXと名前を付けたリソースファイルをプログラムからFileStreamを使用してtest.datファイルに出力しています。

 

 


IEの自動操縦で使用するモジュールの場所 ~ mshtml.dll と shdocvw.dll のある場所 ~


FaceBookとかの会員制サイトにログインする際に手動でID・PASSを入力するのが面倒です。そういう場合にはC#でIEを自動操縦して入力させればOKです。

IEの自動操縦で必須となるモジュール

mshtml.dll

shdocvw.dll

は、それぞれC:\Windows\System32の中に入っています。

プロジェクト上ではこれを参照しましょう。

 

 


C#で濁点の含まれる文字列検索を正常に判定させるには?


②の中から「c」が含まれているかを判定する為には、以下の太緑文字の様にコードを記述する必要があります。

①string test_value_1 = “abcdefg”;
②string test_value_2 = “abc゙defg”;

int i_test_1 = -1;
int i_test_2 = -1;

i_test_1 = test_value_1.IndexOf(“c”);
i_test_2 = test_value_2.IndexOf( “c”, StringComparison.Ordinal );

 

StringComparison.Ordinal を付けないと -1 になってしまいます。

原因は不明です。


C#でファイルをサーバに転送する。


ファイルをサーバに転送する場合には、WebClinetを使うと非常に便利です。単純にローカルのコードをサーバに転送するだけならたった3行で完結します!

WebClient wc = new WebClient();
 wc.Credentials = new NetworkCredential(p_user_name, p_pass_word);
 wc.UploadFile(“ftp://hogehoge.com/test.txt”, “test.txt”);