2012-08-07 5 views
2

Je travaille sur la création d'un test automatisé pour certaines applications Web. Cette application est très complexe. En fait c'est un éditeur de texte pour un contenu spécifique. Dans le cadre de la fonctionnalité, il a quelques cadres pop-up. Vous pouvez ouvrir cette fenêtre pop-up? Apportez quelques modifications et sauvegardez-les - en fermant la trame actuelle. Le problème de mai est dans ce fait, que le bouton de fermeture situé à l'intérieur du cadre sera éliminant. Et cela force Chrome WebDriver à accrocher. Mon premier essai était comme ça:Chrome WebDriver se bloque lorsque le cadre sélectionné est fermé

driver.findElement(By.xpath("//input[@id='insert']")).click(); 
    driver.switchTo().defaultContent(); 

Mais il Hungs sur la première ligne après la commande executinh de clic comme cette commande cadre proche. Puis-je changer à cela (je JQuery sur la page):

driver.executeScript("$(\"input#insert\").click()"); 
    driver.switchTo().defaultContent(); 

Mais cela conduit à même résultat. Puis-je utiliser cette solution:

driver.executeScript("setTimeout(function(){$(\"input#insert\").click()}, 10)"); 
    driver.switchTo().defaultContent(); 

Et Hungs sur la deuxième ligne. Seule cette solution fonctionne:

driver.executeScript("setTimeout(function(){$(\"input#insert\").click()}, 100)"); 
    driver.switchTo().defaultContent(); 

mais seulement si vous ne prenez pas en compte, qu'il est instable - un certain problème de synchronisation peut se produire.

Alors peut-on se demander s'il existe un moyen plus propre et plus stable pour sortir du cadre fermé?

P.S .: executeScript - Fonction auto-définie pour diminuer la quantité de code. Il suffit simplement d'exécuter quelques js sur la page.

Mise à jour:

J'ai réalisé que j'avais tort. Ce problème ne concerne pas toutes les iframes. Cela se produit quand une petite fenêtre popupMCE est utilisée. La situation est exactement comme dans this topic. Donc, il est douteux que je vais trouver une réponse ici, mais qui sait. La solution décrite ci-dessus aidera, mais seulement pour très peu de temps, ce qui signifie qu'après plusieurs secondes, le chromedriver passera à la prochaine commande.

Répondre

0

problème est dans cette ligne de code tinyMCEPopup:

DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak 

L'exécution de ce script sur le correctif de page bloque le problème (mais crée peut-être des fuites :) :):

(function() { 
var domVar; 
if (window.tinymce && window.tinymce.DOM) { 
    domVar = window.tinymce.DOM 
} 
else if (window.tinyMCE && window.tinyMCE.DOM) { 
    domVar = window.tinyMCE.DOM 
} 
else { 
    return; 
} 
var tempVar = domVar.setAttrib;console.log(123) 
domVar.setAttrib = function(id, attr, val) { 
    if (attr == 'src' && typeof(val)== 'string' &&(val + "").trim().match(/javascript\s*:\s*("\s*"|'\s*')/)) { 
     console.log("Cool"); 
     return; 
    } 
    else { 
     tempVar.apply(this, arguments); 
    } 
} 

}()); 

Bug et solution également décrits here Note. Le code ci-dessus doit être ajouté au cadre parent, pas au cadre contextuel.

0

Voilà comment je le ferais en Ruby, je l'espère, vous pouvez le changer pour java

$driver.find_element(:xpath, "//input[@id='insert']").click 
$wait.until {$driver.window_handles.size < 2} #this will "explicitly wait" for the window to close 
handles = $driver.window_handles #get available window handles 
$driver.switch_to.window(handles[0]) #navigate to default in this case the First window handle 

espérons que cette aide

+0

Désolé, la description du pronblem n'était pas complète. – Dmitry

Questions connexes