web-dev-qa-db-fra.com

Selenium/Firefox: la commande ".click ()" ne fonctionne pas avec un élément trouvé

J'ai essayé de trouver une solution à ce problème et j'ai passé beaucoup de temps, mais il m'est presque impossible de le faire.

Le problème: J'utilise Selenium avec Java dans Firefox. Je dois trouver un élément (une liste) et cliquer dessus. Ainsi, le code trouve l'élément, mais l'action de clic ne fonctionne pas. Cela fonctionne correctement dans Google Chrome à chaque fois, et parfois même dans Firefox (avec le même code Java, cela fonctionne parfois, et parfois pas).

Il y a la partie de code avec l'élément quand le programme entre sur la page:

    <div id="size-btn" class="size-btn">
      <span class="selected-size">SELECCIONA TALLA </span>
      <div class="size-select" style="display: none;">
        <table>
          <tbody>
            <tr id="selecsize_2" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051607">
            <tr id="selecsize_3" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051608">
            <tr id="selecsize_4" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051609">
            <tr id="selecsize_5" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051610">
          </tbody>
        </table>
      <button class="size-guide gaViewEvent gaTrack" data-ga-props="{action:'Seleccionar_Talla', opt_label:'Guia_de_tallas'}" data-href="http://www.anyweb.com/webapp/wcs/stores/servlet/ProductGuideSizeAjaxView?catalogId=24052&categoryId=358056&langId=-5&productId=1047599&storeId=10701">Guía de tallas</button>
      </div>
    </div>

Et il y a la partie de code qui change lorsque l'utilisateur clique sur l'élément:

    <div id="size-btn" class="size-btn opened">

J'ai essayé plusieurs solutions et parfois cela fonctionne, mais la prochaine fois que je lance le programme, cela ne fonctionne plus.

Quelques solutions:

  1. Il trouve l'élément, mais n'exécute pas l'action de clic. J'ai vérifié avec xpath et cssSelector, et des éléments uniques ont été trouvés avec ces expressions.

    driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")).click(); // Also checked with By.cssSelector("span.selected-size")
    
  2. Je pensais que c'était à cause du temps, alors j'ai essayé de le résoudre de cette façon.

    WebElement we = driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")); // By.cssSelector("span.selected-size")
    Thread.sleep(3000);
    we.click();
    
  3. Enfin, j'étais un peu désespéré et j'ai créé une nouvelle fonction pour essayer de le faire près de 60 fois, en recherchant les modifications apportées au code de l'élément et, le cas échéant, en essayant à nouveau d'effectuer un clic.

    clickAndWaitWhileElementIsNotPresent(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span"),By.xpath("//div[@class='size-btn opened']/span")); // By.cssSelector("span.selected-size")
    
    private void clickAndWaitWhileElementIsNotPresent(By by1, By by2) throws Exception {
        for (int second = 0;; second++) {
            if (second >= 60)
                fail("timeout");
            try {
                if (isElementPresent(by2))
                {
                    break;
                }
                else
                {
                    driver.findElement(by1).click();
                }
            } catch (Exception e) {
            }
            Thread.sleep(1000);
        }
    }
    

Il y a les images de l'élément:

Element 1Element 2

Est-ce que quelqu'un sait comment faire ça?

20
ovejaexiste

Enfin, j'ai trouvé une réponse qui fonctionne avec Firefox ainsi que Google Chrome.

WebElement we = this.driver.findElement(By.id("size-btn"));

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

waitForElementPresent(By.xpath("//div[@id='size-btn' and contains(@class,'opened')]/span"));

Merci de me lire.

24
ovejaexiste

Je ne suis pas sûr de savoir pourquoi vous utilisez ce Xpath. Si vous êtes libre de changer de Xpath, enregistrez l’élément avec Selenium IDE et utilisez Xpath::position dans la liste déroulante de target (il sélectionne un chemin unique par rapport à l’en-tête html). résoudra le problème du localisateur dynamique. Et essayez ci-dessous les événements mentionnés.

1- Utilisez clickAt.

2- Utilisez fireevent(focus) puis cliquez sur. Parfois, il arrive qu'un élément de l'arrière-plan soit chargé; lorsqu'il se charge, la cible se déplace dessus, d'où l'erreur elementNotVisible.

3- Utilisez mouseDownRight.

2
Amit Shakya

J'ai une solution, créer une classe avec un robot y mettre les clés d'événement TAB, puis appeler cette classe. Qu'est-ce qu'il fait c'est comme un retour à se concentrer sur la page. Pour certains razon, la page a perdu de son intérêt et ne l'a jamais trouvée.

   Robot robot;
    try {
        robot = new Robot();
        robot.keyPress(KeyEvent.VK_TAB);
        robot.keyRelease(KeyEvent.VK_TAB);

    } catch (AWTException e) {e.printStackTrace();}

J'ai le même problème dans Firefox. L'astuce consiste à cliquer sur le texte à l'intérieur, pas sur le bouton lui-même.

1
jason zhang

Vous pouvez essayer d'utiliser la classe Actions de org.openqa.Selenium.interactions:

WebElement element = driver.findElement(By.id("size-btn"));
Actions builder = new Actions(driver);

builder.moveToElement(element).click(element);
builder.perform();
0
Aconic