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