2010-03-04 9 views
120

У меня есть гиперссылка на моей странице. Я пытаюсь автоматизировать несколько кликов по гиперссылке для целей тестирования. Есть ли способ имитировать 50 кликов по гиперссылке с помощью JavaScript?Как я могу вызвать событие JavaScript click

<a href="#" target="_blank" onclick="javascript:Test("Test");">MSDN</a> 

Я ищу ключ запуска onClick из JavaScript.

ответ

164

Добавить идентификатор Вашей ссылки

<a href="#" target="_blank" id="my-link" onclick="javascript:Test('Test');">Google Chrome</a> 

и вызвать его в яваскрипте кода:

var l = document.getElementById('my-link'); 
for(var i=0; i<50; i++) 
    l.click(); 
+1

NB это для быстрой цели тестирования. Для более надежного, совместимого со стандартом, кросс-браузерного решения см. Ответ Хуана. –

+2

Я не понимаю цикл, и это не работает на мобильных устройствах. –

+0

@im_benton: цикл был для конкретных потребностей OP. Если вам просто нужно вызвать событие click, вы можете опустить строку, начинающуюся с 'for ('. – rinogo

8

Использование среды тестирования

Это может быть полезно - http://seleniumhq.org/ - Селен является система автоматизированного тестирования веб-приложений.

Вы можете создавать тесты с помощью плагина Firefox Selenium IDE

Ручная обжиг событий

Чтобы вручную запускать события правильный путь вам нужно будет использовать различные методы для различных браузеров - либо el.dispatchEvent или el.fireEvent где el будет вашим элементом Anchor. . Я считаю, что оба они потребуют построения объекта Event, чтобы пройти в

Альтернативой, не совсем правильно, быстро и грязный путь был бы это:

var el = document.getElementById('anchorelementid'); 
el.onclick(); // Not entirely correct because your event handler will be called 
       // without an Event object parameter. 
74

Вот что я использую: http://jsfiddle.net/mendesjuan/rHMCy/4/

Обновлено работать с IE9 +

/** 
* Fire an event handler to the specified node. Event handlers can detect that the event was fired programatically 
* by testing for a 'synthetic=true' property on the event object 
* @param {HTMLNode} node The node to fire the event handler on. 
* @param {String} eventName The name of the event without the "on" (e.g., "focus") 
*/ 
function fireEvent(node, eventName) { 
    // Make sure we use the ownerDocument from the provided node to avoid cross-window problems 
    var doc; 
    if (node.ownerDocument) { 
     doc = node.ownerDocument; 
    } else if (node.nodeType == 9){ 
     // the node may be the document itself, nodeType 9 = DOCUMENT_NODE 
     doc = node; 
    } else { 
     throw new Error("Invalid node passed to fireEvent: " + node.id); 
    } 

    if (node.dispatchEvent) { 
     // Gecko-style approach (now the standard) takes more work 
     var eventClass = ""; 

     // Different events have different event classes. 
     // If this switch statement can't map an eventName to an eventClass, 
     // the event firing is going to fail. 
     switch (eventName) { 
      case "click": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead. 
      case "mousedown": 
      case "mouseup": 
       eventClass = "MouseEvents"; 
       break; 

      case "focus": 
      case "change": 
      case "blur": 
      case "select": 
       eventClass = "HTMLEvents"; 
       break; 

      default: 
       throw "fireEvent: Couldn't find an event class for event '" + eventName + "'."; 
       break; 
     } 
     var event = doc.createEvent(eventClass); 
     event.initEvent(eventName, true, true); // All events created as bubbling and cancelable. 

     event.synthetic = true; // allow detection of synthetic events 
     // The second parameter says go ahead with the default action 
     node.dispatchEvent(event, true); 
    } else if (node.fireEvent) { 
     // IE-old school style, you can drop this if you don't need to support IE8 and lower 
     var event = doc.createEventObject(); 
     event.synthetic = true; // allow detection of synthetic events 
     node.fireEvent("on" + eventName, event); 
    } 
}; 

