Search code examples
selenium-webdrivercss-selectorswebdriverwebdriverwait

NoSuchElementException: no such element: Unable to locate element while trying to click dropdown element on amazon.co.uk through Selenium


I am running an automated test in selenium/intelliJ/Java. The webdriver is supposed to click the drop down menu on the Amazon nav bar and then click one of the links within the drop down menu. It does both these things correctly, the drop down option leads to its link, however the selenium test itself fails, here is the error:

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"link text","selector":"Full Shop Directory"}

and here is my code:

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();
    }

The test should be passing as it does what I'm telling it. I assume it's something to do with the link being in the drop down menu, as the error says, but I still don't know how I would rectify this.


Solution

  • To expand the Dropdown Menu on the Amazon nav bar you don't need to click() rather Mouse Hover inducing WebDriverWait and you can use the following solution:

    • Code Block:

      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();
      
    • Console Output:

      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