Я пишу простой кликбот на JavaScript для выполнения повторяющихся задач на стороннем веб-сайте.Он просто устанавливает входные значения, вызывает метод кнопок click()
и, возможно, я заставлю его перейти к другим URL-адресам того же сайта.Первоначально я использовал Firefox, но получил то же поведение с Internet Explorer.
До сих пор я использую обычный JS, и пока я сам вставляю в каждую команду, все работает нормально, но вот проблема: каждый раз, когда новая страницазагружен (в том числе, когда JS нажимает кнопку отправки), я теряю все переменные и функции, которые я определил.Обратите внимание, что я использую веб-консоль, а не тег <script>
, который, безусловно, будет отброшен при загрузке нового DOM.
Честно говоря, я не совсем понимаю, почему это происходит.Я посмотрел на область видимости JavaScript и документацию window.location
и document.location
. Этот сайт даже упоминал, что «В веб-браузере глобальные переменные удаляются при закрытии окна (или вкладки) браузера, но остаются доступными для новых страниц, загруженных в то же окно».(ср. здесь , но здесь дело не в этом)
Я думал, что это может быть потому, что строгий режим может быть включен по умолчанию, но это вызвало бы ошибку для name = "value"
вместомолча интерпретируя его как локальную переменную.
Согласно этому ответу , любая переменная, объявленная вне каких-либо методов, должна быть глобальными переменными, которые являются свойствами окна.Изменение другого свойства окна (например, местоположения) не должно влиять на них - насколько я понимаю, - но даже при назначении свойств самостоятельно они исчезают, когда я загружаю другую страницу.
Полагаю, это можно обойти, еслиЯ написал свой собственный веб-сайт, на котором есть сайт, который мне нужен, в качестве iFrame, поэтому страница, на которой работает мой скрипт, фактически не будет изменена.Но все же это странно.Кто-нибудь может объяснить это поведение?Есть ли другой (простой) способ обойти это?
[Edit1] Благодаря политике того же происхождения мой предложенный обходной путь с использованием собственного веб-сайта и iframe не работает.Поскольку весь смысл моего кликабота должен быть запущен один раз и проходить по всем страницам самостоятельно, способ передачи данных (т.е. строк, включая JSON) отвечает на этот вопрос, но не решает мою проблему.
[Edit2] Для будущих посетителей: после недавних изменений принятый ответ предоставляет всю необходимую мне информацию.Greasemonkey - это то, что нужно, если вы можете использовать аддоны, но комбинация букмарклетов и стиль SessionStorage позволяет создать достойного бота, который выполняет все шаги между двумя перезагрузками всего одним пользовательским вводом.Другой (уродливый бот, возможно, более мощный) подход - открыть целевой веб-сайт и использовать document.body.innerHTML
и обходной путь iframe.Таким образом, вы обойдете политику, основанную на том же происхождении, и сможете создавать свой собственный веб-сайт по мере необходимости и по-прежнему получать доступ к целевому веб-сайту.