質問するログイン新規登録

Q&A

解決済

2回答

1199閲覧

HTML要素が見つかりません

samuraijapan

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2022/03/25 10:44

0

0

お世話になります。

エクセルVBA初心者です。
VBAでchromeのwebスクレイピングをしようとしていますが、NoSuchElementErrorが出て上手くいきません。
どうやらbody > main > div > div > iframe > html > body > div > form > div > dl > dd > inputの要素が無いという事の様ですが、どうすれば上手く指定できるか分かりません。

初心者の質問で申し訳ありませんが、お教え頂けますと幸いです。
宜しくお願い致します。

コードは以下の通りです。

VBA

1Sub FXブロードネットログイン() 2 3Dim driver As New ChromeDriver 4Dim ky As New Keys 5 6driver.Get "https://www.fxbroadnet.com/demo_exchange.jsp" 7 8driver.Window.Maximize 9 10Application.Wait (Now + TimeValue("00:00:3")) 11 12driver.SendKeys (ky.Space) 13 14Application.Wait (Now + TimeValue("00:00:3")) 15 16driver.FindElementByCss("body > main > div > div > iframe > html > body > div > form > div > dl > dd > input").SendKeys "〇〇" 17 18Application.Wait (Now + TimeValue("00:00:3")) 19 20driver.FindElementByCss("Button").Click 21 22Application.Wait (Now + TimeValue("00:00:10")) 23 24driver.Close 25Set driver = Nothing 26 27End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答2

0

ベストアンサー

webスクレイピングなるものはやったことはないですが、ざっとコードを見る限り、指定した場所に要素が無いんでしょう😅(あとはiframeをまたいでいるのが怪しいかな?勘ですが👀)
パソコンはバカ正直ですよ!空気は全く読んでくれません😆

対象のHPにアクセスして、DOM構造をたどってみましたが、「ログインIDに値を挿入したい」というのがやりたいことなのでしょうかね?

まず一番気になったのは、「body > main > div...」とどんどん子要素をたどっている書き方👀
まぁ...完全に間違っているとは言いませんが、対象HPの構造が少し変わるだけでアウトになります(広告1個追加されるだけでアウトになる可能性も👀)。
CSSでも「>」を使う事はかなりまれです👀

せっかくidclassnameが指定されているのですからそれを使って指定するべきかと思います。
#js-container .login-input input[name="loginId"](スペースの有無にもかなりの意味があるので注意!)
※詳しくは「CSS セレクタ」あたりで調べるとかなり出てきます。

ただ、やはり気になるのはiframeなんですよね😑
iframeは別のページを埋め込むときに使う物なので、ChromeDriver?が辿れるように出来ているのかどうか少し不安です。一番最初に指定しているURLのページとiframeの中のページのURLは別物ですからね👀

もし、それを検証したければ、質問者さんのコードの「body > main > ...」の所を右から1要素ずつ消して行ってみてください。iframeまでなら対象のエラーが出ない...なんて可能性もありますよ👀

iframeの中をどうしても参照できない...というのならiframeの参照先は「https://demo.fxtsys.com/fxtss/fxsysCall.jsp 」と書かれているので、そちらから参照すれば良いのかもしれませんね。

サイトの構造を詳しく見るときはGoogleChromeのデベロッパーツールで確認するのがお勧めですよ!

私はVBAからWeb参照をしたことはないので推測だけで話していますが、参考になれば幸いです😊

投稿2022/03/25 14:05

HiraKazu1124

総合スコア322

samuraijapan

2022/03/26 11:54

お世話になります。 こんな初心者にお時間を割いて大変多くのコメントを送って下さいまして、本当にありがとうございます。 大変参考になりましたが、私が無知のせいで未だ解決には至っておりません。 #js-container .login-input input[name="loginId"]を示して頂いておりますが、こちらのコードはどこに記載すれば宜しいでしょうか? driver.FindElementByCss()の()内に記載するとコンパイルエラーが出てしまい、先に進む事が出来ませんでした。 本当に無知で申し訳ありませんが、ご教示頂けますと幸いです。 何卒宜しくお願い致します。
HiraKazu1124

2022/03/27 01:32

あ〜おそらくダブルコーテーション「"」のエスケープをしなければいけないからでしょうかね🤔 「a"b"c」という文字をVBAであらわそうとして、「"a"b"c"」と入力してもエラーです。 パソコンからは、"a"という文字列のあとにb?、その後に"c"の文字列?訳分からん😑...となるわけです。 回避策として、「"」を表現するときは「""」と入力します。 「"a"b"c"」を表したいなら「"""a""b""c"""」とすれば大丈夫です😊 `"#js-container .login-input input[name=""loginId""]"` とすれば大丈夫だと思います。
samuraijapan

2022/03/27 13:59

