Щелчок WebElement(), показывающий исключение NullPointerException в Selenium

#selenium #selenium-webdriver #junit #selenium-chromedriver #junit4

#селен #selenium-webdriver #junit #selenium-chromedriver #junit4

Вопрос:

Я пытался провести тестирование автоматизации Selenium в https://www.yatra.com/etw-desktop / . Моей целью было нажать кнопку с изображением с именем «Азия», которая перенаправит на другую страницу (прилагаемые изображения). Я скопировал полный XPath и попытался, но я получаю исключение NullPointerException. Пожалуйста, дайте несколько предложений, так как я не нашел ничего плохого в своем коде.

 package com.stackroute.SeleniumProject;
import java.util.concurrent.TimeUnit;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.FindBy;

/**
 * JUnit project.
 */
public class Yatra {
    public static WebDriver driver = null;
    @FindBy(xpath = "/html/body/my-app//app-drawer-layout/app-header-layout/iron-pages/my-home//div/div/div/div/paper-material[2]/div[1]/div/a[2]/div[4]")
    WebElement Asia;

    @BeforeClass
    public static void setup() {
        String chromePath = System.getProperty("user.dir")   "/lib/chromedriver.exe";// directory of chrome driver
        System.setProperty("webdriver.chrome.driver", chromePath);
        driver = new ChromeDriver();
    }

    @AfterClass
    public static void close() throws InterruptedException {
        driver.close();
    }

    @Test
    public void test1() throws InterruptedException {
        driver.manage().window().maximize();
        driver.get("https://www.yatra.com/etw-desktop/");
        driver.manage().timeouts().implicitlyWait(4000, TimeUnit.MILLISECONDS);
        Thread.sleep(5000);

        // the error is in the below line Asia.click()

        Asia.click();
        driver.manage().timeouts().implicitlyWait(5000, TimeUnit.MILLISECONDS);
        Thread.sleep(2000);

        Assert.assertEquals("page not found", "https://www.yatra.com/etw-desktop/city-list", driver.getCurrentUrl());
    }

}
  

Изображение, показывающее элемент, на который нужно щелкнуть

Изображение веб-страницы после операции щелчка

Ответ №1:

Вы используете PageFactory(из объектной модели страницы), поэтому вам нужно будет инициализировать() webelements.

Для этого вам нужно будет импортировать

 org.openqa.selenium.support.PageFactory;
  

Перед началом теста вам нужно будет инициализировать элементы:

 PageFactory.initElements(driver, this)  // where you pass the driver and this class to know which webelements to start.
  

Вы можете взглянуть здесь, чтобы понять подход и другое РУКОВОДСТВО по POM framework, более понятное для понимания

Комментарии:

1. я не хотел использовать PageFactory. Итак, я удалил @findBy и добавил driver.findElement(By.xpath(.....)).click(); в тест вместо Asia.click(); , и я не получаю такого исключения элемента. Есть ли какие-либо ограничения для click(), когда div задействован в html XPath?

2. находится ли ваш webelement внутри iframe?

3. Нет. Я проверил консоль. Я пробовал ожидать и ожидать ожидания. По-прежнему не нажимается кнопка изображения «Азия» (показана на прикрепленном изображении моего вопроса). new WebDriverWait(driver,20).until(ExpectedConditions.elementToBeClickable (By.xpath("//*[@id="scrollable1"]/div[1]/div/a[2]/div[4]"))).click();

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

5. Он выделен. Подразделения находятся под #shadow-root(открыты). Я не знаю, проблема ли это, поскольку я вижу это впервые.