Comment puis-je attraper le Sélénium Erreurs à l'aide de WebDriverJS
Donc je suis en utilisant le JavaScript de la mise en œuvre de Sélénium, WebDriverJS. Comme avec n'importe quel navigateur web automatisation de l'obstacle le plus important est de mettre le code de ralentir suffisamment longtemps pour que les éléments de la page à charger. Ma solution est: est-ce
pour chaque élément que je veux interagir avec j'ai un bloc de code comme ceci
xpath = "//div[@id='gs_lc0']/input[@id='gbqfq']"
driver.wait(function(){
return waitForElement(xPath,driver);
});
try{
element = driver.findElement(webdriver.By.xpath(xPath));
}catch(e){
console.log("Wait Function False Positive")
}
element.sendKeys("Let Me Google That For You\n";
avec ce que la fonction répété dans l'attente de la fonction
var waitForElement = function(path, driver){
console.log("try: " + path)
try{
driver.findElement(webdriver.By.xpath(path));
}catch (e){
console.log("FAILURE")
return false;
}
console.log("SUCCESS")
return true;
}
maintenant ce code fonctionne parfois, mais othertimes il ne sera pas. Je suppect la fonction d'attente ne fonctionne pas du tout et je suis juste chanceux temps de chargement de la page web. Afin de tester cette théorie, j'ai ajouté l'essai de fonction pour le bloc de code, je ne peux même pas obtenir le "NoSuchElementError" d'être pris. De sorte que le poids de ma question est de savoir s'il existe une autre façon de former les tryCatch fonction de sorte que ces erreurs seront pris.
Ici aussi, est ce que la tête de mon code ressemble à si vous souhaitez une reproduction intégrale
var webdriver = require('selenium-webdriver'), element
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
build();
driver.get('google.com');
Vous devez vous connecter pour publier un commentaire.
bagelmaker la suggestion de l'utilisation de
findElements
n'est pas une mauvaise. C'est habituellement ce que je fais quand je veux vérifier si un élément existe, plutôt que de jouer avec des exceptions.Toutefois, par souci d'exhaustivité, voici comment vous pouvez traiter avec l'erreur générée lorsqu'un élément n'existe pas:
Le deuxième argument de
then
est un errback qui est appelé sifindElement
échoue. Parce queselenium-webdriver
fonctionne avec des promesses, c'est de cette façon que vous avez à les attraper à l'erreur. À l'aide detry...catch
ne peut pas fonctionner parce que le Sélénium ne pas commencer à travailler tout de suite; le travail que vous demandez en Sélénium de le faire avecfindElement
est effectuée à un temps indéterminé dans l'avenir. Le temps de l'exécution de JavaScript, aurait quitté votretry...catch
.Le code ci-dessus, les recherches pour un élément avec un
id
valeur defofofo
, qui n'existe pas et échoue.then
ce qui serait normalement le callback qui est appelée si la promesse résout avec succès. Depuis la démonstration ci-dessus ne peuvent pas réussir, il n'y a aucun point d'avoir un rappel là. Par conséquent,null
est utilisé. Il aurait tout aussi bien avecfunction () {}
.Je vous recommande de lire sur explicites et implicites attend. Un résumé, explicite attend interroge le site web jusqu'à ce qu'une condition particulière est remplie, alors qu'un implicite d'attente est plus général, et à attendre un laps de temps spécifié pour une commande à exécuter. Dans votre cas, je vous renvoie à ce question précédente, qui a été résolu en utilisant:
OU
S'il vous plaît commentaire si il y a toutes les précisions dont vous avez besoin.
EDIT:
J'ai confondu la question. Une autre méthode pour attraper un NoSuchElementError est d'utiliser la méthode
findElements
qui est documenté ici, et a un exemple de mise en œuvre ici. Si aucun élément n'existe, il sera de retour une liste de taille 0. De cette façon, une exception n'est pas levée, et vous pouvez déterminer si elle existe par la taille de la liste.J'espère que c'est une meilleure réponse pour votre question.
Vous pouvez également prendre cette erreur dans un enchaînés "d'attraper" la méthode: