NullpointerException, использующий findElements в Selenium и alter, не обрабатывается - PullRequest
0 голосов
/ 29 июня 2018
  1. Получение исключения NullPointerException при использовании метода findElements со списком. Пробовал с моделью POM, а получал ту же ошибку. прокомментировал часть кода findelements и протестировал, что он работает нормально. Я не уверен, что не так в моем коде.

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

Что нужно исправить в моем коде?

Код:

import java.util.ArrayList;
import java.util.List;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;

class CleartripPOM1 {
    WebDriver driver;
    private String url="https://www.cleartrip.com/";
    public CleartripPOM1(WebDriver driver) {
        this.driver=driver;
}

By from=By.xpath("//input[@title='Any worldwide city or airport' and @etitle='From']");
By to=By.xpath("//input[@title='Any worldwide city or airport' and @etitle='To']");
By date=By.xpath("//input[@id='DepartDate']");
By adults=By.id("Adults");
By childerns=By.cssSelector("select[name='childs'][id='Childrens']" );
By infants=By.name("infants");
By search=By.xpath("//input[@id='SearchBtn']");
By airline=By.xpath("//li[@class='vendor']/a");
By depart=By.xpath("//li[@class='depart']/a");
By duration=By.xpath("//li[@class='duration']/a");
By price=By.xpath("//li[@class='price']/a");
private List <WebElement>coupon =driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/td/span"));
private List <WebElement> airName=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th/small"));
private List <WebElement> departure=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='depart']"));
private List <WebElement> arrival=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='arrive']"));
private List <WebElement> travelTime=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='duration']"));
private List <WebElement> ticketFare=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='price']"));

public ArrayList<String> airlineNames(List<WebElement>el) {
    ArrayList<String> names= new ArrayList<String>();
    for(WebElement e:el) {
        names.add(e.getText());
    }
    return names;
}

public void url_launch() {
    driver.get(url);
    driver.manage().window().maximize();
//  WebDriverWait wait= new WebDriverWait(driver,20);
//  wait.until(ExpectedConditions.alertIsPresent());
//  Alert alert = driver.switchTo().alert();
//  alert.dismiss();

}
public void actions(By e, String location) {
    Actions act = new Actions(driver);
    Action action= act.click(driver.findElement(e)).sendKeys(location).build();
    action.perform();
}

public void selection(By e,String selection) {
    Select select = new Select(driver.findElement(e));
    select.selectByValue(selection);

}
public void searchFlights() {
    actions(from,"Chennai");
    actions(to,"Madurai");
    actions(date,"25/08/2018");
    driver.findElement(date).sendKeys(Keys.TAB);
    selection(adults,"2");
    selection(childerns,"3");
    selection(infants,"1");
    driver.findElement(search).click();
    WebDriverWait wait= new WebDriverWait(driver,20);
    wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//li[@class='vendor']/a")));
    System.out.println(airlineNames(coupon));
    System.out.println(airlineNames(airName));
    System.out.println(airlineNames(departure));
    System.out.println(airlineNames(arrival));
    System.out.println(airlineNames(travelTime));
    System.out.println(airlineNames(ticketFare));

Код бегуна:

public class TestRunner {

    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        // TODO Auto-generated method stub
        CleartripPOM1 ct= new CleartripPOM1(driver);
        ct.url_launch();
        ct.searchFlights();
    }
}

1 Ответ

0 голосов
/ 29 июня 2018

# 1: Вы инициализируете весь экземплярный веб-элемент перед инициализацией переменной driver и, следовательно, он выбрасывает NullPointerException. Инициализация экземпляра Web-элемента должна быть перемещена внутри конструктора, иначе необходимо переместить в сторону метода, где требуется этот конкретный элемент.

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

Например:

Подход 1: Инициализируйте webelement экземпляра в конструкторе. Так что весь WebElement может быть доступен во всех методах класса.

    WebDriver driver;

    private List <WebElement>coupon;
    private List <WebElement> airName;
    private String url="https://www.cleartrip.com/";
    public CleartripPOM1(WebDriver driver) {
        this.driver=driver;
        coupon=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/td/span"));
        airName=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th/small"));
        -----------
        ----------- and so on

    }

Подход 2: Инициализируйте экземпляр WebElement только внутри метода, где это требуется. Предположим, что вы хотите получить доступ к списку элементов купона и airname только в определенном методе, тогда вы можете инициализировать только этим конкретным методом

    WebDriver driver;

    private List <WebElement>coupon;
    private List <WebElement> airName;
    private String url="https://www.cleartrip.com/";
    public CleartripPOM1(WebDriver driver) {
        this.driver=driver;

    }

    public void travelDetails(){
        coupon=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/td/span"));
        airName=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th/small"));
         -----------
         ----------- and so on

   }

# 2 Что касается оповещения, вы получаете уведомление, относящееся к Chrome. Итак, вам нужно отключить опцию уведомления, как показано ниже в части инициализации драйвера

    ChromeOptions options = new ChromeOptions();
    options.addArguments("--disable-notifications");
    WebDriver driver=new ChromeDriver(options);

Редактировать:

Решить вопрос Вопрос:

После выполнения только действия поиска вы получаете раздел результатов, и весь WebElement списка идентифицируется из раздела результатов. Итак, вам нужно инициализировать весь WebElement List после выполнения действия поиска, как показано ниже.

Что касается объявления веб-элемента, если вы хотите получить доступ к одному и тому же веб-элементу и в другом методе, то вы можете объявить веб-элемент как экземпляр. Если область действия «Список веб-элементов» есть только в методе searchFlights, то я бы предложил объявить внутри Метод searchFlights вместо объявления экземпляра.

Метод поиска необходимо изменить:

public void searchFlights() {
    actions(from,"Chennai");
    actions(to,"Madurai");
    actions(date,"25/08/2018");
    driver.findElement(date).sendKeys(Keys.TAB);
    selection(adults,"2");
    selection(childerns,"3");
    selection(infants,"1");
    driver.findElement(search).click();
    WebDriverWait wait= new WebDriverWait(driver,20);
    wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//li[@class='vendor']/a")));

    coupon =driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/td/span"));
    airName=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th/small"));
    departure=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='depart']"));
    arrival=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='arrive']"));
    travelTime=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='duration']"));
    ticketFare=driver.findElements(By.xpath("//ul[@class='listView flights']/li/table/tbody/tr/th[@class='price']"));


    System.out.println(airlineNames(coupon));
    System.out.println(airlineNames(airName));
    System.out.println(airlineNames(departure));
    System.out.println(airlineNames(arrival));
    System.out.println(airlineNames(travelTime));
    System.out.println(airlineNames(ticketFare));


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