12
votes

ElementNotInteractableException: élément non interactif: l'élément a une taille nulle apparaît depuis la mise à niveau vers chromedriver 83

J'utilise l'image docker suivante pour exécuter mes tests de concombre:

https://hub.docker.com/r/selenium/standalone-chrome/

Malheureusement, à partir d'aujourd'hui, il semble que chaque fois que j'exécute mes tests, j'obtiens les erreurs ci-dessous. Ils apparaissent au début de chaque test. Peu importe ce que je fais sur la page.

** 13: 38: 26 [exec] org.openqa.selenium.ElementNotInteractableException: élément non interactif: l'élément a une taille nulle

13:38:26 [exec] (Infos de session: chrome = 83.0.4103.61) **

J'ai creusé et j'ai remarqué que la version de chromedriver était mise à jour de 81 à 83. J'ai réussi à résoudre ce problème en utilisant une ancienne image de docker de ce lien de hub de docker qui a chromedriver 81. Mais si j'essaye d'utiliser à nouveau chromedriver 83, il ne fonctionne pas.

Quelqu'un d'autre a-t-il rencontré cela? Dois-je ajouter une nouvelle option Chrome à cause de la mise à jour?


3 commentaires

Avez-vous déjà résolu ce problème? Je vois la même chose.


Nan. J'ai dû tout mettre en attente pour quelque chose de plus urgent. Mais j'ai réussi à le faire fonctionner en revenant à Chrome 81 + chromedriver 81. J'essaierai encore


Même problème ici, les tests se sont bien déroulés dans Chrome 81 mais obtiennent la même erreur que vous dans 83.


7 Réponses :


1
votes

J'ai contourné cela en utilisant l'argument --window-size lorsque j'utilise du chrome sans tête. Par exemple, chrome --headless --window-size=400,800 .

Je ne sais pas ce qui a changé ou pourquoi c'est une solution de contournement suffisante.


1 commentaires

Malheureusement, j'ai déjà l'argument --window-size et cela ne fonctionne toujours pas. Je ne peux pas passer à headless car cela entraînera l'arrêt de tous mes tests de téléchargement.



3
votes

J'obtiens également cette erreur, j'ai creusé, j'ai trouvé que la taille de l'élément contient 0, par exemple un élément de taille 200 x 0 vous obtiendra cette erreur si vous voulez cliquer dessus. Ce n'est pas seulement une erreur de docker, je l'obtiens sur le chrome local 83.

Essayez de cliquer sur l'élément en utilisant le Javascript Executor:

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);


2 commentaires

Cela semble fonctionner, mais je dois ajouter cela à presque chaque étape du concombre. Je reviendrai sur cette solution si tout le reste échoue.


cette solution fonctionne pour moi, merci! fwiw, je suis sur chrome 83, ruby, rspec, fonctionnant sans tête sur notre serveur CI. Remplacement de element.click par des appels à cette méthode: def click_link (élément) execute_script ("arguments [0] .click ();", element) end



1
votes

J'ai eu le même problème que vous avec la mise à jour du pilote chrome vers 83, j'ai pu contourner ce problème.

 WebDriverWait wait = new WebDriverWait(this.Driver, TimeSpan.FromSeconds(10));
            var result = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.CssSelector(".btnSaveChanges")));
            ExcuteJquery("$j(\".btnSaveChanges div:contains('" + Text + "')\").click()");

L'utilisation de Jquery vous aidera à y accéder


0 commentaires

10
votes

La cause première de ce problème est que Chrome ne fait pas défiler jusqu'à l'élément en dehors de la fenêtre. Au lieu de cela, Chrome essaie de cliquer dessus en dehors de la zone de visualisation. C'est pourquoi le problème apparaît. C'est définitivement un problème avec Chrome 83 car je ne l'ai pas rencontré sur Chrome 81.

De plus, je n'ai pas un tel problème sur la machine Windows, il est reproduit uniquement sous Linux (j'utilise des images docker sélénoïdes).

La solution avec un clic via JS n'est pas la meilleure option, car via JS vous pouvez cliquer n'importe où même pour des éléments non cliquables (par exemple superposés par d'autres objets). C'est une opération dangereuse.

Au lieu de cela, je suggérerais de faire défiler jusqu'à l'élément avant le clic et après le clic natif (); cela fonctionnera parfaitement.

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].scrollIntoView(true);", element);    
element.click();


2 commentaires

cette réponse est excellente, mais au lieu de faire défiler en utilisant javascript, vous pouvez utiliser l'option sélénium "move_to_element" comme ceci: from selenium.webdriver.common.action_chains import ActionChains ActionChains (pilote) .move_to_element (élément) .perform () element.click ( )


Je reçois cela dans Windows 10 avec Chrome 85



0
votes

Je l'ai contourné en cliquant sur un élément enfant <input> à l'intérieur de l'élément qui était censé avoir une largeur nulle.


0 commentaires

1
votes

Dans notre cas, la cause première était un problème CSS / HTML: une ancre enveloppait un div et s'attendait à gagner implicitement une taille à partir de celle de cet élément enfant.

Les versions précédentes de Chrome toléraient cela, mais à partir de la v.83, Chrome semble être devenu plus strict sur ce front.

Donc, dans ce cas, la solution était de changer quelque chose comme ceci:

<a href="http://example.org" class="class with style giving height and width">
  some content
</a>

À quelque chose comme ça:

<a href="http://example.org">
  <div class="class with style giving height and width">
    some content
  </div>
</a>

C'est du HTML5 valide.


0 commentaires

1
votes

J'ai fini par utiliser scrollIntoView () qui a fait l'affaire (le code ci-dessous provient du test Protractor):

// scroll to it
browser.executeScript('document.getElementById("targetID").scrollIntoView()');

browser.sleep(500);

// click it
element(by.id('targetID')).click();


0 commentaires