2
votes

NoSuchElementException: aucun élément de ce type: impossible de localiser l'élément en essayant de cliquer sur l'élément déroulant sur amazon.co.uk via Selenium

J'exécute un test automatisé en sélénium / intelliJ / Java. Le webdriver est censé cliquer sur le menu déroulant de la barre de navigation Amazon, puis sur l'un des liens dans le menu déroulant. Il fait ces deux choses correctement, l'option déroulante mène à son lien, cependant le test de sélénium lui-même échoue, voici l'erreur:

package com.testing.webdriver;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement;


import java.util.Random;
import java.util.concurrent.TimeUnit;

public class MyFirstTest {
    WebDriver driver = new ChromeDriver();

    @BeforeClass
    public static void setupWebdriver() {
        WebDriverManager.chromedriver().setup();
    }


    private static final By SHOP_BY_DEPARTMENT = By.cssSelector("#nav-link-shopall");
    private static final By SHOP_ALL = By.cssSelector("#nav-flyout-shopAll > div.nav-template.nav-flyout-content.nav-tpl-itemList > a");



    @Test
    public void startWebdriver() {

        driver.navigate().to("https://www.amazon.co.uk/");
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.manage().window().maximize();
        WebElement shopByDepartment = driver.findElement(SHOP_BY_DEPARTMENT);
        shopByDepartment.click();

        WebElement ShopAllNav = driver.findElement(By.linkText("Full Shop Directory"));
        ShopAllNav.click();

        Assert.assertTrue("matches current url",
                driver.getCurrentUrl().matches("https://www.amazon.co.uk/gp/site-directory/ref=nav_shopall_fullstore"));

    }

    @After
    public void breakdown() throws InterruptedException {
        Thread.sleep(20000);
        driver.close();
    }

et voici mon code:

XXX

Le test devrait réussir car il fait ce que je lui dis. Je suppose que c'est quelque chose à voir avec le lien dans le menu déroulant, comme le dit l'erreur, mais je ne sais toujours pas comment je corrigerais cela. Toute aide serait appréciée, merci.


0 commentaires

3 Réponses :


1
votes

Ce que j'ai vu sur amazon:

 entrez la description de l'image ici

Le 'répertoire complet de la boutique' n'est pas (vraiment un texte de lien). si l'élément est ceci est un texte alors je le considère comme le texte du lien.

Dans votre cas, le texte est formé avec beaucoup d'espaces blancs ********** Répertoire complet de la boutique ********** et ce floconneux et peut causer des problèmes (possible dans votre cas).

Corrigez votre localisateur pour qu'il soit struct-safe et réessayez.

Exemple: xpath: // a / span [@ class = 'nav-text' and text () = 'Répertoire complet de la boutique']

Mise à jour: Votre test est mal rédigé ou vous ne savez pas quel est votre objectif réel.

Ce que vous faites:

  1. cliquez sur le menu de navigation et la même page d'affichage du 'répertoire complet de la boutique' est s'ouvrir. les liens sont différents.
  2. cliquez sur le bouton de «magasiner par service» (qui est masqué)
  3. Assert urls ...

Étapes suggérées:

  1. Passez à "Magasiner par service" et activez le menu déroulant.

  2. cliquez sur le bouton "Répertoire complet de la boutique" dans la liste déroulante.

  3. attendre le chargement de la page

  4. affirmer l'URL de la page.

Code:

driver.navigate().to("https://www.amazon.co.uk/");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
WebElement shopByDepartment = driver.findElement(SHOP_BY_DEPARTMENT);

Actions ac = new Actions(driver);
ac.moveToElement(shopByDepartment).perform();

WebElement ShopAllNav = driver.findElement(By.linkText("Full Shop Directory"));
ShopAllNav.click();

Assert.assertTrue(driver.getCurrentUrl().matches("https://www.amazon.co.uk/gp/site-directory/ref=nav_shopall_fullstore"), "matches current url");

Le code a été testé et confirmé comme fonctionnant.


4 commentaires

J'ai essayé de faire la même chose avec un sélecteur css à la place (qui n'a pas fonctionné) donc je suppose que ce n'est pas le problème.


êtes-vous sûr qu'un seul élément correspond au localisateur?


Je suis presque sûr que oui, le localisateur est là-haut, c'est mon code, la deuxième finale statique privée (SHOP_ALL), c'est assez spécifique


votre test est écrit assez usé. Vous cliquez sur le menu de navigation et ouvrez la page «boutique complète». Et puis essayez de cliquer sur le bouton qui se trouve dans la liste déroulante de SHOP_BY_DEPARTMENT. vérifier la mise à jour de ma réponse



0
votes

Vous devez attendre que ce composant particulier soit visible. Après sa visibilité, vous pouvez lui appliquer une action.

Vous pouvez essayer le code ci-dessous.

WebElement ShopAllNav = driver.findElement(By.linkText("Full Shop Directory"));
WebDriverWait wait = new WebDriverWait(driver,200);
wait.until(ExpectedConditions.visibilityOf(ShopAllNav));
ShopAllNav.click();


3 commentaires

Merci mais ça ne marche pas, j'obtiens toujours la même erreur


Vous pouvez utiliser ce code ci-dessous: WebElement ShopAllNav = driver.findElement (By.linkText ("// * [@ id =" nav-flyout-shopAll "] / div [2] / a / span"));


Il dit `` impossible de résoudre '' pour la partie `` nav-flyout-shopAll ''



1
votes

Pour développer le menu déroulant sur la barre de navigation Amazon , pas besoin de click() plutôt que de Mouse Hover induisant WebDriverWait et vous pouvez utiliser la solution suivante:

  • Bloc de code:

    Starting ChromeDriver 2.45.615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387) on port 41299
    Only local connections are allowed.
    Jan 25, 2019 5:41:24 PM org.openqa.selenium.remote.ProtocolHandshake createSession
    INFO: Detected dialect: OSS
    
  • Sortie de la console:

    System.setProperty("god.bless.you", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
    ChromeOptions options = new ChromeOptions();
    options.addArguments("start-maximized");
    options.addArguments("disable-infobars");
    options.addArguments("--disable-extensions"); 
    WebDriver driver =  new ChromeDriver(options);
    driver.get("https://www.amazon.co.uk/");
    new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div#nav-shop>a#nav-link-shopall")))).perform();
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.nav-catFlyout.nav-flyout div.nav-template.nav-flyout-content.nav-tpl-itemList a"))).click();
    Assert.assertTrue(driver.getCurrentUrl().matches("https://www.amazon.co.uk/gp/site-directory/ref=nav_shopall_fullstore"));
    driver.quit();
    

  • 0 commentaires