やりたいこと
こんにちは。私はSeleniumVBAを使用して社内システムに入力されている内容をExcelに転記する業務を行っています。その業務の中でラジオボタンが選択状態にある値を取得する必要が生じました。
今回の事例の画像およびHTMLは以下のとおりで、選択されている値の「非公開」を取得しようと思います。目指しているのはXpathでの一発取得です。
社内システムのHTML(簡素化しています)
HTML
<input type="radio" name="〇〇" "value="1" size="3" checked>
<label>公開</label>
<input type="radio" name="〇〇" "value="2" size="3">
<label>館内のみ</label>
<input type="radio" name="〇〇" "value="3" checked size="3">
<label>非公開</label>
【参考】もし「公開」が選択されていた場合checked属性が2つ存在する
<input type="radio" name="〇〇" "value="1" checked size="3" checked>
<label>公開</label>
自分で試したこと
以下のコードで実行しましたが、初期値で「公開」に設定されていた関係で、inputタグの末尾にあるchecked属性が残っていたため、意図しない「公開」を取得してしまいました。
VBA
Debug.Print driver.FindElement(By.XPath,"//input[@name='〇〇'][@checked]/following-sibling::label[1]").GetText
結果(Xpathで一発取得は断念)
inputタグの末尾にあるchecked属性の除外をXPathで指定することはできるのか考えましたが、これといった妙案が結局見つかりませんでした。
そのため、inputタグそれぞれで選択状態かどうかをループ処理で対応していますが、Xpathであれば一発でできるのに、とモヤモヤが残っています。ご存じの方がいらっしゃいましたら、お知恵をお借りできればと思います。
VBA
'妥協したコード
Dim elmfound As WebElement
Dim elms As WebElements
Set elms = driver.FindElements(By.XPath, "//input[@name='〇〇']")
For Each elmfound In elms
If elmfound.IsSelected = True Then Exit For
Next
Debug.Print elmfound.FindElement(By.XPath,"./following-sibling::label[1]").GetText
ちなみに、この社内システムは少し古くデータ移行のために作成してるのですが、別の新しめの社内システムでは、checked属性はチェックが入った要素のみ表示されていて、このように悩むことはありませんでした。