クローズされているところにすみませんが失礼します
driver.FindElementByXPath("//td[contains(text(),""承諾願書-2023-104110-010"")]")
とするべきだったと思うのですがいかがでしょうか(ダブルクオーテーションはエスケープするために二つ必要)
特定の文字を含む要素の取得に悩んでおります。
< 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』を含む要素を取得できるでしょうか。
ご存じの方がいらっしゃいましたら、ご教授頂けますと幸いです。
クローズされているところにすみませんが失礼します
driver.FindElementByXPath("//td[contains(text(),""承諾願書-2023-104110-010"")]")
とするべきだったと思うのですがいかがでしょうか(ダブルクオーテーションはエスケープするために二つ必要)
@troglodytes525
Questioner@totqkke さん、コメントありがとうございます。
実際には、変数に格納して使用しているので、""の必要性までは確認しませんでした。
XPathは、該当するページをEdgeで表示させデベロッパーツールにて取得できます。
ググれば簡単に見つけられます。例えば、以下のサイトに説明があります。
nak435 さん、コメントありがとうございます。
XPathを取得する方法は理解しておりますが、デベロッパーツールで取得した情報のうち、tr[n]のnが毎回変わってしまいます。
そこで、特定のテキストを含む要素を取得したいので、 contains(text(), を使用しているのですが、どうにもうまくいかず悩んでおります。
XPathを取得する方法は理解しておりますが、デベロッパーツールで取得した情報のうち、tr[n]のnが毎回変わってしまいます。
であれば、取得したXPathをここに正確に貼り付けてください。
そこで、特定のテキストを含む要素を取得したいので、 contains(text(), を使用しているのですが、どうにもうまくいかず悩んでおります。
contains()
text()
はVBAの関数でしょうか?
"
で囲んでいるので、文字列になっていませんか?
VBAのコードもここに貼ってください。
@troglodytes525
QuestionerXPath
//*[@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の時点で、質問文における状況になります。
確認です。
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]
でしょうか?
上の質問が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
@troglodytes525
Questioner質問はYesです。
折角、頂いたコードですが、
elm = .FindElementByXPath(xpath & "td[2]")
の部分で
実行時エラー'438':
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
というエラーになってしまいます。
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
@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]をクリックすることができました!!!!!
何度もご回答いただきまして、ありがとうございました。
ミスがありましたか。失礼しました。
当初の目的は達成できたのでしかね。
もし、解決でよろしければ、当Q&Aをクローズしていただければと思います。