NoSuchElementException: такого элемента нет: невозможно найти элемент при попытке щелкнуть раскрывающийся элемент на amazon.co.uk через Selenium - PullRequest
0 голосов
/ 25 января 2019

Я запускаю автоматический тест в selenium / intelliJ / Java. Веб-драйвер должен щелкнуть раскрывающееся меню на панели навигации Amazon, а затем щелкнуть одну из ссылок в раскрывающемся меню. Он делает обе эти вещи правильно, выпадающий вариант ведет к его ссылке, однако сам тест селена не проходит, вот ошибка:

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

и вот мой код:

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

Тест должен пройти, поскольку он делает то, что я говорю. Я предполагаю, что это связано с тем, что ссылка находится в выпадающем меню, как говорит ошибка, но я до сих пор не знаю, как бы это исправить. Любая помощь будет оценена, спасибо.

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вам нужно дождаться, чтобы этот конкретный компонент стал видимым.После его отображения вы можете применить к нему действие.

Вы можете попробовать код ниже.

WebElement ShopAllNav = driver.findElement(By.linkText("Full Shop Directory"));
WebDriverWait wait = new WebDriverWait(driver,200);
wait.until(ExpectedConditions.visibilityOf(ShopAllNav));
ShopAllNav.click();
0 голосов
/ 25 января 2019

Чтобы развернуть выпадающее меню на навигационной панели Amazon , вам не нужно click(), скорее Мышь при наведении , вызывающая WebDriverWait , и вы можете использовать следующее решение:

  • Кодовый блок:

    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();
    
  • Выход на консоль:

    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
    
0 голосов
/ 25 января 2019

То, что я видел в Амазонке:

enter image description here

'полный каталог магазина' не является (на самом деле текст ссылки).если элемент <a>this is a text</a>, тогда я рассматриваю его как текст ссылки.

В вашем случае текст состоит из множества пробелов ********** Полный каталог магазина ********** и этот нестабильный и может вызвать проблемы (возможно, в вашем случае).

Исправьте ваш локатор, чтобы быть структурно-безопасным и попробуйте снова.

Пример: xpath: //a/span[@class='nav-text' and text()='Full Shop Directory']

Обновление: Ваш тест написан неправильно или вы не знаете, какова ваша настоящая цель.

Что вы делаете:

  1. нажмите на навигационное меню, и откроется та же страница просмотра «полного каталога магазина».ссылки разные.
  2. нажмите на кнопку в «магазине по отделу» (которая скрыта)
  3. указать URL-адрес ...

Предлагаемые действия:

  1. Перейдите в «магазин по отделу» и вызовите раскрывающийся список.

  2. нажмите кнопку «Полный каталог магазина» из раскрывающегося списка.

  3. ждать загрузки страницы

  4. URL страницы подтверждения.

Код:

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");

Код был протестирован и подтвержден как работающий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...