Обратите внимание, что вызов fireEvent(inputField, 'change'); не означает, что она будет на самом деле изменениями поля ввода. Типичный пример использования для запуска события изменения - это когда вы устанавливаете поле программно и хотите, чтобы обработчики событий вызывались, поскольку вызов input.value="Something" не вызывает событие изменения.

+0

Эй, Хуан! Ваш пример не определяет JSUtil.NodeTypes.DOCUMENT_NODE – Kato

+0

Я знаю, что речь идет о нажатиях событий, но вы предоставил некоторый общий код здесь, и то, что я вижу, события изменения не будут уволены (я протестировал его, и это не работает для таких событий). Чтобы инициировать события изменения, мне пришлось использовать функцию запуска jquery. –

+0

@AleksanderLech Just Если вы хотите изменить событие, это не означает, что действие будет происходить. Это делается для клика, это не для изменения. Вариант использования событий, в которых изменения не работают, - это когда вы хотите изменить его значение, но хотите все обработчики событий изменения, которые должны быть вызваны (были ли они установлены с помощью jQuery или нет). Я могу предоставить более значимую помощь, если вы зададите новый вопрос с точным кодом, который вы пытались, но не работали. –

19

Мне очень стыдно, что существует так много неправильной или нераскрытой частичной применимости.

Самый простой способ сделать это через Chrome или Opera (мои примеры будут использовать Chrome) с помощью консоли. Введите следующий код в консоли (как правило, в 1 линии):

var l = document.getElementById('testLink'); 
for(var i=0; i<5; i++){ 
    l.click(); 
} 

Это будет генерировать требуемый результат

+1

Почему вы вызываете 'click()' 5 раз, а не только один раз? Я видел, что «instanceof me» сделал то же самое с 'onclick()'. – Seeven

+1

@SeevenByakko, потому что исходный вопрос касался имитации «нескольких кликов». На самом деле это сказало 50, но, надеюсь, изменение вышеуказанного кода с 5 до 50 очевидно для всех :) –

32

Что

l.onclick(); 

делает точно называть onclick функцию l, что есть, если вы установили один с l.onclick = myFunction;. Если вы не установили l.onclick, он ничего не делает.В отличие от этого,

l.click(); 

имитирует щелчок и запускает все обработчики событий, будь то с добавлением l.addEventHandler('click', myFunction);, в HTML, или любым другим способом.

+0

FWIW это работает только на уровне элемента. Если вы добавите событие click к объекту 'window', он не будет магически раскрывать функцию' window.click'. –

1

Справедливое предупреждение:

element.onclick() не так, как ожидалось. Он выполняет только код в пределах onclick="" attribute, но не вызывает поведение по умолчанию.

У меня была аналогичная проблема с переключателем, не установленным для проверки, хотя onclick пользовательская функция работала нормально. Придется добавить radio.checked = "true";, чтобы установить его. Вероятно, то же самое относится и к другим элементам (после a.onclick() должно быть также window.location.href = "url";)

+0

Действительно, использование 'onclick()' означает, что объект 'event' не будет автоматически определен браузером, поэтому общие методы, такие как' event.stopPropagation() ', также не будут определены. – Boaz

-9
angular.element(document.querySelector('selector'))[0].click() 

работает для меня!

+4

Для этого вам понадобится AngularJS. –

7

.click() не работает с Android (см. mozilla docs, на мобильном устройстве). Вы можете вызвать событие щелчка с помощью этого метода:

function fireClick(node){ 
    if (document.createEvent) { 
     var evt = document.createEvent('MouseEvents'); 
     evt.initEvent('click', true, false); 
     node.dispatchEvent(evt);  
    } else if (document.createEventObject) { 
     node.fireEvent('onclick') ; 
    } else if (typeof node.onclick == 'function') { 
     node.onclick(); 
    } 
} 

От this post

+0

Я пытался щелкнуть триггер jQuery, но обнаружил, что он вызывает вызов, а не диспетчеризацию фактического события в DOM. @manolo Ваш метод правильный. –

Смежные вопросы