2012-09-28 3 views
0

Lors de l'exécution du test suivant dans Firefox, un "org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with" est lancé. La raison semble être une fenêtre pop-up qui apparaît juste avant que le champ Select (variable selectMarke) ne soit utilisé (et étrangement pas en cliquant manuellement sur ce site). J'ai essayé plusieurs possibilités qui sont listées dans différents threads mais elles n'ont pas fonctionné. La cause semble être la fenêtre pop-up.ElementNotVisibleException due au style css "display: none;"

Comment puis-je résoudre ce problème?

FirefoxProfile profile = new FirefoxProfile(); 
    profile.setEnableNativeEvents(true); 
    WebDriver driver = new FirefoxDriver(profile); 
    driver.manage().timeouts().implicitlyWait(16, TimeUnit.SECONDS); 

    driver.get("http://www.autoscout24.de/"); 
    System.out.println("Page title is: " + driver.getTitle()); 
    WebElement pageWSuche = driver.findElement(By.linkText("Werkstattsuche")); 
    pageWSuche.click(); 

    WebElement plzField = driver.findElement(By.id("cms-plz")); 
    plzField.sendKeys("81243"); 

    WebElement findGarField = driver.findElement(By.cssSelector("span.buttonBob span input[value='Werkstätten finden']")); 
    findGarField.click(); 

    WebElement navInspect = driver.findElement(By.linkText("Inspektion (mit Preis)")); 
    navInspect.click(); 

    Select selectMarke = new Select(driver.findElement(By.cssSelector("select.inputL[name='MakeId']"))); 
    selectMarke.selectByVisibleText("BMW"); 

    driver.quit(); 

Lors de l'exécution de la classe suivante sur le même domaine, mais dans un tout autre page est très bien car aucune fenêtre pop-up n'apparaît.

FirefoxProfile profile = new FirefoxProfile(); 
    profile.setEnableNativeEvents(true); 
    WebDriver driver = new FirefoxDriver(profile); 
    driver.manage().timeouts().implicitlyWait(16, TimeUnit.SECONDS); 

    driver.get("http://www.autoscout24.de/"); 
    WebElement element = driver.findElement(By.linkText("Fahrzeugsuche")); 
    element.click(); 

    Select selectMarke = new Select(driver.findElement(By.cssSelector("select.inputFullWidth[name='make1']"))); 
    selectMarke.selectByVisibleText("BMW"); 
    Select selectModell = new Select(driver.findElement(By.cssSelector("select.inputFullWidth[name='model1']"))); 
    selectModell.selectByValue("15779"); 
    Select selectPriceTo = new Select(driver.findElement(By.cssSelector("select.inputFullWidth[name='priceto']"))); 
    selectPriceTo.selectByVisibleText("100.000"); 
    Select selectYearFrom = new Select(driver.findElement(By.cssSelector("select.inputFullWidth[name='yearfrom']"))); 
    selectYearFrom.selectByVisibleText("2006"); 
    Select selectKM = new Select(driver.findElement(By.cssSelector("select.inputFullWidth[name='mileageto']"))); 
    selectKM.selectByVisibleText("200.000"); 
    Select selectFuel = new Select(driver.findElement(By.cssSelector("select.inputFullWidth[name='fuel']"))); 
    selectFuel.selectByVisibleText("Diesel"); 
    WebElement location = driver.findElement(By.id("zipcode")); 
    location.sendKeys("München"); 
    Select selectRadius = new Select(driver.findElement(By.cssSelector("select.inputFullWidth[name='zipradius']"))); 
    selectRadius.selectByVisibleText("200 km"); 

    WebElement searchBtn = driver.findElement(By.cssSelector("input[value$='Fahrzeuge']")); 
    searchBtn.click(); 

    driver.quit(); 
+0

Je revérifiés contre [http://stackoverflow.com/questions/6101461/selenium-2-0-element-is-not-currently-visible-visible] et le problème n'est pas le pop-up (que j'ai "éliminé" en utilisant le profil local de firefox) mais un css "display: none;" dans l'un des éléments parents. Y a-t-il une possibilité de contourner ce problème? Chose étrange: malgré ce réglage, l'utilisateur peut cliquer et sélectionner des champs dans cette section. Cela devrait donc être testable. – Mike

Répondre

0

Cela ne devrait vraiment pas arriver. En fait, le sélénium est assez intelligent pour savoir si un élément est visible ou non. Le code suivant est copié directement à partir des atomes de Sélénium:

// Any element with a display style equal to 'none' or that has an ancestor 
// with display style equal to 'none' is not shown. 
function displayed(e) {  
    if (bot.dom.getEffectiveStyle(e, 'display') == 'none') {  
     return false;  
    }   
    var parent = bot.dom.getParentElement(e); 
    return !parent || displayed(parent); 
} 

Cela permet des éléments de l'enfant de passer outre un parent de display:none. Peut-être qu'il y a quelque chose d'autre qui ne va pas?

Une alternative serait d'utiliser jquery pour trier manuellement les soumissions. Autoscout24 a une certaine mention de jquery donc il devrait déjà être intégré dans la page. Ensuite, vous pouvez utiliser quelque chose le long des lignes de

//searchBtn.click(); 
((JavascriptExecutor) driver).executeScript("$(arguments[0]).click();", searchBtn); 

De cette façon, vous pouvez contourner la vérification de sélénium si l'élément est visible ou non. J'espère que ça aide.

0

je le ferais avec une méthode comme celui-ci, sur mesure pour rechercher l'affichage: aucun drapeau sur un élément:

public Boolean elementIsDisplayed(By locator) { 
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
     .withTimeout(30, TimeUnit.SECONDS) 
     .pollingEvery(5, TimeUnit.SECONDS) 
     .ignoring(NoSuchElementException.class, StaleElementReferenceException.class); 
    WebElement foo = wait.until( 
     ExpectedConditions.visibilityOfElementLocated(locator); 
    if (foo == null) return false; 
    return true; 
} 
Questions connexes