当用户在浏览器中向下滚动时,Google Chrome 不会刷新辅助功能元素 (AutomationElement)。
要重现它:
启用渲染器可访问性:“chrome --force-render-accessibility”或在“chrome://accessibility”中设置全局可访问性。转到 http://en.wikipedia.org/wiki/Google 在 UI 自动化模式下打开 inspect.exe(来自 Windows 工具包),查找“相关文章的链接”元素。回到 Chrome,向下滚动直到底部的“相关文章的链接”可见 “相关文章的链接”元素被标记为关闭屏幕
我找到了一些可以强制 Chrome 刷新它的手动解决方案:
将缩放设置为 90%,然后将其设置回 100%(非常非常丑陋的方式)关闭可访问性,然后在 chrome://accessibility/ 中打开
我正在寻找的是能够以编程方式执行这些操作之一,或者任何可以使 Chrome 刷新其缓存树的操作。
我试过的:
使用 PInvoke/MoveWindow 调整窗口大小
使用 PInvoke/Redrawwindow 重绘窗口
构建一个 chrome 扩展并按需强制缩放到 100%: chrome.tabs.setZoom(null, 0); (工作但眨眼并减慢窗口速度)
这些都不能正常工作。
编辑:在 Windows 7 下使用 Google Chrome 40.XX、41.XX、42.XX、43.XX、44.XX、45.XX、46.XX、47.XX.Dev、48.XX.Dev 测试。
在简单页面中滚动已优化为不需要渲染器的计算。滚动只需要合成器和 GPU,因此仅从渲染器更新的渲染树仍然是相同的。
要求渲染器在滚动期间遍历 DOM 并更新可访问性树与多年来平滑滚动的努力背道而驰,特别是对于触摸设备,所以我认为您不会在错误修复上获得牵引力。
我认为你对扩展的想法是最好的(虽然丑陋的)妥协。但是,改变缩放,对页面(或 DOM)做一个小的突变可能是一个更好的解决方案。例如,尝试添加具有低 z 顺序的不可见(或几乎不可见)元素。您还需要对突变进行速率控制,使其每秒仅发生 1 次甚至更少。
Chrome 的多进程架构不同于任何其他浏览器。为了安全起见,主浏览器 UI 在一个进程中,而网页在单独的渲染器进程中运行(通常每个选项卡一个)。渲染器进程是唯一具有网页 DOM 表示的进程,因此具有所有可访问性信息,但渲染器进程特别不允许与操作系统交互(发送或接收事件或消息) - 特别是渲染器进程不能发送或接收可访问性事件。
不定期副业成功案例分享