0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SeleniumVBA】Xpathで選択状態のラジオボタンの値を取得したい

Last updated at Posted at 2024-12-28

やりたいこと

こんにちは。私はSeleniumVBAを使用して社内システムに入力されている内容をExcelに転記する業務を行っています。その業務の中でラジオボタンが選択状態にある値を取得する必要が生じました。

今回の事例の画像およびHTMLは以下のとおりで、選択されている値の「非公開」を取得しようと思います。目指しているのはXpathでの一発取得です。

事例.png

社内システムの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属性はチェックが入った要素のみ表示されていて、このように悩むことはありませんでした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?