web-dev-qa-db-fra.com

Webdriver Java: exception d'élément non visible

J'ai le problème suivant. J'ai un menu déroulant qui est caché alors quand je fais la sélection et lance le test j'obtiens l'erreur suivante:

 org.openqa.Selenium.ElementNotVisibleException: element not visible: Element is not currently visible and may not be manipulated
  (Session info: chrome=30.0.1599.101)

Ceci est mon choix:

Select s = new Select(dropDown);
s.selectByVisibleText("CHARGEBACK");

Y a-t-il une promenade autour pour manipuler des éléments cachés?. J'ai trouvé le code suivant dans l'un des posts:

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

C'est le code html:

 <div class="ui-helper-hidden">
<select id="formLevel:levels_input" name="formLevel:levels_input">
<option value="541fac58-5ea8-44ef-9664-e7e48b6c6a3c">Seleccione un Registro</option>
<option value="dafc799c-4d5e-4b02-a882-74cb6ad98902">SECURITY</option>
<option value="e5416086-2036-4cd0-b23e-865747aa3f53">CALL CENTER</option>
<option value="7ea4b4ea-4f06-4d27-9541-1b0cf3f2aa22">CHARGEBACK</option>
<option value="0f915120-7b8f-4a33-b063-5d20a834b655">PREVENÇÃO A FRAUDE</option>
<option value="a8ef13e8-f4a5-43b8-a668-b769f6988565">ANALISE DE CREDITO</option>
<option value="83b65a26-d4cd-43d3-b3fa-2f7894ca454a">SUPORTE A CONTA</option>
<option value="163d0db9-590c-47a7-a271-218b2d27d8d9">REGULARIZAÇÃO FINANCEIRA</option>

Et cela ne fonctionne pas dans ce cas. Toute aide serait appréciée.

6
elcharrua

Puisque WebDriver essaie de simuler des utilisateurs réels, il ne peut pas interagir avec des éléments invisibles/cachés. Pour résoudre votre problème, je pense que vous devriez d'abord cliquer sur div, ce qui rendra la liste déroulante visible et sélectionner l'option dans la liste déroulante. Je recommanderais une telle approche par opposition à la méthode Javascript pure, car elle simulerait un utilisateur réel. Donner suite à un coup,

WebDriverWait wait = new WebDriverWait(driver, 300);
WebElement triggerDropDown = driver.findElement(By
                .className("ui-helper-hidden"));
triggerDropDown.click();
WebElement selectElement = wait.until(ExpectedConditions
                  .visibilityOfElementLocated(By.id("formLevel:levels_input")));
Select select = new Select(selectElement);
select.selectByVisibleText("SECURITY");

Edit mis à jour le nom de classe de triggerDropDown

7
nilesh

Bonjour, il peut y avoir tant de raisons à cela. J'ai également été confronté à ce problème plusieurs fois et résolu de différentes manières.

1- Utilisation de WebdriverWait, également connu sous le nom d'attente explicite

2- Utilisation unique de xpath - en utilisant des chemins xpath.

3- Obtenez la taille de l'élément puis cliquez ou effectuez n'importe quelle action sur le premier.

J'ai documenté toutes les solutions ici Comment résoudre un élément non visible Exception

6
Mukesh Otwani

Je suis absolument d'accord pour sircapsalot. Vous devez détenir la logique métier de l'application et "faire comme un utilisateur". Et utilisez ce hack pour des solutions de contournement uniquement.

Réponse:

Essayez de cette façon

document.getElementById('formLevel:levels_input').options[3].selected = "true"

1
alexey.chumagin

Je n'ai pas testé cela, mais est-ce que ça marche?

s.selectByValue ("7ea4b4ea-4f06-4d27-9541-1b0cf3f2aa22");

0
jmccure

Outre les raisons et les problèmes soulevés dans les réponses précédentes, j'ai rencontré une autre cause qui mérite d'être mentionnée. Dans mon cas, un JavaScript sur la page devait s'exécuter après avoir cliqué sur un lien de la page pour que les éléments auxquels je souhaitais accéder soient visibles. C'est bon tant que JavaScript est activé dans votre pilote . Dans mon cas, je courais sans JavaScript, alors même si le lien avait été «cliqué» par programme, les éléments ne devenaient pas visibles. J'utilisais HtmlUnitDriver avec les paramètres par défaut. Finalement, je suis passé à ChromeDriver. (Vous pouvez activer JavaScript sur HtmlUnitDriver, mais cela - pour d'autres raisons - n'était pas suffisant pour moi dans mon cas.)

0
Brick