2009-03-19 13 views
17

Ho un caso di test che richiede la digitazione di un valore parziale in un campo di testo basato su Ajax e la verifica dell'elenco ha il contenuto previsto. Se lo fa, seleziona il contenuto. Qualche idea su come fare questo lavoro?Il selenio può gestire il completamento automatico?

+0

Vuoi dire completamento automatico come una caratteristica AJAX, non come il browser costruito in funzione? – guerda

risposta

16

Il comando tipo potrebbe non essere sufficiente per attivare il completamento automatico. I suggerimenti di Dave Webb sono altrimenti esatti. La mia unica aggiunta potrebbe essere che potrebbe essere necessario il comando typeKeys, che causa l'attivazione di eventi JavaScript leggermente diversi, che potrebbero essere più propensi ad attivare il widget di completamento automatico.

+0

Buon punto su tipo e tipo Chiavi. –

+1

Utilizza sia il tipo che il tipo Chiavi nell'ordine indicato. – chim

2

La tua domanda è leggermente ambigua.

La maggior parte dei browser mantiene una cache di valori basata sul nome del campo: questo è il valore che viene suggerito come completamento automatico dal browser, anche se non è mai stato possibile visitare il sito in precedenza. Questa funzione non è standard su tutti i browser e non ci sarà alcun modo standard per il selenio di rilevarlo/analizzarlo. Puoi ancora farlo, ma dovrai fare funzioni javascript che determinano te stesso i valori. Quindi puoi usare "eval" nel selenio per eseguire queste funzioni. Non ho visto alcuna libreria js in grado di dirti questi valori in un modo compatibile con browser diversi.

L'altra alternativa è che si utilizza ajax per eseguire un inoltro lato server del valore parzialmente inserito. In questo caso è solo una questione di digitare i valori nella casella di testo e affermare che i valori attesi si presentano. Normalmente i suggerimenti di completamento automatico vengono visualizzati in alcuni livelli sul lato client.

+0

Capisco perché la mia domanda potrebbe essere ambigua, ma quello che stavo guidando è nella seconda parte della risposta. Nel mio caso, ho un campo di testo basato su Ajax che fornisce all'utente opzioni basate sul valore inserito parziale. È possibile utilizzare il selenio per acquisire queste opzioni e verificare che il valore previsto sia incluso? – Afamee

8

farei in questo modo:

  • type per immettere il valore nel campo di testo.
  • waitForTextPresent o verifyTextPresent per verificare il contenuto di completamento automatico
  • click o mouseDown di cliccare sulla voce dell'elenco di completamento automatico

Il trucco sta per essere la finale click essere solo nel posto giusto. Dovresti essere in grado di usare un'espressione XPath che cerca il testo che ti aspetti di trovarlo.

0

Utilizzare typeKeys anziché type. Utilizzare anche mouseDown invece di fare clic. Funziona bene.

1

ho trovato avevo bisogno di fare un attenzione sul campo prima di fare typeKeys per farlo funzionare.

+0

questa è davvero la vera risposta !! – Necronet

3

ho usato questa sequenza in IDE,

  1. typeKeys
  2. waitForTextPresent
  3. mouseOver
  4. clickAt

e ha funzionato bene

6

Per WebDriver, provate questo

Il codice qui sotto è per la ricerca di un testo automaticamente dal auto suggerire; principalmente per la voce di elenco .

driver.findElement(By.id("your searchBox")).sendKeys("your partial keyword"); 
Thread.sleep(3000); 
List <WebElement> listItems = driver.findElements(By.xpath("your list item locator")); 
listItems.get(0).click(); 
driver.findElement(By.id("your searchButton")).click(); 
+0

Grazie !!! :-) –

+0

Grazie mille! Thread.sleep è quello che mi mancava –

+0

Dove trovo il 'locator'? – Siddharth

0

Abbiamo avuto alcuni problemi con i tasti di testo. sendKeys sembra diventare la soluzione finale, ma è ancora sperimentale. Dalla referenza:

Questo comando è sperimentale. Potrebbe sostituire il comando typeKeys in futuro.

