Google Chrome не обновляет элементы специальных возможностей ( AutomationElement ), когда пользователь прокручивает страницу в браузере.
Чтобы воспроизвести это:
- Включите доступность рендерера с помощью:
"chrome --force-render-accessibility"
или установив Глобальную доступность на"chrome://accessibility"
. - Перейдите на страницу http://en.wikipedia.org/wiki/Google.
- Откройте inspect.exe в режиме автоматизации пользовательского интерфейса (из комплектов Windows), найдите элемент «Ссылки на связанные статьи».
- Вернитесь в Chrome, прокрутите вниз, пока внизу не появится «Ссылки на связанные статьи» внизу.
- Элемент «Ссылки на похожие статьи» выделен вне экрана
Я нашел несколько ручных решений, которые могут заставить Chrome обновить его:
- Установите Zoom на 90%, затем установите его обратно на 100% (очень и очень уродливо)
- Выключите доступ, затем включите
chrome://accessibility/
Что я ищу, так это возможность программно выполнить одну из этих операций или любую операцию, которая может заставить Chrome обновить свое дерево кеша.
Что я пробовал:
- Изменить размер окна с
PInvoke/MoveWindow
- Перерисовать окно с
PInvoke/Redrawwindow
- Создание расширения Chrome и принудительное увеличение до 100% по требованию:
chrome.tabs.setZoom(null, 0);
(работает, но мигает и замедляет окно)
Ни один из них не работает должным образом.
РЕДАКТИРОВАТЬ : Протестировано с Google Chrome 40.XX, 41.XX, 42.XX, 43.XX, 44.XX, 45.XX, 46.XX, 47.XX.Dev, 48.XX.Dev под Windows 7.
c#
google-chrome
pinvoke
accessibility
ui-automation
Perfect28
источник
источник
Ответы:
Прокрутка на простых страницах оптимизирована, чтобы не требовать вычислений от средства визуализации. Для прокрутки требуются только композитор и графический процессор, поэтому дерево рендеринга, которое обновляется только из рендерера, остается прежним.
Требование, чтобы средство визуализации проходило через DOM и обновляло дерево доступности во время прокрутки, противоречит многолетним усилиям по плавной прокрутке, особенно для сенсорных устройств, поэтому я не думаю, что вам удастся исправить ошибку.
Я думаю, что ваша идея расширения - лучший (хотя и некрасивый) компромисс. Но скорее изменение масштаба, небольшая мутация страницы (или DOM) может быть лучшим решением. Попробуйте, например, добавить невидимый (или почти такой) элемент с низким z-порядком. Вам также нужно будет контролировать мутацию, чтобы это происходило только 1 раз в секунду или даже реже.
источник
Многопроцессная архитектура Chrome отличается от архитектуры любого другого браузера. В целях безопасности основной интерфейс браузера находится в одном процессе, а веб-страницы запускаются в отдельных процессах визуализации (обычно по одному на вкладку). Процессы рендерера - единственные, которые представляют DOM веб-страницы и, следовательно, всю информацию о доступности, но процессам рендеринга специально не разрешается взаимодействовать с операционной системой (отправка или получение событий или сообщений) - в частности, рендерера процессы не могут отправлять или получать события доступности.
источник