LINUX.ORG.RU

DOM: выявить все элементы при клике на которые что то произойдёт


1

1

Возможно ли в DOM выявить все элементы при клике по которым что то произойдёт? Требуется для написания скрипта по сбору всех ссылок спрятанных в onclick events. Пишется с помощью PhantomJS. Желательно даже не просто что то произойдёт а конкретно произойдёт переход на другую страницу.


конкретно переход на другую страницу нельзя, но в фантоме ты можешь этот момент отловить вызвав это событие и увидев что location меняется. или просто в js вызывать событие с переходом и слушать onbeforeunload или onunload

wwwsevolod
()

Яваскриптом в общем-то нельзя. Браузеры с нормальными средствами разработчика это умеют делать. Не знаю как именно работает Фантом.

Из костылявых путей - распарсить скрипты (так например работает google://Visual+Event) или перебрать все способы которыми их можно навесить (прочитать on* аттрибуты всех объектов, переопределить addEventListener...)

Kalashnikov ★★★
()

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

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

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

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

Надо собрать все ссылки со страницы в том числе которые организованы с помощью onclick events. Начал делать скрипт который перебирает все элементы и на каждый кликает. Только не понятно как выяснить только что кликнутый элемент меняет URL или нет (что бы остановить цикл).

var ev = document.createEvent("MouseEvents");
ev.initEvent("click", true, true);
item.dispatchEvent(ev);

Было бы очень кстати если бы dispatchEvent(ev) возвращало это. Хотя может быть есть и какая то другая ф-ция. По своему опыту могу сказать что DOM укуренный, сколько раз выяснялось что в нём есть что то о чём не знал не смотря на то что искал в гугле весь день, тем более что обычно jquery бывает достаточно.

В настоящее время реализую таким образом: кликнуть на каждый элемент последовательно, подождать будет ли меняться URL (в PhantomJS page.onNavigationRequested). Собственно с подождать проблема из-за асинхронности javascript'а. Ну что стоило добавить классический sleep(seconds). А тут придётся раскладывать код по ф-циям и использовать setTimeout/setInterval. Непривычно, думаю как сделать.

tyler19
() автор топика
Ответ на: комментарий от tyler19

ну вот, ожидание изменения урла уже есть, другой метод был бы выяснить как через апи (location.href = "; location.assign) сменить урл и застабить эти методы (location.href = function () ...); теперь перепиши все в асинхронном стиле (колбеки или контрол-флоу)

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

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

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

Т.е. можно присвоить location.href ф-ю и она будет выполняться перед переходом? А что по поводу возвращаемого значения, разрешить/запретить? В любом случае придётся делать паузу между каждым кликом, хотя скорее всего не большую.

tyler19
() автор топика
Ответ на: комментарий от tyler19

нет. есть функция location.assign, возможн location.href ее и вызывает. короче глянь sinon.js там есть разне шпионы и заглушки. тебе надо подменить реализацию «перехода по ссылке» на свою, которая это все записывать будет

trashymichael ★★★
()
Ответ на: комментарий от void

Умеют посредством страшных костылей. По той простой причине что сам веб - один сплошной костыль.

tyler19
() автор топика
Ответ на: комментарий от void

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

Но для задачи ТС это бесполезно всё равно, это только для дебага. Хотя хз, может и апи для этого есть у какого-нибудь.

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Мне для дебага и интересует.

Да, для конкретного элемента и его родительских элементов можно посмотреть забинденные эвенты. Круто. Но хотелось бы иметь обратную возможность - т.е. увидеть для конкретного эвента все элементы дома, на которые он забинден :)

void
()
Ответ на: комментарий от void

Ну если только для дебага, что мешает просто посмотреть на какие элементы (на какой селектор) вешаешь обработчик?

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

так и приходится делать - смотреть по коду. Но хочется же не самому напрягаться, а повесить это дело на машину.

void
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.