web-dev-qa-db-fra.com

org.openqa.Selenium.NoSuchElementException: aucun élément de ce type

Exécution de Selenium WebDriver 2.37.1

Je reçois un problème intermittent lors de l'exécution d'un test et reçois le message d'erreur suivant: 

org.openqa.Selenium.NoSuchElementException: no such element

Parfois, le test réussit et échoue la plupart du temps. Ci-dessous, le stacktrace:

org.openqa.Selenium.NoSuchElementException: no such element  
(Session info: chrome=31.0.1650.57)
(Driver info:
chromedriver=2.6.232923,platform=Windows NT 6.1 SP1 x86_64) 
(WARNING:
The server did not provide any stacktrace information) 
Command duration or timeout: 10.04 seconds 
For documentation on this error, please visit:
http://seleniumhq.org/exceptions/no_such_element.html 
Build info:
version: '2.34.0', revision:
'11cd0ef93615408e0b6b3bfa28defe125906461a', time: '2013-08-06
11:43:14' 
System info: os.name: 'Windows 7', os.Arch: 'AMD64',
os.version: '6.1', Java.version: '1.7.0_45' 
Session ID:
2375dca8adea8bb6962b0c87861cdd59 
Driver info:
org.openqa.Selenium.chrome.ChromeDriver 
Capabilities

Et ci-dessous est mon code pour exécuter le test:

@Test
public void loginPage(){

    chrome.get("http://thisisafakeurl.com");
    //entering username
    WebElement usernameField = chrome.findElement(By.cssSelector("input[type='text'][id='usernameInput']"));
        usernameField.sendKeys("fakeusername");
    //entering password
    WebElement passwordField = chrome.findElement(By.cssSelector("input[id='passwordInput']"));
        passwordField.sendKeys("fakepassword");
    //clicking submit button
    chrome.findElement(By.cssSelector("input#loginBtn.rightButton")).click();

    chrome.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    //asserting a css selector. Not really needed. Just thrown in to learn.
   // WebElement blankProjectLocator = chrome.findElement(By.cssSelector("li.iconGridItem[data-id='5']"));
   // Assert.assertEquals("5", blankProjectLocator.getAttribute("data-id"));

    //Clicking the Blank Project button

    Actions actions = new Actions(chrome);
    WebElement item1 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]/img[1]"));
    WebElement item2 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]/img[2]"));
    WebElement item3 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]/header/span"));
    WebElement item4 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]"));

    actions.moveToElement(item4)
           .moveToElement(item1)
           .moveToElement(item2)
           .moveToElement(item3)
           .click().build().perform();

    chrome.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);





    //Dragging the Click Area component onto the canvas
    WebElement listContainer = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
    WebElement componentList = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
    WebElement clickArea = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]"));
    WebElement arrowHead = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]/div[1]"));
    WebElement imageHolderClickArea = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]/div[1]/div"));
    WebElement componentNameClickArea = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]/div[2]"));


    WebElement canvas = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));

    actions.moveToElement(listContainer)
           .moveToElement(componentList)
           .clickAndHold(clickArea)
           .moveToElement(arrowHead)
           .moveToElement(imageHolderClickArea)
           .moveToElement(componentNameClickArea)
           .moveToElement(canvas)
           .release().perform();

    chrome.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);






    //Dragging the close button onto the canvas

    WebElement listContainerClose = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
    WebElement componentListClose = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
    WebElement closeButton = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]"));
    WebElement componentThumb = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]/div[1]"));
    WebElement imageHolderCloseButton = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]/div[1]/div"));
    WebElement componentNameCloseButton = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]/div[2]"));

    WebElement canvas1 = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));

    actions.clickAndHold(closeButton)
            .moveToElement(listContainerClose)
            .moveToElement(componentListClose)
            .moveToElement(componentThumb)
            .moveToElement(imageHolderCloseButton)
            .moveToElement(componentNameCloseButton)
            .moveToElement(canvas1)
            .release().perform();

    //WebElement xAxisClose = chrome.findElement(By.xpath("//*[@id=\"c358\"]"));
    //xAxisClose.clear();
    //xAxisClose.sendKeys("240");

    //WebElement yAxisClose = chrome.findElement(By.xpath("//*[@id=\"c359\"]"));
    //yAxisClose.clear();
    //yAxisClose.sendKeys("5");






    //Dragging the video component onto the canvas

    WebElement listContainerVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
    WebElement componentListVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
    WebElement videoComponent = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[3]"));
    WebElement componentThumbVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[3]/div[1]"));
    WebElement componentNameVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[3]/div[2]"));

    WebElement canvas2 = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));

    actions.clickAndHold(videoComponent)
            .moveToElement(listContainerVideo)
            .moveToElement(componentListVideo)
            .moveToElement(componentThumbVideo)
            .moveToElement(componentNameVideo)
            .moveToElement(canvas2)
            .release().perform();


    chrome.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);






    //Dragging the Text component onto the canvas

    WebElement listContainerText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
    WebElement componentListText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
    WebElement textComponent = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[4]"));
    WebElement componentThumbText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[4]/div[1]"));
    WebElement componentNameText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[4]/div[2]"));

    WebElement canvas3 = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));

    actions.clickAndHold(textComponent)
            .moveToElement(listContainerText)
            .moveToElement(componentListText)
            .moveToElement(componentThumbText)
            .moveToElement(componentNameText)
            .moveToElement(canvas3)
            .release().perform();

