アプリ版:「スタンプのみでお礼する」機能のリリースについて

chrome ver103.0.5060にver-upされたので、chromedriverもver-upしましたが、
以下の状態が発生するようになってしまいました。
以前のver102.0.5005までは問題なく動いていました。

<症状>

Excel VBAで、何度か以下を動作させると、ほんの時々「If elm2.Text = "次へ>" Then」で
ストップしてしまいます。Set elm1 =‥‥の前後でsleep 1000などを入れる少し良くなる気が
しますが同様に発生します。

「Set elm1 ("#displayArea > div.pager > ul")」や
「elm2.Click」でエラーやストップとなってしまうこともあります。

driver.IsElementPresent(myby.Css("#displayArea > div.pager > ul")でエレメント生成の事前チェックしてもあまり変わりません。

いろいろ調べましたが解決策がわかりません。なにか改善する方法がありますでしょうか?

-------code-------

'次へあるか
Set elm1 ("#displayArea > div.pager > ul")
For Each elm2 In elm1.FindElementsByTag("li")
Debug.Print elm2.Text
If elm2.Text = "次へ>" Then
elm2.Click
txt = get_htmlbody_text()
bl = bl + 1
GoTo nx_bl
End If
Next

質問者からの補足コメント

  • よろしくお願いします。期待して待ってます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/07/07 18:20
  • 有難うございます。
    なるほどと半分理解できましたが、次のことを再度お願いしてよろしいでしょうか。

    1、定数CSS_LARGE_IMAGEの定義について教えて下さい。

    2、「elm2.Wait~(上記ページのいずれかを使って待機)」では、
      https://powervbadesktop.com/web25/を見ましたがうまく繋がらず理解できません。
      (Set elm=Driver.FindElementById("Id名").WaitText("hello",2000) などどなっており、
       .Wait~ではないので‥‥?)
      elm2.Wait~をもう少し具体的に書いていただくと有難いです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2022/07/08 11:48

A 回答 (3件)

1.定数CSS_LARGE_IMAGEの定義について教えて下さい。



 CSSセレクタですね。ご質問文で言えば "#displayArea > div.pager > ul"
 定数の名前は適当に変えて下さい。

2.elm2.Wait~をもう少し具体的に書いていただくと有難いです。

 処理対象の Web ページ構成に左右されるため、具体的な URL が分からない、HTML ソースが確認できない状況では難しいです。
 何を待機しないといけないのか、または、待機以外に原因があるのか。想像しながら回答書くのは結構キツイです。

なので、適当に関係ありそうな幾つかのエッセンスを盛り込んだサンプル書いときます。

Googleニュースで検索をかけて、ページネーションの「次へ」を3回クリックさせてます。


Sub SampleProc()

  Const TIMEOUT As Long = 150000
  
  '/ 対象URLを定義----------------------------------------
  Dim url   As String
  url = "https"
  url = url & "://www.google.com/webhp?tbm=nws"
  '/ -----------------------------------------------------
  
  '/ 各種オブジェクトの用意
  Dim Driver As Selenium.ChromeDriver: Set Driver = New Selenium.ChromeDriver
  Dim Keys  As Selenium.Keys:     Set Keys = New Selenium.Keys
  
  '/ Chrome 起動
  Driver.Start
  
  '/ 対象URLを開く(定数 TIMEOUT を超えるとエラーが発生)
  Driver.Get url, TIMEOUT
  
  '/ 入力ボックスに検索キーワードを送信して検索実行
  Dim element  As Selenium.WebElement
  Set element = Driver.FindElementByCss("form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input", TIMEOUT)
  element.SendKeys "教えてGoo"
  element.SendKeys Keys.Enter
  
  '/ ページが正常にロードされたか確認処理(略)
  
  '/ ページネーションの「次へ」要素をループで3回探してクリック
  Dim i As Long
  For i = 1 To 3
    '↓は動作を確認するために入れた長い Wait
    Driver.wait 5000& '5秒
    
    '/ IDやCSSで「次へ」要素を探す
    Set element = Driver.FindElementByCss("#pnnext", TIMEOUT)
    '/ Click で失敗する時は表示領域内までスクロールさせてみる
    Driver.ExecuteScript "window.scrollTo(0, " & CStr(element.Location.y) & ");"
    '/ ↓Chromeのスクロール待ち、数ミリ秒はあった方がいい
    Driver.wait 300&
    '/ 要素のクリック
    'element.Click
    '↑で失敗する様なら↓のようにJavaScriptでClickを試してみて
    Driver.ExecuteScript "arguments[0].click();", element
  Next
    
  '/ オブジェクトの破棄(略)
  
End Sub
    • good
    • 0
この回答へのお礼

丁寧な解説ありがとうございました。
直ぐには理解できないので、これを参考に、時間をかけて理解して試行して行きたいと思います。
本当にありがとうございました。

お礼日時:2022/07/09 09:39

こんばんは。



VBA(EXCEL)で良いのですよね?

最近神ページを見つけたのでご紹介しておきます。

【Selenium-VBA】Seleniumにおける待機処理をわかりやすく説明します。
https://powervbadesktop.com/web25/

この記事の紹介が直接回答で、以下は私の経験談から。

SeleniumBasic および ChromeDriver がインストールされかつ、
Selenium Type Library を参照設定している前提です。

先の回答で触れました件、Google イメージ検索では IMG タグの src 属性(画像URL)を動的に書き換えてます。
これをプログラムで次々と Click すると書き換えが間に合わなくなり、失敗してしまいました。
その時は次の様に対処しました。

・WaitAttribute を使って src 属性が URL に書き換わるのを待つ

<img src="data:image/jpeg;base64・・・
   ↓
<img src="https://・・・

実際コードはこんな感じ。

 ' / 画像の要素を取得する(動的にsrcを書き換えているので待機)
 Set g_large_image = driver.FindElementByCss(CSS_LARGE_IMAGE).WaitAttribute("src", ".?://", TIMEOUT_MILISECOND)

※CSS_LARGE_IMAGE や TIMEOUT_MILISECOND は定数で宣言してます

まとめます。
何をもって待機とするかは Web ページの構造次第なので明確なサンプルは提示できません。

 '/ タイムアウト(ミリ秒)最大15秒 長めに
 Const TIMEOUT_MILISECONDS As Long = 15000

 Dim driver As Selenium.ChromeDriver
 Dim elm1 As Selenium.WebElements
 Dim elm2 As Selenium.WebElement

 '中略
 Set elm1 = driver.FindElementsByCss("#displayArea > div.pager > ul")

 For Each elm2 In elm1.FindElementsByTag("li")
   elm2.Wait~(上記ページのいずれかを使って待機)
この回答への補足あり
    • good
    • 0

例えばsleep 8000などとし、待機時間を長く取った場合に安定するのであれば、ページロード、または動的に追加される要素の場合は Script の処理待ちの問題ですね。



少し前にGoogleのイメージ検索で画像収集するウェブスクレイピング処理をSeleniumで書きました。

スクロールで次々に要素が追加されるページでしが、その要素の存在確認をすると、処理完了前にTRUEが返ってしまい、それを目安にウェイトできなかったと記憶しています。

確か Until プロパティともう1つ何かを使って解決したような?

環境が今手元にないため、帰ったら確認してみます。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!