プロが教えるわが家の防犯対策術!

お世話になっております。JavaScript で自動化をやっておりまして、
要約すると取得したオブジェクトが複数なのに1個にしか見えないと言う
問題を解決したいのです。

今画面に三角ボタンが2つ配置されておりプルダウンの機能があります。
三角ボタンのクラス名を取得し、そのクラスオブジェクトに対して、
クリックを行ったのですが、2つともプルダウンします。

そこで検証のディペロッパー画面で解析したのですが、
2つを区別するものがありませんでした。
sankaku.length がアンデファインドとなっていたし、
何かが2個と言うプロパティは見つかりませんでした。

思うにこれは1つのクラス名で作成したボタンを
2ヶ所に配置している為だと思います。

ボタンの位置で分けようと .top の値の上と下の数値を探しましたが、
その様なプロパティは見つかりませんでした。

以下にコードを示します。アドバイスかヒントの程、よろしくお願いします。
sankaku = document.getElementsByName("sankaku-button")[0];
sankaku.click();

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

  • Google Chrome を使っておりマニフェストを作成すれば、
    JavaScriptで画面を操作できるところまでこぎつけました。
    ブックマークレットが何かもよく分からない初心者です。

    見よう見まねでプログラミングに成功し、
    画面のフィールドに値を連続投入したりできる程になりました。

    中身が公表されない画面を解析して
    自分の好みにスクリプトを組み込んで操作するので、
    画面の仕様は分からない状態です。

    画面に情報を入力して読み込みボタンを押すと、
    プルダウンの情報がたたまれてしまうので、
    新しい情報を入力をしても、
    1秒毎に三角ボタンを押して常にプルダウンで
    詳細を表示した状態にしようと言う趣向です。

    逆に2個プルダウンしてしまう今の作り込みでは、
    画面が縦に広がり過ぎて必要な情報が
    スクロールの下に出て隠れてしまうと言う問題が発生。
    これを何とかしたい。とこの様な状態です

    No.3の回答に寄せられた補足コメントです。 補足日時:2021/04/22 21:10
  • アドバイスありがとうございます。
    getElementByIdをしようにもIDが設定されていないようでした。
    取得したオブジェクト sankaku.Id は undefined になりました。
    "sankaku-button"はディペロッパー画面に載っていたので調べることができましたが、
    getElementByIdに指定する名前を調べる方法が分かりませんでした。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/04/22 21:26
  • アドバイスありがとうございます。まさにその通りです。
    devtoolsでブレークポイントを設定して問題の部分で止め解析したのですが、
    2つを区別するようなものは見当たりませんでした。
    ふと思ったのですが、ペアレントで親の属性を参照すれば、
    親から違いを見つけられるかもしれません。

    devtoolsのURLありがとうございます。色々探しましたが、
    ここまでの解説はなかなか見当たらず、大変感謝しております。

    拡張機能で Chromeに右クリックメニューを追加して、こんな時はこれと、
    便利な機能を追加しています。おかげで Chromeからエクセルにデータ取得、
    エクセルからChromeに連動とかもメニューに機能を追加してこなせるようになりました。
    土日を挟んでしまい検証できないので、また試みてみます。

    アドバイス大変感謝しています。ありがとうございました。

    No.5の回答に寄せられた補足コメントです。 補足日時:2021/04/23 20:42

A 回答 (5件)

こういうことでしょうか?



・chromeの拡張機能を自作している。
・会社のシステムなので、htmlは書換えできない。
・chromeの、検証のディペロッパー画面(devtools)は使える。

わたしは拡張機能はよく知らないので、
その部分で役に立つ回答はできませんが、
とりあえず、devtoolsが使えるのなら、

ctrl + shift + Jで、コンソール画面を出して、
document.getElementsByClassName('sankaku-button');
を入力して、2つの要素が出てくるかどうか
確認してみるのはいかがでしょうか。

参考:https://murashun.jp/article/performance/chrome-d …

