Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

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 к которому вы не сможете получить доступ

8 лет назад
id2606
40 летРоссия
9 лет в сервисе
Был
2 года назад