Написать функционал на JavaScript
1 написать функцию поиска всех фреймов на странице FindAllFrames которая вернет массив documentElement всех фреймов на странице к которым можно получить доступ
2 написать функцию FindAll (selector, text, visible, dmid, documentRoot)
она пробежится по всем фреймам и найдет все элементы на них с помощью следующей функции
3 function FindAllElements (selector, text, visible, dmid, documentRoot)
selector это CSS3 селектор
text Это text содержащийся в outerHTML найденого selector
visible видимость элемента на странице. если он 1 то ищем только видимые элементы, если 0 то все видимость определяется не только по текущему элементу, но также и по все родительским
dmid если он указан, то сначала находим элемент [dmid]; и уже внутри него проводим поиск с учетом selector text и visible
documentRoot это documentElement нужного фрейма по умолчанию = document
возврат хеш массив
{dmid, x, y, width, height, inView}
dmid это специальный id который присвоен нужному элементу
x,y, это координаты элемента относительно левого верхнего угла браузера с учетом всех скролов
после нахождения элемента протестировать через document.elementFromPoint что в этих координатах нужный элемент если нет найти его (проблема возникает с ссылками которы расположены на нескольких строках)
width, height ширина и высота элемента
inView 1/0 этот элеменит находится в видимой части браузера или нет т.е. чтобы нажать на его мышкой мы должны что-то скролить или нет
возьмем пример html кода
FindAllElements ("*", "text", 1, "", document);
Эта функция найдет только 1 элемент - input visibleInput
Потому что у второго input родитель невидимый, его видимость определяется функцией типа вот такой:
function IsVisible (e)
{
if (!e)
return false;
var display = window.getComputedStyle(e, null).getPropertyValue("display");
var visible = window.getComputedStyle(e, null).getPropertyValue("visible");
if (display == "none" || visible == "hidden")
return false;
if (e.parentElement)
return DMIsVisible(e.parentElement);
return true;
}
div#d1 содержит в себе текст "text" но при поиске вхождения текста в outerHTML мы возвращаем только самый внутренний глубже всех вложенный элемент
пример
вернет весь div
FindAllElements ("*", "link1")
вернет a
FindAllElements ("*", "link")
вернет span
после того как найден элемент по selector, text и visible
Проверяется наличие у него атрибута dmid если нет то присваеваем и возвращаем его вот так
dmid = 'i' + Math.random().toString(36).substr(2, 9);
Тестировать можно на странцице http://t.tomska.com/jsbwebtest/
Координаты каждого элемента на странице должены корректно находится, с учетем всех вложенных фреймов
Особое внимание на инпут в блоке с зеленым фоном #iscroll.
Исключение только iframe к которому вы не сможете получить доступ