web-dev-qa-db-fra.com

Comment éviter "L'élément n'est pas actuellement visible et ne peut donc pas interagir avec" Selenium Webdriver

J'utilise le sélecteur Web Selenium 2.210 + Java pour les tests. J'ai un exemple de code pour sélectionner tous les e-mails dans gmail. erreur lorsque j'essaie de mettre un délai de 5 secondes après avoir obtenu l'URL via le pilote Web. Est-il possible de faire fonctionner ce code avec retard?

    driver.get("https://mail.google.com/mail/u/0/?shva=1#all");
        delay(5);  ////*......Working fine without this...........*////
    driver.switchTo().frame(driver.findElement(By.id("canvas_frame")));
driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']")).click();

Merci d'avance

15
hks1233

Êtes-vous sûr de chercher le bon élément? J'ai eu un problème similaire et il s'est avéré qu'il y avait deux éléments similaires sur la page, l'un visible et l'autre non. La fonction FindElement renvoyait celle qui n'était pas visible.

J'ai résolu ce problème en utilisant FindElements au lieu de FindElement, puis en utilisant Linq pour extraire celui qui était visible.

18
Kesty

Voici un résumé des choses que vous pouvez faire pour résoudre le problème (exemples dans Protractor/Javascript):

  • maximiser la fenêtre du navigateur (sur Chrome + Mac, actuellement vous devez le faire différemment ):

    browser.driver.manage().window().maximize();
    
  • vérifiez qu'il n'y a aucun autre élément correspondant au localisateur . Vous pouvez obtenir cette erreur s'il existe un autre élément correspondant au localisateur qui est réellement invisible.

  • attendez que l'élément soit cliquable :

    var EC = protractor.ExpectedConditions,
        Elm = element(by.id("myid"));
    
    browser.wait(EC.elementToBeClickable(Elm), 5000);
    
  • faites défiler la vue de l'élément:

    var Elm = element(by.id("myid"));
    browser.executeScript("arguments[0].scrollIntoView();", Elm);
    
  • cliquez sur via javascript :

    var Elm = element(by.id("myid"));
    browser.executeScript("arguments[0].click();", Elm);
    
  • déplacer vers l'élément et cliquer via "actions du navigateur":

    var Elm = element(by.id("myid"));
    browser.actions()
        .mouseMove(Elm)
        .click()
        .perform();
    
5
alecxe

Alternativement, vous pouvez utiliser la classe JavascriptExecutor fournie dans Selenium. Après cela, vous pouvez exécuter n'importe quel JavaScript pour manipuler le DOM sur une page Web.

Réf :: http://Selenium.googlecode.com/svn/trunk/docs/api/Java/org/openqa/Selenium/JavascriptExecutor.html

3
armeo

Selenium n'interagira pas avec les WebElements qui sont masqués ou qui ne sont pas affichés pour l'utilisateur. Dans ce cas, il n'est pas rare que les clics des utilisateurs interagissent avec un élément div ou quelque chose de similaire qui déclenche à son tour le bouton réel, qui est masqué à des fins visuelles. Je suggère de parcourir les étapes de Selenium IDE dans firefox sur votre page. Voir si plusieurs événements sont déclenchés lorsque vous effectuez le clic sur votre élément "caché". Dans le cas où plusieurs les événements sont en effet déclenchés, faites de même dans votre code WebDriver.

1
AndyPerfect

Je ne suis pas sûr, mais chaque élément watir-webdriver a la méthode - (Object) wait_until_present (timeout = 30).

si cette étape est facultative, vous devez vérifier la visibilité:

element = driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']"));

if (element.isDisplayed()) {
  element.click();
}

Veuillez noter que je ne suis pas un Java gourou, et le code ci-dessus n'a pas été testé. Essayez-le.

1
GoobeMaster
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("document.getElementById('id').setAttribute('visibility', 'true');");

driver.findElement(By.id("id")).click();

en modifiant la visibilité de l'élément, vous pouvez effectuer votre action. vous pouvez soit cliquer avec Selenium ou avec JavascriptExecutor

0
pradeep

PhantomJS les utilisateurs doivent surveiller la réponse maximiser-fenêtre. Il y a de fortes chances qu'une boîte de dialogue javascript soit considérée comme étant en dehors de la fenêtre d'affichage même si une capture d'écran montre qu'elle est entièrement visible. Comme il est clairement visible, certaines actions de défilement dans la vue ne changent rien, et toutes les autres actions sont également inutiles. (Idem pour les autres navigateurs basés sur le moteur WebKit, par exemple sur MacOS Safari et l'ancien Chrome)

0
Guido U. Draheim

Essayez de rétrograder Webdriver Selenium à 2.20.0.

J'ai eu une erreur similaire avec Ruby gem version 2.21.0 et 2.21.2.

Dans mon cas, le pilote Web renvoie toujours button.visible? = false en cas de bouton est ajouté à la page via l'appel .Ajax.

Mes tests fonctionnent auparavant depuis plus longtemps et rien de similaire n'a changé. Je suppose donc que c'est un bug dans la version actuelle de webdriver.

0
Grimmo

C'est bizarre mais je dois définir la taille du navigateur explicitement en Java.

driver.manage (). window (). setSize (nouvelle dimension (1000, 800));

0
Vaibs

Dans mon cas (PhantomJSDriver appelé depuis Selenium WebDriver en c #), j'ai dû définir la taille de la fenêtre pour qu'elle soit suffisamment grande pour que l'élément soit visible:

driver.Manage().Window.Size = new Size(1000, 800);

J'ai découvert cette solution de contournement en lisant les problèmes ici: https://github.com/ariya/phantomjs/issues/11637

0
Matthew Lock

Si votre application utilise jQuery, vous pouvez effectuer les clics en utilisant Javascript. J'ai créé cet assistant simple pour cliquer sur les éléments que WebDriver refuse de trouver:

public static void jqClick(String selector, JavascriptExecutor driver) {
    driver.executeScript("$('" + selector + "').click()");
}

En tant que "pilote", vous pouvez utiliser, par exemple, un org.openqa.Selenium.firefox.FirefoxDriver.

C'était la seule solution qui fonctionnait pour moi.

0
raimohanska