2015-11-10 18 views
5

Ho un metodo che fa clic su un pulsante, tuttavia, quando viene eseguito, il selenio restituisce il risultato come cliccato con successo, quando, in realtà, il pulsante non è effettivamente cliccato. Se eseguo il test più volte, occasionalmente, verrà fatto clic come previsto. Ho il mio framework di test impostato come un'attesa implicita per circa 15 secondi, ho impostato un'attesa esplicita per questo elemento e vedo ancora lo stesso problema. Quando faccio <element>.isDisplayed(), l'elemento è sempre trovato. Ho inserito il file .click in un ciclo while per fare clic su di esso un paio di volte che funziona la maggior parte del tempo, tuttavia, a volte il test fallisce. È possibile avere un'istruzione if per verificare se un elemento è effettivamente visualizzato prima di fare clic sul pulsante?Il selenio fa clic su un elemento 'con successo', eppure non è effettivamente cliccato

ho provato:

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

Ecco il pulsante che sto avendo problemi con:

<button class="notkoButton listNew"> 
<div class="l6e iconAdd">New List</div> 
</button> 

Ecco il mio metodo:

public marketing_lists_page navigateToNewListPage() throws Throwable { 
    try { 
     int x = 0; 
     while(x < 5) { 
      newListBtn.click(); 
      x++; 
     } 
     //newListPageHeader.isDisplayed(); 
    } catch (NoSuchElementException e){ 
     logs.errorDetails("Could not navigate to New List Page"); 
     Assert.fail(); 
    } 
    return this; 
} 
+0

Non si dovrebbe fare 'if (! Element.isDisplayed) {element.click};'. – AGill

+0

Possibile duplicato di [webdriver - wait for element] (http://stackoverflow.com/questions/11736027/webdriver-wait-for-element) – JeffC

risposta

4

Sembra che l'elemento non è abilitato o meno cliccabile inizialmente.E per rispondere alla tua domanda, sì, c'è un'attesa esplicito è possibile utilizzare e attendere che l'elemento sia cliccabile:

WebDriverWait wait = new WebDriverWait(driver, timeOut); 
wait.until(ExpectedConditions.elementToBeClickable(locator)); 
+0

Dopo aver lottato con questo particolare elemento e provando il suggerimento di tutti gli altri, questa era la soluzione migliore. Tuttavia, occasionalmente fallirebbe. Tanto più che cerco di evitare l'uso di Thread.sleep() dopo che l'elemento era selezionabile nei miei test, in modo che lo script non fallisse, dovevo usarlo. –

0

Tu dici che hai provato un'attesa esplicita, ma suona come quello che stai chiedendo può essere realizzato al meglio da un fluente Wait (che è un tipo di attesa esplicita):

public WebElement fluentWait(final By locator) { 
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
     .withTimeout(30, TimeUnit.SECONDS) 
     .pollingEvery(5, TimeUnit.SECONDS) 
     .ignoring(NoSuchElementException.class); 

WebElement foo = wait.until(new Function<WebDriver, WebElement>() { 
    public WebElement apply(WebDriver driver) { 
     return driver.findElement(locator); 
    } 
}); 

return foo; };; 

Qui il WebElement sarebbe il pulsante che si sta tentando di fare clic. La cosa bella di FluentWait è che l'elemento stesso viene restituito se viene trovato. Dalla documentazione:

Un'implementazione dell'interfaccia di attesa che può avere il proprio intervallo di timeout e polling configurato al volo. Ogni istanza di FluentWait definisce la quantità massima di tempo di attesa per una condizione, nonché la frequenza con cui controllare la condizione. Inoltre, l'utente può configurare l'attesa per ignorare determinati tipi di eccezioni durante l'attesa, come NoSuchElementExceptions durante la ricerca di un elemento nella pagina.

Per utilizzarlo è sufficiente fare:

WebElement newListBtn = fluentWait(By.id("button")); 

Prova anche:

Driver.SwitchTo().DefaultContent(); 

prima di fare clic nel caso in cui si tratta di un problema di telaio.

+0

Ho provato a usare fluentWait e ottengo gli stessi risultati. Il fatto è che il selenio passa quel gradino come successo, ma, solo occasionalmente, verrà effettivamente fatto clic. Ho provato a usare css e xpath, l'elemento im using non ha un ID assegnato ad esso. @marchocolate –

+0

Interessante. Nel ciclo in cui si fa clic cinque volte, dopo ogni clic, chiamerei un metodo ConfirmPage (Next_Page). Pensa a un elemento che può essere trovato solo nella pagina successiva e cercalo dopo ogni clic. Se è presente, il clic ha funzionato e puoi uscire dal ciclo. In caso contrario, prova a fare nuovamente clic. Penserò a qualche codice e lo modificherò. – marchocolate

+0

Anche se il pulsante non ha un id, ha la classe "notkoButton listNew", è quella classe usata altrove nella pagina? – marchocolate

1

Prova a scorrere fino all'elemento prima di fare clic su di esso. Questo accade soprattutto quando si esegue il test su Chrome. È possibile utilizzare JavaScriptExecutor per scorrere.

Qualcosa di simile a questo:

JavascriptExecutor jse = (JavascriptExecutor)driver; 
jse.executeScript("window.scrollTo(0," + element.getLocation().Y + ")"); 
+0

Grazie per questo, ma l'elemento è nella parte superiore della pagina e sto usando Firefox. –

+0

hai provato a utilizzare element.sendkeys (Keys.Enter) o element.sendkeys (Keys.return) invece di click() – Prat0567

1

Prova questa, Click utilizzando JavaScript e sentirsi liberi di cambiare il localizzare per l'elemento in base al vostro convenienza: -

WebElement element= driver.findElement(By.xpath("YOUR XPATH")); 

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

Spero che vi aiuterà :)

0

Selenio soffre di mancanza di GUI "dinamica". Con ciò consiglio di inviare un aggiornamento alla pagina dopo il clic.

Dimmi cosa succede.

0

Ero di fronte allo stesso identico problema ma solo dopo aver aggiornato le mie librerie di selenio dalla 2.45 alla 2.48.2. La chiamata al metodo "Click" non fallisce mai, il che significa che l'elemento viene sempre trovato dal conducente, cosa che non è in grado di fare è fare clic sul punto giusto. Il mio test funzionava bene su una schermata di risoluzione più alta e a volte passava (ma principalmente falliva a causa di problemi di clic) su una schermata di ricerca più bassa. Ho provato molte cose ma alla fine quello che ha funzionato per me è stato ZOOM.

Prima di eseguire il test, chiamo il metodo seguente e il metodo "clic" funziona come previsto su quello schermo a bassa risoluzione ora.

public void zoomOut() { 
     WebElement html = driver.findElement(By.tagName("html")); 
     html.sendKeys(Keys.chord(Keys.CONTROL, Keys.SUBTRACT)); 
}