Ошибка кэширования дерева 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 веб-страницы и, следовательно, вся информация о доступности, но процессам визуализации специально не разрешено взаимодействовать с операционной системой (отправка или получение событий или сообщений) - в частности, средство визуализации процессы не могут отправлять или получать события доступности.