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.
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
Vous devez vous connecter pour publier un commentaire.
PhantomJS 1.x a un problème avec Id d'éléments. Le site est cassé, car il utilise
password
pour deux éléments sur la page, ce qui ne devrait jamais se produire. Le remplacement de l'id dans le sélecteur avec le type d'élément (input
) elle n'en résout.Vous pouvez accepter ma réponse. Aussi, il est toujours bon de faire des captures d'écran pour voir ce qui se passe sur la page.
Oui merci! J'ai utilisé la capture d'écran à regarder la page, mais j'ai vu le champ vide. Je suppose que j'aurais à faire trouver sur l'IDENTIFIANT de l'élément à rechercher les doublons, la prochaine fois. Merci encore pour votre aide!!!
Oui, j'ai vu aussi le champ vide, mais j'ai aussi remarqué que quelque part, le reste du texte est apparu. Vous recevrez un message d'erreur lorsque le champ n'existe pas ou n'est pas visible. Cela signifie donc que, lorsque le champ doit être rempli, mais ne l'est pas, vous avez probablement sélectionné le mauvais champ.
salut, si j'ai Par.id("userid") comment je peux écrire votre code?
OriginalL'auteur Artjom B.
Essayez les méthodes à partir de ce lien
De mon expérience avec le WebDriver, c'est généralement des problèmes de timing. L'appel à la méthode dans le lien ci-dessus au début de votre code, de sorte que vous pouvez vous assurer que tout se charge avant de vous essayez de les trouver. Ou vous pouvez simplement utiliser Thread.Dormir avec suffisamment longtemps avant de trouver des éléments.
OriginalL'auteur neo