WebDriver PhantomJS Impossible de trouver l'élément, mais fonctionne très bien avec Firefox

J'ai été à se taper la tête dans le mur pour un long moment maintenant, alors j'ai pensé que je voudrais demander à la "experts" pourquoi le code ci-dessous ne fonctionnerait pas (entrer le mot de passe) avec PhantomJS, mais fonctionne très bien avec Firefox. Le plus troublant, c'est qu'un champ de saisie (nom d'utilisateur) est réussie, mais le second ne fonctionnerait pas du tout. Le chargement de la page est très bien et j'ai inclus le code de test pour vérifier les autres composants sont chargés de l'amende juste.

Voir code ci-dessous:

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();
}
}
Il peut être des problèmes de timing. Essayez d'utiliser Thread.Sleep(2000) avant chaque findElement et d'observer le comportement. Si cela fonctionne, alors vous savez qu'il est question de synchronisation. Il y a également une méthode appelée WaitForPagetoLoad. Vous pouvez appeler qu'avant l'entrée en éléments.
Eh bien, résolu mon problème. Semble que le sélecteur css ne fonctionne pas avec PhantomJS j'ai utilisé par.xpath .//*[@id='mot de passe'] et maintenant ça fonctionne.
Merci neo, en fait, j'ai essayé aussi en très lentement débogage du code avec eclipse. Toujours pas sûr de savoir pourquoi le sélecteur css ne fonctionne pas.
Mais c'est toujours une bonne pratique de vérifier si le document est chargé ou vérifier si un élément existe avant d'essayer d'y accéder. WebDriver performance pourrait changer sur des ordinateurs différents. J'ai connu des situations où les tests fonctionnent très bien dans un pc, mais dans un autre pc échoue en raison de problèmes de timing.

OriginalL'auteur ucipass | 2014-11-04