LoginSignup
troglodytes525
@troglodytes525 (A H)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

VBA selenium 要素の取得について

特定の文字を含む要素の取得に悩んでおります。

< tr class="stripe ng-scope" ng-repeat="data in FlowTransferSelectSvc.list">
< td class="align_c">
< a class="button" ng-click="done(data);">選択
< /td>
< td class="ng-binding">承諾願書-2023-104110-009
< td class="ng-binding">2024/03/29
< /tr>)
< tr class="stripe ng-scope" ng-repeat="data in FlowTransferSelectSvc.list">
< td class="align_c">
< a class="button" ng-click="done(data);">選択
< /td>
< td class="ng-binding">承諾願書-2023-104110-010
< td class="ng-binding">2024/03/29
< /tr>)

上記の要素から、『承諾願書-2023-104110-010』を含む要素を取得したいと持っています。
(実際にはその要素の隣をクリック)

driver.FindElementByXPath("//td[contains(text(), ”承諾願書-2023-104110-010”)]")
と書いたのですが、構文エラーになります。

driver.FindElementByXPath("//td[contains(text(), "2023-104110-010")]")
と書くと、NoSuchElementErrorになります。

『承諾願書-2023-104110-010』を変数に格納し、
driver.FindElementByXPath("//td[contains(text(),変数)]")
と書くと、何故か1個目の『選択』要素を選択します。

どうしたら、『承諾願書-2023-104110-010』を含む要素を取得できるでしょうか。
ご存じの方がいらっしゃいましたら、ご教授頂けますと幸いです。

0

3Answer

クローズされているところにすみませんが失礼します

driver.FindElementByXPath("//td[contains(text(),""承諾願書-2023-104110-010"")]")
とするべきだったと思うのですがいかがでしょうか(ダブルクオーテーションはエスケープするために二つ必要)

0

Comments

  1. @troglodytes525

    Questioner

    @totqkke さん、コメントありがとうございます。
    実際には、変数に格納して使用しているので、""の必要性までは確認しませんでした。

XPathは、該当するページをEdgeで表示させデベロッパーツールにて取得できます。
ググれば簡単に見つけられます。例えば、以下のサイトに説明があります。

0

nak435 さん、コメントありがとうございます。
XPathを取得する方法は理解しておりますが、デベロッパーツールで取得した情報のうち、tr[n]のnが毎回変わってしまいます。
そこで、特定のテキストを含む要素を取得したいので、 contains(text(), を使用しているのですが、どうにもうまくいかず悩んでおります。

0

Comments

  1. XPathを取得する方法は理解しておりますが、デベロッパーツールで取得した情報のうち、tr[n]のnが毎回変わってしまいます。

    であれば、取得したXPathをここに正確に貼り付けてください。

    そこで、特定のテキストを含む要素を取得したいので、 contains(text(), を使用しているのですが、どうにもうまくいかず悩んでおります。

    contains() text()はVBAの関数でしょうか?
    "で囲んでいるので、文字列になっていませんか?

    VBAのコードもここに貼ってください。

  2. @troglodytes525

    Questioner

    ss032 - CESSGroupWare - Google Chrome.png

    XPath
      //*[@id="FlowTransferSelect"]/div[2]/div/div/div/table/tbody/tr[33]/td[2]
    XfullPAth
      /html/body/section/div/div/div/div[2]/div/div/div/table/tbody/tr[33]/td[2]

    tr[33]の33が毎回変わります。

     

    VBAの該当部分です
      Dim Driver As New Selenium.WebDriver
      SafeOpen Driver, Chrome
       With Driver
        .Get "https://----------.html"

      msgbox .FindElementByXPath("//td[contains(text(), "承諾願書-2023-104110-010")].text   '場所の確認ができたら削除

        .FindElementByXPath("//td[contains(text(), "承諾願書-2023-104110-010")]/preceding-sibling::td[1]").Click
       End With

    msgboxの時点で、質問文における状況になります。

  3. 確認です。

    XPath
      //*[@id="FlowTransferSelect"]/div[2]/div/div/div/table/tbody/tr[33]/td[2]
    XfullPAth
      /html/body/section/div/div/div/div[2]/div/div/div/table/tbody/tr[33]/td[2]

    tr[33]の33が毎回変わります。

    テキスト部「承諾願書-2023-104110-010」がtr[33]/td[2]で、「選択」ボタンがtr[33]/td[1]でしょうか?

  4. 上の質問がYesの場合、以下のコードでどうでしょうか?

        Dim Driver As New Selenium.WebDriver
        SafeOpen Driver, Chrome
        With Driver
            .Get "https://----------.html"
            Dim n As Long
            For n = 1 To 1000
                Dim xpath As String, elm
                xpath = "/html/body/section/div/div/div/div[2]/div/div/div/table/tbody/tr[" & n & "]/"
                elm = .FindElementByXPath(xpath & "td[2]")
                If Not IsNull(elm) Then
                    If InStr(elm.Text, 1, "承諾願書-2023-104110-010") > 0 Then
                        .FindElementByXPath(xpath & "td[1]").Click
                        Exit For
                    End If
                End If
            Next
        End With
    
  5. @troglodytes525

    Questioner

    質問はYesです。

    折角、頂いたコードですが、
      elm = .FindElementByXPath(xpath & "td[2]")
    の部分で
      実行時エラー'438':
      オブジェクトは、このプロパティまたはメソッドをサポートしていません。
    というエラーになってしまいます。

  6. Setが必要かも。

        Dim Driver As New Selenium.WebDriver
        SafeOpen Driver, Chrome
        With Driver
            .Get "https://----------.html"
            Dim n As Long
            For n = 1 To 1000
                Dim xpath As String, elm As WebElement '⭐️
                xpath = "/html/body/section/div/div/div/div[2]/div/div/div/table/tbody/tr[" & n & "]/"
                Set elm = .FindElementByXPath(xpath & "td[2]") '⭐️
                Driver.FindElementByXPath
                If Not IsNull(elm) Then
                    If InStr(elm.Text, 1, "承諾願書-2023-104110-010") > 0 Then
                        .FindElementByXPath(xpath & "td[1]").Click
                        Exit For
                    End If
                End If
            Next
        End With
    
  7. @troglodytes525

    Questioner

    おかげ様で
     If InStr(elm.Text, 1, "承諾願書-2023-104110-010") > 0 Then

     If InStr(elm.Text, "承諾願書-2023-104110-010") > 0 Then
    に、
     Set elmの後の Driver.FindElementByXPath を削除
    した結果、対象のtd[1]をクリックすることができました!!!!!

    何度もご回答いただきまして、ありがとうございました。

  8. ミスがありましたか。失礼しました。

    当初の目的は達成できたのでしかね。
    もし、解決でよろしければ、当Q&Aをクローズしていただければと思います。

Your answer might help someone💌