Ошибка кэширования дерева Google Chrome с помощью автоматизации пользовательского интерфейса
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
- Создайте расширение хром и увеличьте масштаб до 100% по запросу:
chrome.tabs.setZoom(null, 0);
(работает, но мигает и замедляется окно)
Ни один из них не работает должным образом.
EDIT. Протестировано с помощью Google Chrome 40.XX, 41.XX, 42.XX, 43.XX, 44.XX, 45.XX, 46.XX, 47.XX.Dev, 48.XX.Dev под Windows 7.
Ответы
Ответ 1
Прокрутка на простых страницах оптимизирована, чтобы не требовать вычисления от средства визуализации. Для прокрутки требуется только композитор и графический процессор, поэтому дерево рендеринга, которое обновляется только от рендеринга, все равно остается.
Требование, чтобы рендеринг проходил DOM и обновлял дерево Accessibility во время прокрутки, работает против нескольких лет усилий, связанных с плавной прокруткой, особенно для сенсорных устройств, поэтому я не думаю, что вы будете добиваться исправления ошибок.
Ваша идея расширения, я думаю, является лучшим (хотя и уродливым) компромиссом. Но скорее, что изменение масштаба, делая небольшую мутацию страницы (или DOM), может быть лучшим решением. Попробуйте, например, добавить невидимый (или почти такой) элемент с низким z-порядком. Вам также необходимо оценить контроль мутации, чтобы это происходило только 1 раз в секунду или даже реже.
Ответ 2
Многопроцессорная архитектура Chrome отличается от архитектуры любого другого браузера. Для обеспечения безопасности основной пользовательский интерфейс браузера находится в одном процессе, а веб-страницы запускаются в отдельных процессах рендеринга (обычно один за вкладку). Процессы Renderer являются единственными, у которых есть представление DOM веб-страницы и, следовательно, вся информация о доступности, но процессам визуализации специально не разрешено взаимодействовать с операционной системой (отправка или получение событий или сообщений) - в частности, средство визуализации процессы не могут отправлять или получать события доступности.