Я работаю над инфраструктурой автоматизации браузера , которая, помимо других браузеров, поддерживает IE. Поэтому мне нужно получить экранные координаты элементов, с которыми пользователь хочет взаимодействовать. Основным методом, который мы используем для получения этих координат, является использование getBoundingClientRect (). Проблема в том, что в IE эти координаты всегда задаются относительно верхнего левого угла прилагаемого документа. Если элемент находится во фрейме / фрейме, это могут быть не экранные координаты элемента относительно верхнего левого угла окна браузера.
Я использую COM через C ++ для управления браузером, хотя я могу выполнять JavaScript через этот уровень драйвера C ++. Я также вытесняю его из процесса, что означает, что я не выполняюсь в объекте Browser Helper Object (BHO или IE надстройка). Переезд на BHO не вариант для этого проекта. Помимо работы с IE 6, 7, 8 и 9, мне не нужно беспокоиться о кросс-браузерной совместимости для любого метода, который я могу найти, который работает. Использование jQuery или аналогичного ему на самом деле не вариант, но если есть решение, использующее библиотеку JavaScript, возможно, я смогу реверс-инжиниринг решения, приемлемого для использования в проекте.
Вот некоторые из вещей, которые я пробовал до сих пор:
- Используйте element.ownerDocument.parentWindow.frameElement в JavaScript. Это не удастся, если содержащий документ и документ внутри фрейма находятся в разных доменах.
- Используйте IHTMLWindow4 :: get_frameElement () для окна, содержащего элемент в кадре. Это должен быть C ++ эквивалент метода JavaScript выше; однако он возвращает E_NOINTERFACE, когда я пытаюсь его использовать.
- Используйте IDisplayServices :: TransformPoint () для преобразования координат верхнего левого угла элемента в другую систему отсчета. Это не похоже на кросс-процесс.
Как найти или рассчитать координаты экрана элемента HTML относительно верхнего левого угла окна браузера, если целевой элемент может существовать в кадре или в фрейме?