Java >> Tutoriel Java >  >> Java

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 déroulante) et cliquer dessus. Ainsi, le code trouve l'élément, mais l'action de clic ne fonctionne pas. Cela fonctionne bien dans Google Chrome à chaque fois, et parfois dans Firefox (avec le même code Java fonctionne parfois, et parfois non).

Il y a la partie de code avec l'élément lorsque 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'élément est cliqué :

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

J'ai essayé de nombreuses solutions et parfois cela fonctionne, mais la prochaine fois que j'exécute 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 il y a des éléments uniques 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 le changement sur le code de l'élément et s'il y avait un changement, j'ai juste essayé de faire une nouvelle action de 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);
        }
    }
    

Voici les images de l'élément :

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

Répondre

Enfin, j'ai trouvé une réponse qui fonctionne aussi bien avec Firefox qu'avec 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"));

Balise Java