お世話になります。 ご回答頂きまして、ありがとうございます。 教えて頂いたコードを入れてみましたが、なかなか上手くいっていない状況です。 しかし、Yahooのサイトの検索ボックスには以下のコードで文字を入力して検索まですることはできました。 Yahooのサイトで出来る事がFXサイトでは出来ないという事なのでしょうか? お分かりになればで構いませんので、お教え頂けますと大変助かります。 宜しくお願い致します。 Sub Yahoo入力() Dim driver As New ChromeDriver driver.Get "https://www.yahoo.co.jp/" driver.Window.Maximize Application.Wait (Now + TimeValue("00:00:3")) driver.FindElementByCss("#ContentWrapper > header > section._1o9PYyvuVafb5hd9eJ9rYX > div > form > fieldset > span > input").SendKeys ("ニュース") driver.FindElementByCss("Button").Click Application.Wait (Now + TimeValue("00:00:10")) End Sub
HiraKazu1124

2022/03/27 14:05

それならやはり初めに回答したようにiframeがあるかどうかで結果が変わっているのではないでしょうか? https://demo.fxtsys.com/fxtss/fxsysCall.jsp からのログインは試してみましたか? `"#js-container .login-input input[name=""loginId""]"` あと前の回答で上記のように書きましたが、「`」は入れてないですよね?念のため😅 コードに書くのはあくまでも「"#js-container .login-input input[name=""loginId""]"」の部分です。 回答の時は「`」で挟むと式として扱われるんですが追記では扱われないもので... 癖で打ってしまっていました😅
samuraijapan

2022/03/28 02:32

いつもご丁寧なご回答ありがとうございます。 `も入れておらず、driver.FindElementByCss("#js-container .login-input input[name=""loginId""]").SendKeys ("〇〇")という形で記載してhttps://demo.fxtsys.com/fxtss/fxsysCall.jspでも試してみましたが、残念ながら上手くいきませんでした。 しかし、色々と試した結果driver.Get "https://demo.fxtsys.com/fxtss/fxsysCall.jsp"のサイトでdriver.FindElementByCss("body > div.login-wrapper > form > div.login-input > dl > dd:nth-child(2) > input").SendKeys ("〇〇")と記述したら何故か出来ました。 body > div.login-wrapper > form > div.login-input > dl > dd:nth-child(2) > inputの部分はデベロッパーツールで要素をCopy→Copy Selectorで取得することが出来ました。 途中なかなか出来なくて挫けそうにもなりましたが、HiraKazu1124さんのお蔭で最後まで頑張る事ができました。 本当にありがとうございました。
HiraKazu1124

2022/03/28 03:36

何故か出来たと言うより、iframeが問題なんだと思いますよ👀 iframeの外からiframeの中のページに「FindElementByCss」でアクセス出来ないんだと思います。 iframeの中身は別のページですから言われてみれば無理もないなという感じではあります。 https://kazusa-pg.com/python-selenium-iframe/ 上記はPythonの例ですが、一応iframeを操作するための機能も用意されているらしいので、VBAでも出来るとは思います。 switch_to.frame でiframeの中のページを操作対象に出来るということかな🤔 とはいえ、現在のリンク先でも大丈夫なら解決して良かったです😊
guest

0

This error typically occurs when the element you're trying to locate does not exist or cannot be found in the HTML structure of the page.

To troubleshoot and specify the element correctly, you can follow these steps:

Verify the HTML structure: Inspect the web page using Chrome's Developer Tools or any other browser's developer tools. Ensure that the element you are trying to locate exists in the HTML structure as you specified in your code.

Check if the element is within an iframe: If the element you're targeting is within an iframe, you need to switch the driver's context to the iframe before interacting with the element. Use the SwitchTo method to switch to the desired iframe using its index, name, or ID. For example:

vba
driver.SwitchTo.Frame "iframe_name" ' Replace "iframe_name" with the actual name or ID of the iframe
Use a more specific CSS selector or XPath: If the element's CSS selector you provided doesn't work, try using a more specific CSS selector or XPath to locate the element. Inspect the HTML structure to identify unique attributes or parent elements that can help narrow down the selection. For example, you can try using:

vba
' Example using a more specific CSS selector
driver.FindElementByCss("div.form > dl > dd > input").SendKeys "〇〇"

' Example using XPath
driver.FindElementByXPath("//div[@class='form']//dl//dd//input").SendKeys "〇〇"
Use explicit waits: Introduce explicit waits to ensure that the element is fully loaded and accessible before interacting with it. You can use the Wait method or the WebDriverWait class. For example:

vba
' Example using Wait method
Application.Wait (Now + TimeValue("00:00:3")) ' Wait for 3 seconds

' Example using WebDriverWait
Dim wait As New WebDriverWait(driver, 10) ' Wait for a maximum of 10 seconds
Dim element As Object
Set element = wait.until(ExpectedConditions.ElementExists(By.CssSelector("div.form > dl > dd > input")))
By following these steps, you should be able to locate and interact with the desired element successfully. Remember to adjust the CSS selector or XPath as per the actual HTML structure of the web page you are scraping.

If you continue to encounter issues, please provide additional details about the specific error message or the HTML structure of the page, and I'll be happy to assist you further.

Thanks

投稿2023/05/18 11:03

Jamesmillere

総合スコア6

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問