Google Chrome n'actualise pas les éléments d'accessibilité ( AutomationElement ) lorsqu'un utilisateur fait défiler vers le bas dans le navigateur.
Pour le reproduire:
- Activez l'accessibilité du moteur de rendu avec:
"chrome --force-render-accessibility"
ou en définissant sur Accessibilité globale à"chrome://accessibility"
. - Accédez à http://en.wikipedia.org/wiki/Google
- Ouvrez inspect.exe en mode d'automatisation de l'interface utilisateur (à partir des kits Windows), recherchez l'élément «Liens vers des articles connexes».
- Revenez à Chrome, faites défiler vers le bas jusqu'à ce que "Liens vers des articles connexes" en bas soit visible
- L'élément "Liens vers des articles associés" est marqué hors de l'écran
J'ai trouvé des solutions manuelles qui peuvent forcer Chrome à l'actualiser:
- Réglez le zoom à 90% puis remettez-le à 100% (manière très très moche)
- Désactivez l'accessibilité puis activez
chrome://accessibility/
Ce que je recherche, c'est la possibilité d'effectuer l'une de ces opérations par programme, ou toute opération permettant à Chrome d'actualiser son arborescence de cache.
Ce que j'ai essayé:
- Redimensionner la fenêtre avec
PInvoke/MoveWindow
- Redessiner la fenêtre avec
PInvoke/Redrawwindow
- Construisez une extension chrome et forcez le zoom à 100% à la demande:
chrome.tabs.setZoom(null, 0);
(fonctionne mais clignote et ralentit la fenêtre)
Aucun de ceux-ci ne fonctionne correctement.
EDIT : Testé avec Google Chrome 40.XX, 41.XX, 42.XX, 43.XX, 44.XX, 45.XX, 46.XX, 47.XX.Dev, 48.XX.Dev sous Windows 7.
c#
google-chrome
pinvoke
accessibility
ui-automation
Parfait28
la source
la source
Réponses:
Le défilement dans des pages simples est optimisé pour ne pas nécessiter de calcul du moteur de rendu. Seuls le compositeur et le GPU sont nécessaires pour faire défiler, donc l'arborescence de rendu qui n'est mise à jour qu'à partir du moteur de rendu est toujours la même.
Demander au moteur de rendu de parcourir le DOM et de mettre à jour l'arborescence d'accessibilité pendant un défilement va à l'encontre des efforts de plusieurs années pour avoir un défilement fluide, en particulier pour les appareils tactiles, donc je ne pense pas que vous allez obtenir une traction sur une correction de bogue.
Je pense que votre idée d'une extension est le meilleur (bien que laid) compromis. Mais plutôt que changer de zoom, faire une petite mutation de la page (ou du DOM) pourrait être une meilleure solution. Essayez par exemple d'ajouter un élément invisible (ou presque) avec un ordre z bas. Vous devrez également contrôler la vitesse de la mutation pour qu'elle ne se produise qu'une fois par seconde ou même moins souvent.
la source
L'architecture multi-processus de Chrome est différente de celle de tout autre navigateur. Pour des raisons de sécurité, l'interface utilisateur principale du navigateur se trouve dans un processus et les pages Web sont exécutées dans des processus de rendu distincts (généralement un par onglet). Les processus de rendu sont les seuls à avoir une représentation du DOM de la page Web et donc de toutes les informations d'accessibilité, mais les processus de rendu ne sont spécifiquement pas autorisés à interagir avec le système d'exploitation (envoi ou réception d'événements ou de messages) - en particulier, le moteur de rendu les processus ne peuvent pas envoyer ni recevoir d'événements d'accessibilité.
la source