Le lien cliquable dans la pile m'indique la ligne de code suivante:

 WebElement listContainer = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));

Donc, avant que le test puisse cliquer, cliquez sur le bouton Blank Project.

D'après mes investigations, il est possible que je rencontre des problèmes de synchronisation car ils sont intermittents. Dois-je envelopper une exception try/catch au lieu d'un délai d'attente? Ou est-ce que je les place à des endroits incorrects dans mon code?

Quelqu'un peut-il aider ou suggérer où je peux me tromper? 

5
Django_Tester

Je suppose que votre test échoue parfois en raison de la déclaration ci-dessous

chrome.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

Il suffit de placer le code de délai d'attente une fois au début du test et de supprimer toutes les autres instances.

 chrome.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
3
Yuvaraj HK

Comme Yuvaraj HK l’a mentionné, l’attente implicite une seule fois dans votre code serait suffisante. Elle attendrait implicitement tous les éléments que vous essayez de trouver dans votre code.

chrome.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

Mais essayez de garder le temps d'attente implicite aussi bas que possible, car cela pourrait augmenter votre temps d'exécution du code.

Dans certains cas, la visibilité de l'élément peut prendre plus de 30 secondes. L'attente explicite peut être utilisée dans ce type de situation.

WebDriverWait some_element = new WebDriverWait(driver,100); 
some_element.until(ExpectedConditions.visibilityOfElementLocated(By.id("id_of_some_element")));
//do anything you want with some_element

Je suggère fortement d'utiliser cssSelectors over xpath. Cet article pourrait aider .
Même si xpath est utilisé, essayez d’en utiliser des plus courts. L'utilisation d'un identifiant n'est pas le seul moyen pour atteindre un élément. Son parent peut avoir des noms de classe uniques ou d’autres attributs, que vous pouvez utiliser pour créer des variables efficaces xpaths ou cssSelectors.

3
Amith

J'ai eu le même problème en essayant de tester IE7 sur Windows Server 2003. Je l'ai corrigé en supprimant la configuration de sécurité renforcée d'Internet Explorer. Sur Server 2003, vous pouvez y remédier en procédant comme suit:

  • Ouvrez le panneau de configuration
  • Ouvrir Ajouter ou supprimer des programmes
  • Ouvrez Ajouter/Supprimer des composants Windows (dans la barre latérale gauche)
  • Décochez la configuration de sécurité renforcée d'Internet Explorer
  • Cliquez sur Suivant
  • Suivez jusqu'au bout
  • Redémarrez Internet Explorer

Si vous utilisez Server 2008 ou 2012, les étapes seront différentes mais l'objectif sera le même.

1
James Watkins

as-tu ouvert une nouvelle fenêtre? Si oui, vous devez faire en sorte que le pilote bascule dans la nouvelle fenêtre, le code suivant est testé par moi:

String currentWindow = driver.getWindowHandle();// get handle of current window
Set<String> handles = driver.getWindowHandles();// get handle of all windows
Iterator<String> it = handles.iterator();
while (it.hasNext()) {
if (currentWindow == it.next()) {
continue;
}
driver = driver.switchTo().window(it.next());// switch to new window

//business action
//xxxxxxx
}
driver.switchTo().window(currentWindow);//switch back to original window
1
Timothy.Li

Bon ... alors j'ai réussi à résoudre ce qui se passait ici. Comme j'utilise IntelliJ, il semble que je devais lui dire quel ordre appeler chaque méthode. Donc, en ajoutant @FixMethodOrder(MethodSorters.NAME_ASCENDING) et en plaçant 'a' sur ma première méthode, puis 'b' sur ma deuxième méthode (j'ai scindé le code que j'ai collé dans la question en méthodes depuis) ​​et ainsi de suite, il a exécuté les méthodes de commande avec une attente sur chaque méthode: try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. }

1
Django_Tester

Essayez d'utiliser SeleniumWait library:

SeleniumWait.withDriver(driver).withTimeOut(15).forElementToClick(element);
0
Łukasz Jasiński