Seleniumでブログ自動投稿

 以前にあるブログへの自動投稿システムがほしいという要望があって、それをSeleniumでやった。

 ログインのやり方などは使用例が見つかるので良かったが、WYSIWYGを使っているtextareaへの入力がちょっと手間取った。ふつうは要素を探してその内容として文字列を挿入とやっていたのだが、WYSIWYGのフォームを適用されているとどう文字列を入れればええのよと。Seleniumではキーボード入力もシミュレーションできるので、結局要素をクリックしてキーボードシミュレーションで文字列を流し込んだが。

 そういうわけであるブログで記事投稿をする、C#でSeleniumを使ったコード。やってみた感想として、Seleniumの使い道はテスト、動作確認なのでそこまで型に縛られる必要はないだろうから、Pythonとかスクリプト言語でやったほうが楽だったなというところ。

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;

namespace PlaySelenium
{
class Program
{
private static FirefoxDriver driver;
private static LogWriter log = new LogWriter("Selenium Test Sample");

static void Main(string[] args)
{
var url = "http://*****";

driver = new FirefoxDriver();

// Go to the home page
driver.Navigate().GoToUrl(url);

driver.FindElement(By.Id("usr_name")).SendKeys("*****");
driver.FindElement(By.Id("usr_password")).SendKeys("******");
driver.FindElement(By.Name("Submit")).Click();

if (driver.Title.Contains("ログイン"))
{
driver.FindElement(By.Name("user_name")).SendKeys("******");
driver.FindElement(By.Name("password")).SendKeys("******");
driver.FindElement(By.Id("login_button")).Click();
}

driver.Navigate().GoToUrl("http://******");

driver.FindElement(By.Name("entry_title")).SendKeys("エントリータイトル");

// switch ckeditor to source mode
driver.FindElement(By.XPath("//label[@for='sourceMode']")).Click();

// wait...
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(2));

// click to activate HTML input form
driver.FindElement(By.ClassName("CodeMirror-code")).Click();

// keyboard input emulation
driver.Keyboard.SendKeys("<h1>わっしょい</h1>");

// submit form
driver.FindElement(By.Name("srvEntryInputForm")).Submit();


log.Close();
driver.Quit();
driver.Dispose();
}


private static void AssertEqual(string a, string b)
{
if (a == b)
{
return;
}
else
{
var output = $"Test failed!\n" +
$"Page Title: {driver.Title}\n" +
$"URL: {driver.Url}\n" +
$"'AssertEqual' failed: {a} != {b}";
Console.WriteLine(output);
log.Add(output);
log.Close();
driver.Dispose();
Environment.Exit(1);
}
}

private static void AssertEqual(bool a, bool b)
{
if (a == b)
{
return;
}
else
{
var output = $"Test failed!\n" +
$"Page Title: {driver.Title}\n" +
$"URL: {driver.Url}\n" +
$"'AssertEqual' failed: {a} != {b}";
Console.WriteLine(output);
log.Add(output);
log.Close();
driver.Dispose();
Environment.Exit(1);
}
}
}
}
comment: 0