要素が2つ出てくるなら、[0]と[1]でそれぞれ操作できるはずです。
もし要素が2つ出てこないなら、何か(セキュリティとか?)の理由で
手の込んだ作り方をしていると思われるので、
ソースコード見ないで解決するのは困難だと思います。
この回答への補足あり
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。
結局ペアレントで親の属性を参照し、
親が所持している子供の数の相違で識別することができました。

お礼日時:2021/04/26 19:14

No3です



補足を読んでもまったく要領を得ません。

どうやら、どこかのサイトというわけでもなさそうなので、ご自分で作ったHTMLということで良いのでしょうか?

>画面に情報を入力して読み込みボタンを押すと、
>プルダウンの情報がたたまれてしまうので、
その仕様が悪いとしか言えません。
たたまれないようにすれば済む話ではないのですか?

>1秒毎に三角ボタンを押して常にプルダウンで
>詳細を表示した状態にしようと言う趣向です。
最悪のドツボにはまってませんか?
臭いの元を放置して、芳香剤をぶちまけたら、その匂いがきついので、消臭剤を振り撒く・・・

>getElementByIdをしようにもIDが設定されていないようでした。
HTMLにidを振れば済む話です。
とは言え、それで解決するとも思えませんけれど・・・
(要素の取得の問題ではないのでしょうから)

No3にも記しましたけれど、いずれにしろ、文書の構成や仕組みが不明のままでは、症状のみをいくら叫ばれても、対処法はわかりかねます。
(No3に示した、いくつかの疑問点さえ不明のままですし…)
    • good
    • 0
この回答へのお礼

いえいえ。どこかのサイトと言うより自社のクラウドシステムです。
Chromeで動作しており、これがまた使いづらいと。
改善には開発元に数百万円の投資が必要なので、
せめて自分で使う分には動作仕様を変えようと言う趣向です。

画面にある名前から宛先データベースと照合して、
自動でメールを出すなんてのを作ったもので、
気をよくして今回のテーマを実現している次第です。

詳しくアドバイスをしていただき感謝しております。
ディベロッパーツール画面の使い方もようやく分かって来たし、
特に納期はないので勉強しつつ、地道にやって行こうと思います。
ありがとうございました。色々とがんばってみます。

お礼日時:2021/04/23 05:54

こんにちは



曖昧模糊としているので、状況がまったくわかりませんけれど・・・
HTMLに組み込んだスクリプトの話でしょうか?
それとも、ブックマークレットとか?

素のスクリプトなら、ご提示の変数:sankaku は単一オブジェクトのはずです。
また、仮に、複数オブジェクトだとするなら、それに対して
>sankaku.click();
は、エラーになるはずです。

>クリックを行ったのですが、2つともプルダウンします。
HTML内に他のスクリプト等が動作していませんか?
あるいはCSS等で連動するような仕組みになっているとか…
直接の手操作でクリックした場合には、発生しない事象ということなのでしょうか?

>画面に三角ボタンが2つ配置されておりプルダウンの機能があります。
通常のSelect要素ではなさそうなので、CSSかスクリプトでプルダウンさせているものと推測しますけれど、どういう仕組みのものなのでしょうか?

一方で、
>自動化をやっておりまして
>2つともプルダウンします
何を目的としているのか不明ですけれど、単なる操作なので、両方プルダウンしたところで別に問題はなさそうにも思われます。
そもそも、「操作を自動化」しないとできない内容なのでしょうか?
(操作などせずに、直接結果を得ることはできないのですか)


※ 事象を再現可能な簡略化したHTMLと、最終的になさりたいことを提示していただければ、わかるかも知れません。
この回答への補足あり
    • good
    • 0

>クリックを行ったのですが、2つともプルダウンします。


これだけの情報ではわからないですね。プルダウンの具体的な
実現方法が必要。

>sankaku = document.getElementsByName("sankaku-button")[0];
>sankaku.length がアンデファインドとなっていたし、

document.getElementsByNameの返してきたノードリストの最初の
ノードを [0] で選択しているのだから当然です。
ノードリストなら lengthが使えます。
    • good
    • 0

id要素を指定して、getElementByIdはだめですか?

この回答への補足あり
    • good
    • 0

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