Per coloro che sono interessati ai dettagli, a differenza del comando typeKeys, che tenta di attivare keyDown, keyUp e keyPress, questo comando è supportato dagli atomi di Selenium 2 e fornisce un'implementazione molto più solida che sarà mantenuto in futuro.

0

Nel testo di aiuto per i typeKeys comando che dice:

In alcuni casi, potrebbe essere necessario utilizzare il comando semplice "tipo" per impostare il valore del campo e poi il "typeKeys "comando per inviare gli eventi di battitura corrispondenti a ciò che hai appena digitato.

Così utilizzare questa combinazione di

type(selector, text); 
typeKeys(selector, text); 

Questo sembra funzionare bene.

1

Questo potrebbe non funzionare per tutti, ma ho semplicemente aggiunto un metodo che mi ha permesso di digitare caratteri con un ritardo.

Actions builder = new Actions(this.webDriver); 
    WebElement element = this.getWebElement(); 
    for (char c : value.toCharArray()) { 
     builder = builder.sendKeys(element, c + ""); 
     builder.pause(100); 
    } 

    builder.build().perform(); 

Poi ho trovato l'elemento che ho voluto fare clic (

resultsElement.findElement(By.xpath("//li[.='" + valueLabel + "']")) 

Dove contenitore è il resultsElement è la WebElement che contiene il set di risultati e l'etichetta valore è il valore che voglio fare clic su.

Anche in questo caso, potrebbe non funzionare per tutti, ma ha funzionato per me e ho pensato che prudente condividere.

0

volte il TypeKeys non funziona. a questo punto è possibile utilizzare keyD proprio

fare clic sulla casella di input e digitare valore e chiaveDown nella casella.

0

Sono stato in grado di risolvere questo problema utilizzando la funzione seguente: La funzione seguente prende il testo che si desidera selezionare come parametro. Es: Se si desidera selezionare "javascript", è sufficiente digitare "java" nella casella di testo & passare il testo che si desidera selezionare, in questo caso specifico è "javascript".

public void selectOptionWithText(String textToSelect) { 
    try { 
     //Add the below sleep if necessary 
     // Thread.sleep(1000); 

WebElement autoOptions = driver.findElement(By.className("autocomplete")); 

     List<WebElement> optionsToSelect = autoOptions().findElements(By.tagName("div")); 
     for (WebElement option : optionsToSelect) { 
      if (option.getText().equals(textToSelect)) { 
       System.out.println("Trying to select: " + textToSelect); 
       option.click(); 
       break; 
      } 
     } 
    } 
    catch(Exception e){ 
     System.out.println("Error"); 
    } 
} 
0

una piccola variazione usando la risposta di Prashanth:

/** 
* Selects the element at position idx from the autocomplete combo, considering the partialKeyword 
* @param driver 
* @param element 
* @param partialKeyword 
* @param idx 
* @throws InterruptedException 
*/ 
public static void selectAutoCompleteValue(WebDriver driver, WebElement element, String partialKeyword, Integer idx) throws InterruptedException{ 
    element.sendKeys(partialKeyword); 
    Thread.sleep(1000); 
    List <WebElement> listItems = driver.findElements(By.cssSelector(".ui-autocomplete-item.ui-autocomplete-list-item")); 
    listItems.get(idx).click(); 
} 

Spero che questo aiuti!

0

Ho usato questi comandi in Selenium IDE 2.9.1 Versione per il campo di testo di completamento automatico . SendKeys (locator, valore) clickAt (locator, coordString) clic (locator)

0

Ci sono alcune risposte con il codice qui. Quindi, darò il mio contributo.

Il codice che sto usando per selezionare una voce nel componente di completamento automatico da primefaces 2.2:

driver.findElement(By.id(codigoBanco_input)).sendKeys("text"); 
waitForElementLocated(By.cssSelector(listItensSelector), 5); 
List<WebElement> listItems = driver.findElements(By.cssSelector(listItensSelector)); 
Actions builder = new Actions(driver); 
builder.moveToElement(listItems.get(0)).build().perform(); 
WebDriverWait wait = new WebDriverWait(driver, 5); 

wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(itemSelector))); 
     driver.findElement(By.cssSelector(itemSelector)).click();