質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

1回答

2722閲覧

C#のWebブラウザを使って、WordPRESSを操作したいと思っています。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

1クリップ

投稿2015/05/02 14:34

VisualStudio2010 C#でWindows7で開発しています。

C#のWebブラウザを使って、WordPRESSを操作したいと思っています。
DocumentCompletedのイベントで、

//タイトル
HtmlElementCollection titles = webBrowser.Document.All.GetElementsByName("post_title");
if (0 < titles.Count)
titles[0].InnerText = ''タイトル";

//セレクター
HtmlElementCollection selectors = webBrowser.Document.GetElementsByTagName("select");
foreach (HtmlElement selector in selectors) {
if (selector.GetAttribute("id").Contains("main-selector")) {
selector.SetAttribute("selectedindex", "3");

//チェックボックス
HtmlElement checkbox = webBrowser.Document.GetElementById("category");
if (checkbox != null) {
//checkbox.InvokeMember("click");
checkbox.SetAttribute("checked", "");
}

//保存
HtmlElementCollection inputs = webBrowser.Document.GetElementsByTagName("input");
foreach (HtmlElement input in inputs) {
if (input.GetAttribute("value") == "下書きとして保存") {
input.InvokeMember("click");
break;
}
}
というように処理をしています。
これで、タイトルの書き込みと保存はできているのですが、セレクタの選択と、チェックボックスのチェックができないでいます。

原因究明or手順などのアドバイスをいただければ助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2015/05/02 16:46

WordPressのどの部分でしょうか。記事投稿ですか?
退会済みユーザー

退会済みユーザー

2015/05/03 11:37

はい。記事投稿です。
guest

回答1

0

大雑把にしか試していないので何ともですが、おそらくセレクタの件はselectedindexという存在しない属性に設定しようとしているからだと思います。
selectedIndexはJavaScriptにおいてHTMLSelectElementが持つプロパティの一つだったと記憶しています。

lang

1HtmlElementCollection selectors = webBrowser.Document.GetElementsByTagName("select"); 2foreach (HtmlElement selector in selectors) 3{ 4 if (selector.GetAttribute("id").Contains("main-selector")) 5 { 6 // コメントノード等含まれている場合に備えて 7 // Cast<T> よりも OfType<T> の方がいいかもしれません。 8 var options = selector.Children.Cast<HtmlElement>().ToArray(); 9 if (options.Length > 4) 10 options[3].SetAttribute("selected", "true"); 11 } 12}

チェックボックスについても、おそらくHTMLのノリで

lang

1<input type="checkbox" id="category" checked>

となることを期待したのでしょうが、XHTMLでは

lang

1<input type="checkbox" id="category" checked="checked"/>

となる必要があります。
従って、

lang

1HtmlElement checkbox = webBrowser.Document.GetElementById("category"); 2if (checkbox != null) { 3 checkbox.SetAttribute("checked", "checked"); 4}

こうなります。
一応これで必要最低限のHTMLで書いた環境では問題なく動きましたが、いかがでしょうか。

投稿2015/05/02 17:59

編集2015/05/02 19:43
htsign

総合スコア870

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/05/03 12:28

ご回答ありがとうございます。 セレクタとチェックボックス、両方試してみたのですが、残念ながらどちらも動作しませんでした。 補足情報です。 WordPRESSの記事投稿に使用しようとしています。 セレクタはひとまず措いて、チェックボックスです。 おっしゃるように、XHTMLでの表記のようです。 具体的には、次のようになっていました。 <input value="1" type="checkbox" name="post_category[]" id="category" checked="checked"> で、わたしの質問が悪かったのですが、チェックボックスをチェックしたい、というのは、チェックずみのチェックボックスをチェックして、チェックを外したい、ということでした。 ご示唆いただいたように、 checkbox.SetAttribute("checked", "checked"); だとチェックしてしまうようで、代わりに、 checkbox.SetAttribute("checked", "false"); checkbox.SetAttribute("checked", "0"); などを試しましたが、いずれでもチェックを外すことはできませんでした。 セレクタですが、デバッグで値を見ていたところ、 options[3]のところには来ていて、options[3]のinnerHtmlには該当する項目が入っていることは確認できました。 しかし、依然セレクトできていないです。
htsign

2015/05/03 13:21

なるほど。しかし、こちらの環境ではあなたの書かれていた checkbox.SetAttribute("checked", ""); でチェックが外れました。 なぜでしょうかね…。ちょっとよく分かりません。お役に立てず申し訳ありません。 checkbox.SetAttribute("checked", null); でもチェックが外れました。 またあなたがコメントアウトしてらっしゃった InvokeMember を使う方法でも外れました。 if (checkbox.GetAttribute("checked") == "True") {  checkbox.InvokeMember("click"); } セレクタの方もなぜでしょうね…。 各optionタグのvalue値がコード実行の段階で判明していて、それぞれ別の値が入っているのであれば select.SetAttribute("value", "hogehoge"); でも切り替わることまで確認しています。 もういっそのこと、WPのHTML自身にJavaScriptコードを埋め込んで、 InvokeScript を使う方法もありかもしれませんね…。
htsign

2015/05/03 14:29

takeshi2015さんのコメントを読み返して思ったのですが、 記事投稿したいだけであればHTTP POST処理をC#側でしてあげればいいだけなのでは…? WP使ったことがないので具体的な通信内容は知りませんが、POSTでパラメータを投げれば普通に考えて投稿できるはずです。 System.Net名前空間にその手の処理に便利なクラスがたくさんあります。
退会済みユーザー

退会済みユーザー

2015/05/04 04:48

htsignさん、コメント&検証ありがとうございます。 思いつく限り、("", "false"、コメントアウトしておいたInvokeMember-clickなど)いろいろ試したのですが、どうしてもうまくいかないのです。 最初に書いたとおり、タイトル(や本文など)は埋め込みできて、投稿できているのですが、このセレクタとチェックボックスだけうまくいかず、結局C#のソフトである程度本文を書いて投稿したあと、WordPRESSでセレクタを選んだりというのを手作業しています。(あと画像も手作業してますね)。 WordPRESS+ブラウザは動作が不安定で重たく、スクロールしないと全貌が見えず、手作業が多すぎるので、できるだけ楽したい、というのがC#から投稿したいという意図です。 JavaScrpitコードを埋め込む、というのもなるほどと思いました。なるほど。 基本的には投稿したいだけです。 POST処理はいちども使ったことがなく、おっしゃるとおり、いろいろあることは漠然と知っているだけで、いまのところ取っかかりがない感じです。 いろいろ感謝します。ありがとうございます。
htsign

2015/05/04 04:58

そのシステムの内容にもよるのですが、よくあるものとしては、 認証画面に対してユーザIDとパスワードのセットをPOSTするとトークンが返ってくるので、そのトークンを使って投稿したい内容と一緒にPOSTする、という感じです。 通信内容に関しては、通常のウェブブラウザの開発者コンソール(通常F12で表示できます)を使ったり、Fiddler等のローカルプロキシを間に挟んだりして見られます。 ブラウザでいつも通り投稿すれば一連の通信内容がログに溜まっていきます。 そしてこれらをC#で再現すれば同じような投稿が可能になります。 私はこの手の処理にはHttpWebRequest/HttpWebResponseを自分でラップした独自クラスを使っていますが、通常利用であれば.NETクラスライブラリのWebClientクラスで必要十分な機能が得られます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問