リンクをクリックする方法いろいろ

link_with(:text => xxx) を使うパターン

これが1番使うパターン。例えば、次のような HTML の場合に使う。

<a href="/xxx/yyy/zzz">ここをクリックしたい</a>

この場合は、単純に次のようにするとクリックすることができる。

agent = Mechanize.new
  :
agent.page.link_with(:text => "ここをクリックしたい").click

link_with(:href => xxx) を使うパターン

例えば、次のような HTML だと link_with(:text => xxx) を使うことができない。

<div id="div1">
    <a href="/xxx/yyy/zzz">
        <span class="text">ここをクリックしたい</span>
    </a>
</div>

なので、この場合は、a タグの href 属性を取得して、link_with(:href => xxx).click と実行すると、「ここをクリックしたい」をクリックできる。
href を取得するには、この場合だと次のようになる。

agent = Mechanize.new
  :
agent.page.search('//div[@id="div1"]/a/@href').text

なので、次のようにするとクリックすることができる。

agent = Mechanize.new
 :
href = agent.page.search('//div[@id="div1"]/a[@id="a1"]/@href').text
agent.page.link_with(:href => href).click

link_with(:dom_id => xxx) を使うパターン

link_with は id を指定することもできる。例えば、次のような HTML の場合に使える。

<div id="div1">
    <a id="a1" href="/xxx/yyy/zzz">
        <span class="text"ここをクリックしたい</span>
    </a>
</div>

この場合は、次のようにすると id 指定でクリックすることができる。

agent = Mechanize.new
  :
agent.page.link_with(:dom_id => "a1").click

link_with(:dom_class => xxx) を使うパターン

class 指定でもクリックすることができる。例えば、次のような HTML の場合に使える。

<div id="div1">
    <a class="class-a" href="/xxx/yyy/zzz">
        <span class="text"ここをクリックしたい</span>
    </a>
</div>

この場合は、次のようにすると class 指定でクリックすることができる。

agent = Mechanize.new
  :
agent.page.link_with(:dom_class => "class-a").click

MS932 でエンコードされた文字列を UTF-8 に変換する

いろいろハマったのでコードをメモしておく。

public static final String UTF_8 = "UTF-8";
public static final String MS932 = "MS932";

/**
 * MS932 でエンコードされた文字列を UTF-8 に変換する。
 *
 * @param ms932 変換したい文字列
 * @return UTF-8 に変換した文字列
 * @throws UnsupportedEncodingException 変換に失敗した場合
 */
public static String convertMs932ToUtf8(String ms932) throws UnsupportedEncodingException {
	String temp = new String(ms932.getBytes(MS932), MS932);
	return new String(temp.getBytes(UTF_8), UTF_8);
}

CVS で import したファイルのリビジョンは 1.0 じゃなかった

現在担当している案件でお客さんから「追加したファイル、変更したファイルの一覧が欲しい」とのリクエストがあった。ソースコードのバージョン管理に CVS を使っているので「現在のリビジョンと 1.0 を diff すればいい」と思っていたのだが、

  • import したファイルのリビジョンは 1.1
  • 新規に add+commit して、その後、commit しなかったファイルのリビジョンは 1.1

であるため、両者の区別がつかない。

てっきり、リビジョンは 1.0 から振られると思っていたんだけど、そうじゃないのね。

hello.txtを追加します


C:\work\myproject> cvs add hello.txt
cvs add: scheduling file `hello.txt' for addition
cvs add: use 'cvs commit' to add this file permanently
コミットしてリポジトリに反映します


C:\work\myproject> cvs commit -m "Add hello.txt."
cvs commit: Examining .
RCS file: c:\home\cvsroot/myproject/hello.txt,v
done
Checking in hello.txt;
c:\home\cvsroot/myproject/hello.txt,v <-- hello.txt
initial revision: 1.1
done


C:\work\myproject> cvs update
cvs update: Updating .

CVSの基礎練習

こういう差分が欲しい場合、import した直後にタグ付けしておかないと比較できないってのはホントか?結局は両方のリビジョンをチェックアウトして diff したのだが、どうもスッキリしない。cvs のみで出来そうなものだけどどうやるんだろう?


どうやら CVS ではなく Subversion を使っておけば簡単に調べられたっぽい。

バージョン番号(リビジョン番号)はソースツリー全体に対して振られるため、原則としては誰かがソースツリーのどこかのファイルを更新する度に番号が増えてゆく。(CVSではファイル毎にリビジョン番号がつけられている。)

Apache Subversion - Wikipedia