谷歌浏览器与UI自动化访问树caching问题

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

重现它:

  1. 使用"chrome --force-render-accessibility"启用渲染器可访问性,或在"chrome://accessibility"上设置全局可"chrome://accessibility"
  2. 转到http://en.wikipedia.org/wiki/Google
  3. 在UI自动化模式下(从Windows套件)打开inspect.exe ,查找“链接到相关文章”元素。
  4. 回到Chrome,向下滚动,直到看到底部的“链接到相关文章”
  5. “相关文章的链接”元素被标记为屏幕

我发现了一些手动解决scheme,可以强制Chrome刷新它:

  1. 设置缩放到90%,然后将其设置回100%(非常非常丑陋的方式)
  2. closures辅助function,然后打开chrome://accessibility/

我正在寻找的是能够以编程方式执行这些操作之一,或任何可以使Chrome刷新其caching树的操作。


我试过了:

  • 使用PInvoke/MoveWindow调整窗口大小
  • PInvoke/RedrawwindowPInvoke/Redrawwindow窗口
  • 构build一个chrome扩展,并根据需要强制缩放为100%: chrome.tabs.setZoom(null, 0); (工作,但眨眼,放慢窗口)

这些都没有正常工作。

编辑 :testing与谷歌Chrome 40.XX,41.XX,42.XX,43.XX,44.XX,45.XX,46.XX,47.XX.Dev,48.XX.Dev在Windows 7下。

在简单页面中滚动被优化,不需要渲染器的计算。 只有合成器和GPU才需要滚动,因此只从渲染器更新的渲染树仍然是相同的。

要求渲染器在滚动期间遍历DOM并更新辅助function树,这与滚动平滑的多年努力是相反的,特别是对于触摸设备,所以我不认为你会得到一个错误修复的牵引力。

我认为你的想法是最好的(虽然是丑陋的)妥协。 但是,改变缩放,做一个页面(或DOM)的小变化可能是一个更好的解决scheme。 尝试添加一个不可见(或几乎所有)的元素,使其具有较低的Z值。 您还需要对突变进行控制,以便每秒只发生一次,甚至更less。

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