Document.querySelector () возвращает null, когда элементы DOM уже видны

Я пытаюсь создать автоматический скрипт Puppeteer для загрузки моих ежемесячных банковских операций с веб-сайта моего банка.

Однако я сталкиваюсь со странной ошибкой (см. Прикрепленный Imgur, чтобы увидеть изображения этого поведения)

https://imgur.com/a/rSwCAxj

Проблема: querySelector возвращает null для четко видимого элемента DOM:

Скриншот: https://imgur.com/d540E6p

(1) Поле для ввода имени пользователя четко видно на сайте (https://internet.ocbc.com/internet-banking/), (2) Однако, когда я запускаю document.querySelector('#access-code'), консоль возвращает ноль.

Мне интересно, почему это так, и при каких обстоятельствах браузер возвращает null на querySelector(#id) query, когда узел DOM четко виден.

# Обновлено: странное решение, которое работает:

Я продолжал экспериментировать с браузером и использовал DevTools для проверки элемента DOM и его использования для копирования пути JS.

Как ни странно, после использования Chrome Devtools для копирования пути JS document.querySelector('#access-code') вернул правильный элемент.

Снимок экрана, на котором он возвращает правильный элемент: https://imgur.com/a/rSwCAxj

В обоих случаях для document.querySelector используется одна и та же строка поиска.

Пытался прочитать два раза, но до сих пор не понимаю, о чем вы говорите

quirimmo 06.01.2019 11:45

Попробую перефразировать - спасибо!

Daniel Onggunhao 06.01.2019 11:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
2 119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что вы не можете получить надлежащую отдачу от использования document.querySelector('#access-code'), потому что веб-сайт использует набор фреймов.

На сайте есть фрейм с src для загрузки контента

<frame src = "/internet-banking/Login/Login">

DOMContentLoading выполняется при загрузке основного документа и не дожидается загрузки содержимого фрейма.

Прежде всего, вам нужен слушатель для события загрузки.

window.addEventListener("load",function() {
   ...
 });

И в дальнейшем вы не можете просто использовать document.querySelector('#access-code') потому что ввод, который вы хотите получить, находится внутри фрейма. Вам нужно будет найти способ получить доступ к содержимому фрейма, а внутри него использовать простой querySelector.

Так что-то вроде:

window.addEventListener("load",function() {
   console.info(window.frames[0].document.querySelector('#access-code'));
 });

Кстати, смотрите в: view-source: https://internet.ocbc.com/internet-banking/ похоже, что веб-сайт в основном отображается на стороне клиента.

У меня была ошибка в моем коде, чтобы получить содержимое кадра, необходимо использовать window.frames[0].document. Поэтому, если вы вводите код, который ожидает события загрузки, а затем получаете документ из кадра, все должно работать нормально, я проверил его инъекцию на веб-страницу internet.ocbc.com/internet-banking.

Łukasz Blaszyński 06.01.2019 12:37

Большое спасибо за прекрасное и ясное объяснение !!

Daniel Onggunhao 06.01.2019 15:27

Другие вопросы по теме