首页 文章

UI自动化的Google Chrome访问树缓存问题

提问于
浏览
157

当用户在浏览器中向下滚动时,Google Chrome不会刷新辅助功能元素(AutomationElement) .

重现它:

  • 使用以下内容启用渲染器辅助功能: "chrome --force-render-accessibility" 或在 "chrome://accessibility" 上设置Global Accessibility .

  • 转到http://en.wikipedia.org/wiki/Google

  • 在UI自动化模式下打开inspect.exe(从Windows套件中),查找"Links to related articles"元素 .

  • 回到Chrome,向下滚动,直到底部的"Links to related articles"可见

  • "Links to related articles"元素已标记为屏幕外


我找到了一些可以强制Chrome刷新它的手动解决方案:

  • 将缩放设置为90%然后将其设置回100%(非常非常难看)

  • 关闭开关可访问性然后在 chrome://accessibility/ 中打开

What I'm looking for is the ability to do one of these operations programatically, or any operation that can make Chrome refresh its cache tree.


我尝试过的:

  • 使用 PInvoke/MoveWindow 调整窗口大小

  • 使用 PInvoke/Redrawwindow 重绘窗口

  • 构建镀铬扩展并按需强制缩放至100%: chrome.tabs.setZoom(null, 0); (工作但闪烁并减慢窗口速度)

这些都没有正常工作 .

EDIT :在Windows 7下使用Google Chrome 40.XX,41.XX,42.XX,43.XX,44.XX,45.XX,46.XX,47.XX.Dev,48.XX.Dev进行测试 .

2 回答

  • 1

    滚动简单页面已经过优化,无需从渲染器进行计算 . 因此只需要合成器和GPU来滚动,因此仅从渲染器更新的渲染树仍然是相同的 .

    要求渲染器遍历DOM并在滚动期间更新辅助功能树,这与几年平滑滚动的努力相反,特别是对于触摸设备,因此我认为您不会对错误修复有所了解 .

    我认为你对扩展的想法是最好的(虽然是丑陋的)妥协 . 而是改变缩放,对页面(或DOM)进行小的变异可能是更好的解决方案 . 例如,尝试添加具有低z顺序的不可见(或接近)元素 . 您还需要对变异进行速率控制,使其每秒仅发生1次甚至更少 .

  • -1

    Chrome的多进程架构与任何其他浏览器的架构不同 . 为了安全起见,主浏览器UI在一个进程中,并且网页在单独的渲染器进程中运行(通常每个选项卡一个) . Renderer进程是唯一具有网页DOM表示的进程,因此是所有可访问性信息,但渲染器进程特别不允许与操作系统交互(发送或接收事件或消息) - 特别是渲染器进程无法发送或接收可访问性事件 .

相关问题