2013-03-08 9 views
20

Ho cercato di trovare una soluzione a questa cosa e ho trascorso molto tempo, ma è quasi impossibile per me farlo.Selenium/Firefox: il comando ".click()" non funziona con un elemento trovato

La questione: sto usando Selenium con Java in Firefox. Devo trovare un elemento (una listbox) e cliccarci sopra. Quindi, il codice trova l'elemento, ma l'azione di clic non funziona. Funziona bene in Google Chrome ogni volta, e qualche volta in Firefox (con lo stesso codice Java a volte funziona, ea volte no).

C'è la parte di codice con l'elemento quando il programma entra nella pagina:

<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> 

E c'è la parte di codice che cambia quando l'elemento viene cliccato:

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

Ho provato molte soluzioni e talvolta funziona, ma la volta successiva che eseguo il programma, non funziona di nuovo.

Alcune soluzioni:

  1. che trova l'elemento, ma non viene eseguito fare clic su azione. Ho controllato con xpath e cssSelector, e ci sono elementi unici trovati con quelle espressioni.

    driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")).click(); // Also checked with By.cssSelector("span.selected-size") 
    
  2. ho anche se era a causa del tempo, così ho cercato di risolvere in questo modo.

    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. Infine, ero un po 'disperata, e ho creato una nuova funzione per cercare di fare questo quasi 60 volte, alla ricerca del cambiamento sul codice elemento e se c'era alcun cambiamento, solo cercato di fai di nuovo clic sull'azione.

    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); 
        } 
    } 
    

Ci sono le immagini dell'elemento:

Element 1 Element 2

Qualcuno sa come fare?

+0

È necessario chiarire cosa significa "non funziona". C'è un'eccezione o qual è il comportamento imprevisto? –

+0

Con "non funziona", intendo che il comportamento previsto del pulsante non è corretto, quando fa clic sul pulsante, l'elenco a discesa dovrebbe essere aperto. Grazie. – ovejaexiste

+0

ha avuto un problema simile con i dropdown di select2; 'click' non funzionerebbe in firefox quando provate a fare clic su div-risolto facendo clic sul tag anchor iniettato da select2 –

risposta

24

Infine ho trovato una risposta che funziona con Firefox e 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")); 

Grazie per avermi letto.

+0

Bravo! Funziona bene! Lo uso con il localizzatore xpath, usando il testo dalla listbox _ "// * [contiene (text(), '23')]" _ –

+1

È quasi il 2018 e devo ancora farlo. – neXus

2

Io non sono sicuro perché stai usando questo Xpath, se avete la libertà di cambiare Xpath quindi registrare l'elemento utilizzando il selenio IDE e utilizzare Xpath::position dal menu a discesa dei target (raccoglie unico percorso relativo alla intestazione html), si risolverà il problema del localizzatore dinamico. E prova sotto gli eventi menzionati.

1- Utilizzare clickAt.

2- Utilizzare fireevent(focus) e quindi fare clic. A volte capita che qualche elemento in back ground venga caricato, quando viene caricato, focus move lì quindi errore elementNotVisible.

3- Utilizzare mouseDownRight.

+0

Grazie, ho provato in questo modo, ma non era una buona soluzione perché questo è un Web dinamico. – ovejaexiste

1

Ho lo stesso problema in Firefox. Il trucco è fare clic sul testo all'interno di non sul pulsante stesso.

0

Si può provare a utilizzare la classe di azioni da org.openqa.selenium.interactions:

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

builder.moveToElement(element).click(element); 
builder.perform(); 
1

ho qualche soluzione, fare una classe con un robot messo lì le chiavi di eventi TAB, quindi chiamare quella classe. Quello che fa è come tornare a concentrarsi sulla pagina. Per alcuni razon la pagina ha perso la concentrazione e non ha mai trovato quel pulsante.

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

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