Нажатие кнопки на странице с помощью Greasemonkey / userscript в Chrome - PullRequest
5 голосов
/ 19 ноября 2011

Я собираюсь быть здесь как можно более многословным, так как столкнулся с несколькими решениями, которые не закончились неудачей.Пожалуйста, имейте в виду, что я не знаю Javascript .Я знаю основные HTML и CSS.У меня нет никакого реального опыта программирования, но я пытаюсь учиться понемногу, исследуя основные задачи, подобные этой.Пожалуйста, говорите со мной, как будто я идиот.Любой жаргон, который я использую в этом посте, я узнал во время исследования этой конкретной проблемы.Я пишу этот скрипт как личный проект и делюсь с друзьями.

Что я пытаюсь сделать.

Я пытаюсь написать скрипт пользователя для Chrome / Greasemonkey (Chrome - мой целевой браузер), который нажимает кнопку Обновить в браузере сервера Battlefield 3.Для тех из вас, кто не знает, Battlefield 3 использует веб-сайт в сочетании с плагином для браузера для VOIP и запуска игры через браузер сервера.Кажется, что большая часть этого кода - довольно простой HTML, организованный в виде таблиц.

Идея состоит в том, что при просмотре главной страницы для сервера, который заполнен, скрипт нажимает кнопку Обновить .каждые три секунды или около того, пока страница не сообщит об открытой точке на сервере, затем остановите цикл обновления и нажмите кнопку присоединиться к серверу.Я уже запустил ту часть скрипта, которая опрашивает сервера на текущее и максимальное количество игроков, а затем присваивает их своим переменным.

На данный момент я пытаюсь получить щелчок для работы в консоли, поэтомуЯ действительно могу использовать его в своем сценарии, и мне не повезло.

Код, которым я пытаюсь манипулировать.

Это div для кнопки, которую я пытаюсьчтобы щелкнуть по инструменту Chrome dev:

<div class="serverguide-header-refresh-button alternate show"> 
<div type="reset" class="common-button-medium-grey">
<p style="position: relative;">
<a href="/bf3/servers/show/c7088bdc-2806-4758-bf93-2106792b34d8/">Refresh </a>
</p>
</div>
</div>

(Эта ссылка не является статичной. Это ссылка на определенную страницу сервера)

То, что я пробовал.

Чтобы найти кнопку, которую я использую getElementsByClassName.У него нет уникального идентификатора, но класс уникален для этого элемента на этой конкретной странице, поэтому getElementsByClassName("serverguide-header-refresh-button")[0] каждый раз вытягивает правильный div.Проблема в том, что сценарий выполняет любое действительное действие над кнопкой.

document.getElementsByClassName("serverguide-header-refresh-button")[0].click();

Теперь я понимаю, что это не сработало, потому что это не обычная кнопка отправки.Я не понимаю специфику стандарта здесь, но получаю, что он не поддерживает метод .click().

function addJQuery(callback) {
  var script = document.createElement("script");
  script.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js");
  script.addEventListener('load', function() {
    var script = document.createElement("script");
    script.textContent = "(" + callback.toString() + ")();";
    document.body.appendChild(script);
  }, false);
  document.body.appendChild(script);
}

// the guts of this userscript
function main() {
  unsafeWindow.jQuery('.serverguide-header-refresh-button')[0].click();
}

// load jQuery and execute the main function
addJQuery(main);

Это просто unsafeWindow.jQuery('.serverguide-header-refresh-button').click();, завернутый в некоторый код для загрузки jQuery для пользовательских скриптов,Это было немного, что я взял в другом месте, но мне сказали, что это будет работать, только если jQuery был загружен на страницу.Я подумал, что это стоит попробовать.Это один из тех Я понятия не имею, что я делаю снимков в темноте, и это не сработало.Я попробовал то же самое ниже с другим фрагментом кода jQuery, который я взял:

function addJQuery(callback) {
  var script = document.createElement("script");
  script.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js");
  script.addEventListener('load', function() {
    var script = document.createElement("script");
    script.textContent = "(" + callback.toString() + ")();";
    document.body.appendChild(script);
  }, false);
  document.body.appendChild(script);
}

// the guts of this userscript
function main() {
   var evObj = document.createEvent('Events');
      evObj.initEvent("click", true, false);
      document.getElementsByClassName('serverguide-header-refresh-button')[0].dispatchEvent(evObj);
}

    // load jQuery and execute the main function
addJQuery(main);

Оба эти возвращаемых значения Undefined в консолях Chrome и Firebug.

ИтакКто-нибудь будет так любезен, чтобы помочь мне создать немного кода для этого сценария, чтобы нажать кнопку Обновить на этой странице?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2011

Примечание:

  1. jQuery .click() не работает надежно с событиями кликов, которые не были установлены с помощью jQuery, в первую очередь.

  2. Вам необходимо создать правильный тип события; createEvent('Events') не так.

  3. Как указал Джим Девилл, псевдокнопка ссылки не была выбрана.

  4. Для этого вам пока не нужен jQuery.

  5. Убедитесь, что элемент управления «Обновить» загружен статически для тестового кода, как показано в вопросе. Если это AJAXed, попытка щелчка может сработать слишком рано.

Если сложить все вместе, следующий код должен работать. Но имейте в виду, что некоторые сайты (например, определенные приложения Google) используют причудливые, чувствительные к состоянию проекты, которые требуют последовательности событий.

var refreshBtn = document.querySelector (
    "div.serverguide-header-refresh-button div[type='reset'] a"
);
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent ('click', true, true);
refreshBtn.dispatchEvent (clickEvent);
0 голосов
/ 19 ноября 2011

Итак, вы на правильном пути, но вы продолжаете захватывать DIV, а не тег A. Чтобы нажать «кнопку» (в данном случае ссылку), вам нужно нажать на фактическую ссылку, потому что она не будет туннелировать до элементов, содержащихся в DIV.

document.querySelector('serverguide-header-refresh-button a')

Должен принести вам элемент A, на который нужно нажать. Из jQuery $('serverguide-header-refresh-button a').click(); должно работать.

...