J'ai eu un problème avec Selenium en jetant timeout exception
à cause d'une fenêtre contextuelle
unexpected alert open
not provide any stacktrace information)
Command duration or timeout: 5 milliseconds
L'alerte comporte les boutons OK
et CANCEL
. Je connais deux façons de gérer cela
La première façon est de rouvrir une nouvelle session
driver.quit();
driver = new ChromeDriver();
La deuxième façon utilise la classe Robot
Robot r = new Robot();
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
Cependant, ces méthodes ne sont pas efficaces du temps. Y a-t-il une meilleure façon?
Cela devrait faire l'affaire:
driver.switchTo().alert().accept();
Si vous avez besoin de certaines de ces alertes dans vos tests, vous pouvez gérer chaque alerte individuellement en utilisant:
driver.switchTo().alert().accept();
Pour gagner du temps, vous pouvez définir chrome capabilites au début de l’exécution du test sur ACCEPTER, INGORE ou IGNORER alertes par défaut quand ils apparaissent.
Exemple:
capabilities.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT);
Robot r = nouveau Robot ();
r.keyPress (KeyEvent.VK_ENTER);
r.keyRelease (KeyEvent.VK_ENTER);
driver.quit ();
driver = new ChromeDriver ();
Essaye ça,
public boolean isAlertPresent() {
boolean presentFlag = false;
try {
// Check the presence of alert
Alert alert = driver.switchTo().alert();
// Alert present; set the flag
presentFlag = true;
// if present consume the alert
alert.accept();
//( Now, click on ok or cancel button )
} catch (NoAlertPresentException ex) {
// Alert not present
ex.printStackTrace();
}
return presentFlag;
}
J'espère que cela vous aidera.
Le plus souvent, ce problème est gênant dans la mesure où il apparaît à des endroits imprévisibles du système testé. À l'heure actuelle, je ne pense pas qu'il existe des moyens de traiter TOUTES ces non-crédités automatiquement par configuration dans le WebDriver. Mon conseil général serait d’envelopper WebDriver dans un proxy et d’utiliser une sorte de proxy dynamique pour envelopper toutes les méthodes de WebDriver. De cette façon, vous obtenez un point de contrôle unique sur des alertes imprévisibles, la journalisation ou l'évaluation des performances des méthodes, la gestion des exceptions aléatoires inaccessibles, la gestion aléatoire des exceptions StaleElementException, etc. .
Class WebDriverProxy implements InvocationHandler{
WebDriverWrapperImpl impl = new WebDriverWrapperImpl();
public String clickByXPath(String xpath) {
return (String)handleInvocation(impl,"clickByXPath", new Object[]{xpath});
// return impl.clickByXPath( xpath) ;
}
/**All fail fast strategies could be centralized here., no need of any assertion errors in libraries,
* However it makes sense to wrap webdriver exceptions as either recoverable or nonrecoverable
* recoverable ones are like unexpected hangs on the browser, which could be handled at the test runner level, wherein the
* whole test can be retried.
* irrecoverable ones are also mostly handled at the test runner level, but capable of being caught at the test script level *
**/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object o = null;
Throwable target = null;
try{
o = method.invoke(proxy, args);
}
catch(InvocationTargetException ee){
target = ee.getTargetException();
throw target;
}
return o;
}
public Object handleInvocation(Object proxy, String method, Object[] args){
Object toReturn = null;
Method m = null;
Class[] classes = new Class[args.length];
for(int i = 0;i<args.length;i++){
classes[i]=String.class;
}
for(Object x:args){
logBuffer.append(x.toString()+",");
}
log.trace("WebDriverProxy. "+method+"("+logBuffer.toString()+")");
logBuffer = new StringBuffer();
try{
m = proxy.getClass().getMethod(method,classes);
toReturn = invoke(proxy,m, args);
}catch(NoSuchMethodException e){
e.printStackTrace();
}catch( StaleElementReferenceException e){
log.debug("Exception was of tye "+e.getClass().getCanonicalName());
}
catch(UnreachableBrowserException | NoSuchElementException e){
log.debug("Exception was of tye "+e.getClass().getCanonicalName());
//If the NoSuchelement is due to suspect Alerts being present, switchToAlert() and alert.accept() here.
}
return toReturn;
}
}
class WebDriverWrapperImpl {
WebDriver driver = new ChromeDriver();
public String clickByXPath(String xpath) throws Exception{
driver.findElement(By.Xpath(xpath)).click();
return driver.getTitle();
}
}
Si vous utilisez des infrastructures telles que TestNG, vous pouvez utiliser des programmes d'écoute tels que ITestListener e.t.c, où vous devez remplacer certaines des méthodes telles que BeforeCommand et afterCommand. Donc, dans BeforeCommand, implémentez le code d'alerte pour ignorer et vérifier la beauté. Chaque fois que la commande Selenium est exécutée, cette méthode beforeCommand appelle automatiquement et vérifie si une alerte est présente ou non. Si oui, il écartera et exécutera votre commande. J'espère que cela résoudra notre problème