C#のスクレイピングライブラリであるAngleSharpを使っていて、以下のようなidもclassも指定されていないformのinput要素に値をセットしたいときがあります。
<form>
<input type="text" name="txtUserId" value="">
<input type="password" name="txtPassword" value="">
<input type="hidden" name="hash" value="fewbaijgj">
</form>
このような場合は、inputタグをすべて列挙してnameが特定の値の時のみinputタグのvalueアトリビュートへ値をセットしてあげればよいです。
サンプルコード
こちらがid,classが未指定のform要素へ値をセットするサンプルコードです。
var userId = "user0001";
var password = "passw0rd";
// setup
var config = Configuration.Default.WithDefaultLoader().WithCookies();
var context = BrowsingContext.New( config );
// ログインページを開く
await context.OpenAsync( "https://example.com/login" );
// ログインフォームに値をセット
var inputTags = context.Active.All.Where( m => m.LocalName == "input" && m.HasAttribute("name") );
foreach (var inputTag in inputTags) {
var name = inputTag.GetAttribute( "name" );
switch ( name ) {
case "txtUserId":
inputTag.SetAttribute( "value", userId );
break;
case "txtPassword":
inputTag.SetAttribute( "value", password );
break;
}
}
このコードでは、まずcontext.Active.Allでページ内に存在するすべてのタグを取得しています。次に、Whereでタグ名が"input"かつ、"name"のアトリビュートを持つタグだけ絞り込んでいます。
絞り込んだタグたちをループで処理します。ループの中ではnameアトリビュートにセットされている値に応じてユーザID・パスワードをセットすることで目的の処理を実行しています。
こちらもおススメ