谷歌浏览器与UI自动化访问树caching问题
当用户在浏览器中向下滚动时,Google Chrome不刷新辅助function元素( AutomationElement )。
重现它:
- 使用
"chrome --force-render-accessibility"
启用渲染器可访问性,或在"chrome://accessibility"
上设置全局可"chrome://accessibility"
。 - 转到http://en.wikipedia.org/wiki/Google
- 在UI自动化模式下(从Windows套件)打开inspect.exe ,查找“链接到相关文章”元素。
- 回到Chrome,向下滚动,直到看到底部的“链接到相关文章”
- “相关文章的链接”元素被标记为屏幕
我发现了一些手动解决scheme,可以强制Chrome刷新它:
- 设置缩放到90%,然后将其设置回100%(非常非常丑陋的方式)
- closures辅助function,然后打开
chrome://accessibility/
我正在寻找的是能够以编程方式执行这些操作之一,或任何可以使Chrome刷新其caching树的操作。
我试过了:
- 使用
PInvoke/MoveWindow
调整窗口大小 - 用
PInvoke/Redrawwindow
重PInvoke/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的表示并因此表示所有可访问性信息的呈现器进程,但是渲染器进程明确地不被允许与操作系统交互(发送或接收事件或消息),特别是渲染器进程无法发送或接收可访问性事件。