0

WinActor7.2や7.4で、

に成功するのに、
Chrome9xのConsoleからXPathの要素の値を取得できません。
助けてください。
と質問しようとしてました。

 

直前にノウハウが見つかっちゃいました。

ChromeのディベロッパーツールでXPathを使ったクリックがしたい - Yahoo!知恵袋
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13255788543

これで見つけました。

https://www.google.com/search?q=Console+XPath+Click

で目的の値の応答が得られちゃいました、、

$x('要素のXPath').innerHTML

以前にココさんから教わった方法でした。

https://winactor.com/questions/?q=Chromeで値の取得に失敗する

 

今回は、Utilities APIについて理解を深める良い機会でもありました。
経験のお裾分けです。

https://www.google.com/search?q=Chrome+Console|Utilities+API

 

残念感を漂わせてるのは、Excel VBA(SeleniumBasic)でなおも未解決だからです。
WinActorのUserForumなので、ほかのツールの話題は遠慮しがちです。
現時点では、ほかのツールで取得できない値が、WinActorでなら取得できてる。
「WinActor、やっぱりスゴイよね」という、現時点での見えかたを共有しつつ。
どれかが誰かのアンテナにキャッチされて、WinActorのノウハウとして化学反応が起きることを願いたいというタテマエ。
SeleniumBasicも使ってるかたから「ただこうすれば良いだけじゃん」のツッコミが入ってあっさり解決しちゃえば嬉しいというホンネ。

試しようがあるサンプルと現状を書き出しました。
お気づきの点があれば、お知らせいただけますか。

 

サンプル.html

  • メモ帳でもANSI/Shift-JISで保存、Chrome等で開く

<html>
<head>
<title>テスト</title>
</head>
<body>
<form name="test" class="abc def ghi">
<table>
<tr>
  <td>
    <select id="a" name="aa" disabled="disabled"> <!-- ← ※ -->
      <option label="aa1" value="1">aa1
      <option label="aa2" value="2">aa2 <!-- ← 取得できる -->
    </select>
  </td>
</tr>
<tr>
  <td> <!-- styleのみ -->
    <span id="b" disabled="disabled"> <!-- ← ※ -->
      <input type="text" id="b" disabled="disabled"> <!-- ← ※ -->
      <label hidden="true">ここに取得したい20桁の数値がある</label> <!-- ← 取得できず、Nullになる -->
    </span>
  </td>
</tr>
<tr>
  <td>
  地のテキスト<br>
  地のテキスト<br>
  地のテキスト <!-- ← td内をまるっと取得できる -->
  </td>
</tr>
</table>
</form>
</body>
</html>

※ ほかにclass、aria-*、ng-*、style 等がある

 

Consoleで深堀った状況

  • $x('labelのフルXPath')でEnter
  • 要素の応答がある
  • インデックス0の要素が一意にヒットする

目的の値が入ってる行

0: label 内
  innerHTML
  innerText
  outerHTML

  childNodes: nodeList(1) の
    0: text 内
      data
      nodeValue
      textContents
      wholeText

  firstChild: text 内
    data
    nodeValue
    textContents
    wholeText

  lastChild: text 内
    同じ

このへんも階層を辿れば、目的の値に辿り着ける模様

parentElement

nextSibling

previousSibling

Consoleで取得できる内容、XPathの要素に入ってる中身の理解が深まった感があります。
何でもできるはずという万能感を、少なくとも錯覚できました。

ChromeコンソールでXPathのテスト - Qiita
https://qiita.com/him0net/items/af2bcb4fd2abbfba8231

ChromeでXPathを取る・検証する - Qiita
https://qiita.com/ywindish/items/5a992c49387d81df900e

 

リサーチのついでに、クリックした箇所のフルXPathを取得するブックマークレットを見つけました。

ブラウザ上のクリックした要素のXpathを取得する - Qiita
https://qiita.com/narikei/items/fb62b543ca386fcee211

最強のXPathを取得できるように加工したら、わたし自身も常用するかも。
ブックマークレット化は、こちらで紹介したことがあります。

https://winactor.com/questions/question/既存ノウハウの一括検索(普段使いや質問前に)/

誰かのアンテナにキャッチされて、「こう加工してより強いXPathを取得できるようにしたよ!」に繋がると嬉しいです。

 

現状のVBA

前提

  • ExcelリストのXPath(name)を順に処理する(値の取得等)
  • ラジオボタンとチェックボックスは、ExcelリストにXPathでなくnameを入力しておく

For r = 1 To 最終行

  XPath(name)が空欄ならスキップ

    XPath(name)の要素がなければスキップ

      テキストなら
        Sheets("Sheet1").Cells(r, 3).Value = driver.FindElemetByXPath(XPath).Text

      プルダウンなら
        Set 要素 = ~.AsSelect.SelectedOption
        ~.Value = 要素.Text

      ラジオボタンなら
        For Each 要素 In ~
          If 要素.Attribute("checked") Then
            要素ID = 要素.Attribute("id")
            XPath = "//label[@for='" & 要素ID & "']"
            ~.Value = ~ByXPath(XPath).Text

      チェックボックスなら
        ラジオボタンとほぼ同じ
        複数チェックありの場合は、取得した値を/で連結

ラジオボタンとチェックボックスは、WinActorのスクリプトをVBAに書き直した感じです。

https://winactor.com/questions/question/chromeのシナリオでtd内にあるラジオボタンオンの値を/

anothersolution 編集済みのコメント
回答とコメントは、会員登録(無料)で閲覧できるようになります。