2014-11-04 5 views
5

Ho sbattuto la testa contro il muro per un lungo periodo di tempo, quindi ho pensato di chiedere agli "esperti" perché il codice seguente non funzionasse (inserimento della password) con PhantomJS ma funziona bene con Firefox. La cosa più inquietante è che una voce di campo (username) ha successo, ma la seconda non funzionerebbe affatto. La pagina viene caricata correttamente e ho incluso il codice di test per verificare che gli altri componenti vengano caricati correttamente.WebDriver PhantomJS Impossibile trovare l'elemento, ma funziona perfettamente con Firefox

See codice qui sotto:

import java.io.File; 
import org.openqa.selenium.*; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.phantomjs.PhantomJSDriver; 

public class login { 

public static void main(String[] args) { 
    WebDriver driver; 
    Boolean verbose = false; //Change to true to test it with firefox 
    String phantomPath = "../phantomjs-1.9.8-linux-i686/bin/phantomjs"; 
    String url = "https://www.britishairways.com/travel/redeem/execclub/_gf/en_us"; 

    if (verbose) { 
     driver = new FirefoxDriver(); 
     } 
    else{ 
     File file = new File(phantomPath); 
     String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8"; 
     System.setProperty("phantomjs.binary.path", file.getAbsolutePath()); 
     System.setProperty("phantomjs.page.settings.userAgent", userAgent); 

     driver = new PhantomJSDriver(); 
     } 
    driver.get(url); 
    try{ 
     driver.findElement(By.id("membershipNumber")).sendKeys("1234"); 
     System.out.println("ID input successful"); 
     if (driver.findElement(By.id("ecuserlogbutton")).isDisplayed()) { 
      System.out.println("Login Button is present"); 
     } 
     //This is where it fails with PhantomJS but work with Firefox 
     driver.findElement(By.cssSelector("#pintr > #password")).sendKeys("1234");   
     System.out.println("password input successful"); 
     } 
    catch (Exception e){ 
     System.out.print(e.getMessage()); 
     } 
    driver.close(); 
} 
} 
+0

Potrebbe trattarsi di problemi di temporizzazione. Prova a utilizzare Thread.Sleep (2000) prima di trovareElemento e osservare il comportamento. Se funziona, allora sai che è un problema di temporizzazione. Inoltre c'è un metodo chiamato WaitForPagetoLoad. Puoi chiamarlo prima di inserire elementi. – neo

+0

Bene, ho risolto il mio problema. Sembra che il selettore di CSS non funzioni con PhantomJS che ho usato da.xpath con .//*[@id='password '] e ora funziona. – ucipass

+0

Grazie neo, in realtà l'ho provato anch'io eseguendo molto lentamente il debug del codice con eclissi. Ancora non sono sicuro del motivo per cui il selettore css non funziona. – ucipass

risposta

8

PhantomJS 1.x ha un problema con gli ID elemento. Il sito è danneggiato perché utilizza password per due elementi nella pagina che non dovrebbero mai accadere. Semplicemente sostituendo l'id nel selettore con il tipo di elemento (input) lo risolve.

driver.findElement(By.cssSelector("#pintr > input")).sendKeys("1234"); 
+0

Scusi signore! Non ho la reputazione di darti il ​​pollice in su, ma grazie mille! Non ho notato che il nome duplicato per la password. – ucipass

+0

Puoi [accettare] (http://meta.stackexchange.com/a/5235/266187) la mia risposta. Inoltre, è sempre bene fare screenshot per vedere cosa succede sulla pagina. –

+0

Sì, grazie! Ho usato la cattura dello schermo per guardare la pagina, ma tutto quello che ho visto era il campo vuoto. Credo che dovrei trovare l'ID dell'elemento per cercare i duplicati la prossima volta. Grazie ancora per il vostro aiuto!!! – ucipass

1

Try the methods from this link

Dalla mia esperienza con WebDriver, di solito problemi di temporizzazione. Chiama il metodo nel link sopra all'inizio del tuo codice in modo da assicurarti che tutto si carichi prima di provare a trovarli. Oppure puoi semplicemente utilizzare Thread.Sleep con un tempo sufficiente prima di trovare gli elementi.