Chromeのシナリオでtd内にあるラジオボタンオンの値を取得したい
※ 進展があり、現在は最下部の太字の状態です。
tableの同じtd内にある、同グループのラジオボタンオンの値を取得したいです。
ラベルかValueです。
お知恵を拝借させてください。
後追いで、チェックボックスも同じように取得したい。
2つ以上のチェックがオンなら、値をたとえばカンマ区切りで格納したい。
把握してること
- 「チェック状態取得」でtrue/falseを取得できる
気になるポイント
- 項目の値が何だったのか、取得したtrue/falseの値から割り出さなければならない
- 取得したいのは項目と対になる値1つなのに、ラジオボタンの数だけ変数を消費しちゃう
- 前後で使い回し用の変数を登場させる工夫で、変数の消費は項目数+1に抑えられそう
- ラジオボタン/チェックボックスはそれなりに広範囲にある
- 工夫をサブルーチンにすれば抵抗感は和らぐのかも
既に試したこと
- 「値の取得」でValueの値、onとか0とか1が取得された
気づき
- Copy XPathしたままだと、ラジオボタンのチェック状態が加味されず、目的に使えない
到着のラジオボタンを予めオンにして検証
Yahoo!路線情報
https://transit.yahoo.co.jp///*[@id="tsArr"]
ラジオボタングループ、name="type"のXPath
//*[@id="default"]/dd/ul
攻略の一案
- 「チェック状態取得」がTrueになるまでラジオボタングループを「カウントアップ」しながら「繰り返し」
- Trueの要素のValueとラベルを取得
- 使い回し用の変数を登場させる工夫でゴールを目指せそう
ズバリなライブラリの模索
- このスレッド起点で、ブラウザ関連ライブラリのスクリプト合わせ技1本で、「指定タイトルのウィンドウへ移動」を作ったかたが確かいらっしゃった
https://winactor.com/questions/question/chrome-任意のウィンドウへ移動-スクリプト改変windowhandle→windowti/
- 同じ要領で、「ラジオボタンオンの値を取得」も作れるのかも
検索でヒットさせられず、スレッドを特定できず、、
(追記)ブラウザ関連ライブラリの合わせ技スレッド、見つかりました。
https://winactor.com/questions/?q=Chromeの制御対象画面フォーカス(ウィンドウスイッチ)方法
ズバリなXPathの模索
- 「値の取得」にセットすべきズバリのXPathを特定できれば、スクリプト加工さえ不要になる
XPathでチェックを入れたチェックボックスを指定する方法 - Yahoo!知恵袋
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10228302260
- ないのかも、、
RadioボタンのCheck状態取得 [Selenium C#]
https://teratail.com/questions/362722//td/input[@checked and @name='hdl_ep_mod']
- 正に求めてた回答っぽくて、これで拾えたかと思いきや、、
//*[@id="default"]/dd/ul//input[@checked and @name="type"]
- 出発のほうのこちらがヒットしてしまう、、
<input type="radio" name="type" id="tsDep" value="1" checked="" data-rapid_p="8">
- checked=""がヒットした模様
- デベロッパーツールでcheckedな箇所が、Copy outerHTMLではchecked=""になるのも不思議
- [ページのソースを表示]がオリジナルと思われる
<input type="radio" name="type" id="tsDep" value="1" checked=""/>
- 末尾が異なるのか、、
- ここではみんな希望を持って提案が飛び交ってる
Xpath to determine checkbox "checked" attribute in Selenium IDE - Stack Overflow
https://stackoverflow.com/questions/11758616/xpath-to-determine-checkbox-checked-attribute-in-selenium-ide
- すべての提案を試した結果、惜しいのもあったものの、いずれも玉砕、、
- checked="abc"みたいになっててくれない限り、拾えそうもない、、
たいていのラジオボタンは、そんなふうになってない、、 - Ver.7.4なら「属性値の設定」とかで強制できなくもなさそう
できたところで、、目的のクリアに繋がるのか、、? - CSS Selector方面ならいけるのかも
WinActorでCSS Selectorを使うには、、JavaScript経由になるか、、
jQueryが使われてるサイトなら、Consoleで攻略できそうな情報を発見っ!
【jQuery】ラジオボタンの選択されている項目の取得 at softelメモ
https://www.softel.co.jp/blogs/tech/archives/2894
あいにく、目的のページでは、jQueryは使われておらず、、
値の取得のほうのnameの値を差し替えてConsoleで試すも、あえなく玉砕、、
念のため、バージョン情報です。
WinActor7.2系
Chrome9x
素のJavaScriptで攻略できそうな情報を見つけました。
JavaScript | ラジオボタンの値をJavaScriptを使って取得・設定する
https://www.javadrive.jp/javascript/form/index4.html
1ページ内に結構な量があるので、アドレスバーとかConsoleのアプローチだと、結構面倒そう、、
1ページ毎に全ラジオボタンオンの値を一括で配列にブチ込んで、変数に当て込む。
1ページ毎に変数たちを用意しなきゃならない、、
メンテも引き継ぎにくくなっちゃう、、
これが今のバランスポイントならやむを得ないか、、
「ブラウザ操作(配列のアクションを順次実行)」を使ってるシナリオなので、取り込み済みの「値の取得」とか、既存のベーシックなライブラリの範囲に収まればベターです。
目の前の課題で、切羽詰まってます、、
XPathでAndとかOrとかNotの関数を駆使すればいけるのか、、?
でもチェック状態を掴めないなら行き詰まるか、、
やはりスクリプトの合わせ技か、、
合わせ技スクリプトを「ブラウザ操作(配列のアクションを順次実行)」に取り込むのが、今目指せるベストなのかも、、
「指定タイトルのウィンドウへ移動」Chromeの制御対象画面フォーカス(ウィンドウスイッチ)方法のスクリプトを参考にさせていただきたいく所存。
どなたか在り処、検索キーをご存じないでしょうか?
ひとまず正攻法っぽいフローを試しました。
① チェックオンのValue取得に成功したフロー(ラジオボタン)
ブラウザ起動:chrome
ページ表示:https://transit.yahoo.co.jp/
要素数取得://input[@type="radio" and @name="type"]
繰り返し
文字列の連結://li[ + カウンタ + ]/input[@type="radio" and @name="type"] = XPath
チェック状態取得:XPath、チェック状態
分岐:チェック状態 がtrue
True
値の取得:XPath、オンの値
分岐:オンの値連結 等しい 値⇒(ブランク)
True
文字列の連結:オンの値 = オンの値連結
False
文字列の連結:オンの値連結 + , + オンの値 = オンの値連結
False
(何もしない)
② チェックオンのValue取得に成功したフロー(チェックボックス)
- nameが別立てになってるページなら、@typeのand指定は不要で、ラジオボタンと同じフローが使える
- @type="radio"を@type="checkbox"に変更して、想定通りに動作した
- 惜しいことに、Valueが全部1、、
- フローは一定範囲で有効ではある
- Valueの値で内容が識別できないソースの場合は、目的を満たせない
- labelのテキストを取得するのが、より汎用的で、後続処理での使い勝手が良さそう
- 同じ階層か、inputを囲むlabelのテキストを取得すれば良い
- ほぼすべてのラジオボタン/チェックボックスにlabelがあると信じたい
③ チェックオンのラベルテキスト取得に成功したフロー
要素数取得://input[@type="radio" and @name="type"]
繰り返し
文字列の連結://li[ + カウンタ + ]/input[@type="radio" and @name="type"] = inputのXPath
文字列の連結://li[ + カウンタ + ]/input[@type="radio" and @name="type"]/../label = labelのXPath
チェック状態取得:inputのXPath、チェック状態
分岐:チェック状態 がtrue
True
値の取得:labelのXPath、オンの値
分岐:オンの値連結 等しい 値⇒(ブランク)
True
文字列の連結:オンの値 = オンの値連結
False
文字列の連結:オンの値連結 + , + オンの値 = オンの値連結
False
(何もしない)
所感
- 遅い、、遅すぎる、、
- 1ページ内50項目くらいを「ブラウザ操作(配列のアクションを順次実行)」で「値の取得」するのは実質2秒程度
- この「要素数取得」から始めるフローで手段のチェックボックスオン全6個分のテキストを取得したログは10秒弱
- ブラウザやWinActorの最小化とか、環境次第で少しは短くなると思われえる
- それにしても遅すぎる、、
野望
- まず、このフローを1ライブラリ[チェックオンのラベルテキスト取得]にしたい
スクリプト内のループや条件分岐の中で、「要素数取得」「チェック状態取得」「値の取得」のSubやFunctionを呼び出す感じ
何とかなるかも
わたしの中では少し背伸びの領域です。
「作ってみたよ!」「できたよ!」な回答/コメント、いただけら嬉しいです。
ご協力いただける場合は、既製ライブラリのスクリプト丸ごと掲載とかは、権利の関係でよろしくないので、「ここはこのライブラリのこのブロック」みたいな示しかただと助かります。
https://winactor.com/questions/question/【2019-05-17フォーラム運営チームより】※重要※スクリ/
https://winactor.com/questions/question/スクリプトの権利について、本気出して調べてみ/
[チェックオンのラベルテキスト取得]のニーズは多いはずなので、そのうちプチライブラリとかでリリースされたら嬉しいかも。
Ver.7.4.1に同梱されてたりして。
https://winactor.com/questions/question/《重要》winactor最新版-ver-7-4-1リリース日決定のご案内/
- 次に「ブラウザ操作(配列のアクションを順次実行)」に組み込みたい
https://winactor.com/questions/question/教わりながら「ブラウザ操作配列のアクションを/