2013-12-03 3 views
0

Итак, вот моя проблема.JavaScript Автоматическое нажатие

Мне нужно написать сценарий, который будет запущен в консоли (или через Greasemonkey), чтобы автоматизировать щелчок определенных ссылок, чтобы проверить их вывод.

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

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

Вот мой сценарий до сих пор:

function pausecomp(ms) { 
    ms = ms + new Date().getTime(); 
    while (new Date() < ms){} 
} 

var itemlist, totalnumber, i; 
itemlist = document.getElementsByClassName("image"); 
totalnumber = parseInt(document.getElementById("quickNavImage").childNodes[3].firstChild.firstChild.nodeValue.replace(/[0-9]* of /, "")); 
for(i = 0; i < totalnumber; i = i + 1) { 
    console.log(i); 
    itemlist[i].childNodes[1].click(); 
    pausecomp(3000); 
} 

Теперь TOTALNUMBER получает меня общее количество эскизов, очевидно, и затем Перечень материалов приведен список Get-состояние элементов, так что я могу получить доступ к самой ссылке.

Если я запустил itemlist [0] .childNodes [1] .click(), он работает отлично. То же самое с 1, 2, 3 и т. Д. Однако в цикле он ничего не делает, и он просто сбой как Firefox, так и IE. Мне не нужны возможности кросс-браузера, но я в замешательстве.

+1

Вы можете использовать [Селен] (http://www.seleniumhq.org/projects/ide/) для этого вместо этого? – admdrew

+0

Я полагаю, что мог, но я никогда раньше не использовал Selenium, и я не понимаю, почему JavaScript не работает. Глядя на Селен, это кажется очень запутанным. –

+0

Загрузите IDE и попробуйте сделать запись того, что вы хотите сделать; который будет генерировать некоторые скрипты, с которыми вы можете играть. – admdrew

ответ

0

Люди были верны с SetInterval.

Для записи, вот завершенный код:

/*global console, document, clearInterval, setInterval*/ 
var itemlist, totalnumber, i, counter; 
i = 0; 

function findmepeterpan() { 
    "use strict"; 
    console.log("Currently viewing " + (i + 1)); 
    itemlist[i].scrollIntoView(true); 
    document.getElementById("headline").scrollIntoView(true); 
    itemlist[i].style.borderColor = "red"; 
    itemlist[i].style.borderWidth = "thick"; 
    itemlist[i].childNodes[1].click(); 
    i = i + 1; 
    if (i === totalnumber) { 
     clearInterval(counter); 
     console.log("And we're done! Hope you enjoyed it!"); 
    } 
} 

function keepitup() { 
    "use strict"; 
    if (i !== 0) { 
     itemlist[i - 1].style.borderColor = "transparent"; 
     itemlist[i - 1].style.borderWidth = "medium"; 
    } 
    findmepeterpan(); 
} 

itemlist = document.getElementsByClassName("image"); 
totalnumber = parseInt(document.getElementById("quickNavImage").childNodes[3].firstChild.firstChild.nodeValue.replace(/[0-9]* of /, ""), 10); 
counter = setInterval(keepitup, 1500); 
0

Существует встроенная функция JS «setInterval (afunction, interval)», которая продолжает выполнять заданную функцию каждые «интервалы» миллисекунд (1000 = 1 с).

+0

Я пробовал это к тем же результатам. –

+0

Показать полный код. – spectre

+0

Как общее примечание: 'setInterval' становится очень неточным довольно быстро. Если вы действительно заботитесь о сроках вообще, вам лучше не использовать его. [Ссылка на лучшие решения] (http://www.sitepoint.com/creating-accurate-timers-in-javascript/) –

0

Этот fiddle показывает, как использовать setTimeout для работы через массив. Вот код:

var my_array = ["a", "b", "c", "d"]; 

function step(index) { 
    console.log("value of my_array at " + index + ":", my_array[index]); 
    if (index < my_array.length - 1) 
     setTimeout(step, 3000, index + 1); 
} 

setTimeout(step, 3000, 0); 

Каждые 3 секунды, вы увидите на консоли что-то вроде:

value of my_array at x: v 

где x является индексом в массиве и v является соответствующее значение.

Проблема с вашим кодом в том, что ваш цикл pausecomp является формой оживленного ожидания. Предположим, у вас есть 10 предметов. Ваш код нажимает на элемент, вращается в течение 3 секунд, щелкает элемент, вращается в течение 3 секунд и т. Д. Все ваши клики делают queueing событий, которые нужно отправить. Однако эти события не отправлены, пока ваш код не завершит выполнение. Он завершает выполнение после того, как все клики поставлены в очередь и (примерно) 30 секунд (в этом гипотетическом сценарии) истекло. Если количество элементов больше, это еще хуже.

Использование setTimeout, как указано выше, позволяет виртуальной машине JavaScript восстановить управление и позволяет отправлять события. Документация по setTimeout доступна here.

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