Невозможно выбрать дату отправления на https://spicejet.com через Selenium и Java

Я пытаюсь выбрать «Дату отправления» на 31 октября 2018 года из календаря https://spicejet.com/ Но я получаю сообщение об ошибке "Неизвестная ошибка: Элемент не доступен для клика в точке (832, 242). Другой элемент получит щелчок:..." Пожалуйста, помогите мне. Вот мой код, получающий такое исключение:

public class bookflight extends Thread {

    UtilityMethods utilObj= new UtilityMethods();
    @Test
    public void SighnUp() throws IOException
    {
        utilObj.getdriver().get("https://spicejet.com");
        utilObj.getdriver().manage().window().maximize();

        utilObj.getdriver().findElement(By.id("ctl00_mainContent_ddl_originStation1_CTXT")).click();
        utilObj.getdriver().findElement(By.xpath("//a[contains(text(),'Guwahati (GAU)')]")).click();
        utilObj.getdriver().findElement(By.xpath("//a[contains(text(),'Goa (GOI)')]")).click();
        utilObj.getdriver().findElement(By.className("ui-datepicker-trigger")).click();
        utilObj.getdriver().findElement(By.xpath("//div[@class='ui-datepicker-group ui-datepicker-group-first'])/parent:://table[@class='ui-datepicker-calendar']following-sibling::./a/contains(text(),'31')")).click();           
    }
}

person Rohn Kerry    schedule 29.10.2018    source источник
comment
@Rohan Kerry, ваш XPath неверен   -  person Dhru 'soni    schedule 29.10.2018
comment
//*[@id='ui-datepicker-div']/div[1]/table/tbody/tr[5]/td/a этот xpath возвращает вам всю дату, просто повторите цикл и найдите соответствие, которое вы хотите выбрать.   -  person Dhru 'soni    schedule 29.10.2018
comment
Вы пытались использовать исполнителя javascript, чтобы щелкнуть этот элемент? (При условии, что XPath действителен)   -  person Bharadwaj Pendyala    schedule 29.10.2018
comment
попробуйте проверить мой обновленный пост, который решает проблему, связанную с вашим вопросом к click on the next date.   -  person Yash    schedule 30.10.2018


Ответы (5)


Чтобы выбрать Откуда (например, Гувахати (GAU)), Куда (например, Гоа (GOI)) и < strong>ДАТА ОТПРАВЛЕНИЯ как 31/10 в url https://spicejet.com/ вам нужно вызвать WebDriverWait для желаемого элемента быть интерактивным, и вы можете использовать следующее решение:

  • Блок кода:

    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class spicejet_login {
    
        public static void main(String[] args) {
    
    
            System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
            WebDriver driver = new FirefoxDriver();
            driver.get("https://spicejet.com");
            new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='ctl00_mainContent_ddl_originStation1_CTXT']"))).click();
            driver.findElement(By.xpath("//div[@id='glsctl00_mainContent_ddl_originStation1_CTNR']//table[@id='citydropdown']//li/a[@value='GAU']")).click();
            driver.findElement(By.xpath("//div[@id='ctl00_mainContent_ddl_destinationStation1_CTNR']//table[@id='citydropdown']//li/a[@value='GOI']")).click();
            new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//table[@class='ui-datepicker-calendar']//tr//a[contains(@class,'ui-state-default') and contains(.,'31')]"))).click();
        }
    }
    
  • Снимок браузера:

spicejet_depart_date_31oct2018.png

person DebanjanB    schedule 29.10.2018
comment
Я уже выбрал места, но столкнулся с проблемой выбора даты отъезда. - person Rohn Kerry; 29.10.2018
comment
@RohnKerry Проверьте мой обновленный ответ и дайте мне знать статус - person DebanjanB; 29.10.2018
comment
Я пробовал, получаю ошибку - такого элемента нет: невозможно найти элемент: {method:xpath,selector://div[@id='ctl00_mainContent_ddl_destinationStation1_CTNR']//table[@id='citydropdown']//li/ а[@value='ГОИ']} - person Rohn Kerry; 29.10.2018
comment
Я просто застрял на дате отправления, мне нужно получить дату 31 октября. Остальная часть моего кода работает нормально. - person Rohn Kerry; 29.10.2018
comment
@RohnKerry Я думаю, что вы ранее отмечали, что я уже выбрал места, у меня возникла проблема с выбором даты отправления. Так что Unable to locate element: {"method":"xpath","selector":"//div[@id='ctl00_mainContent_ddl_destinationStation1_CTNR']//table[@id='citydropdown']//li/a[@value='GOI']"} в любом случае не должно быть проблемой. Каков ваш точный вопрос? Где именно ты застрял? - person DebanjanB; 29.10.2018
comment
Меня поражает выбор даты из календаря. Предположим, если мне нужно выбрать дату отъезда 31 октября из календаря, я не могу щелкнуть 31 из календаря. - person Rohn Kerry; 29.10.2018
comment
@RohnKerry Проверьте мой обновленный ответ и дайте мне знать статус - person DebanjanB; 29.10.2018

Существует множество различных факторов, которые приводят к этому исключению, я хотел бы предложить вам немного подождать.

WebDriverWait wait = new WebDriverWait(utilObj.getdriver(), 10);
wait.until(ExpectedConditions.elementToBeClickable(By.id("ctl00_mainContent_ddl_originStation1_CTXT")));

затем попробуйте щелкнуть элемент,

utilObj.getdriver().findElement(By.id("ctl00_mainContent_ddl_originStation1_CTXT")).click();
person Ashish Kamble    schedule 29.10.2018

Вы можете щелкнуть элемент по классу действия на основе типа исключения:

Actions action = new Actions(driver);
action.moveToElement(WebElement to click).click().perform();
person Ishita Shah    schedule 29.10.2018

Обновлен ответ, чтобы нажать следующую дату.

//div[contains(@class, 'ui-datepicker-group-first')]//td[@data-month='9' and @data-year='2018']/a[.=31]

Вы можете изменить указанный выше XPATH, чтобы выбрать дату на основе YEAR/MONTH/DATE. для получения дополнительной информации XPath creation go-through my answers.

var path ="//div[contains(@class, 'ui-datepicker-group-first')]//td[@data-month='9' and @data-year='2018']/a[.=31]";
var elem = document.evaluate(path, window.document, null, 9, null ).singleNodeValue;
console.log( elem );
elem.click();

Когда вы вводите данные FROM и TO, автоматически выбирается поле DEPART DATE. Итак, вам просто нужно выбрать первые данные с помощью javascript.

FROM « //div[@id='ctl00_mainContent_ddl_originStation1_CTNR']//a[@text='Guwahati (GAU)']
TO « //div[@id='ctl00_mainContent_ddl_destinationStation1_CTNR']//a[@text='Goa (GOI)']
DEPART DATE «
//div[contains(@class, 'ui-datepicker-group-first')]//a[contains(@class, 'ui-state-active')]

образец тестовой программы.

import io.github.yash777.driver.Browser;
import io.github.yash777.driver.Drivers;
import io.github.yash777.driver.WebDriverException;

public class SpiceJET {
    static WebDriver driver;
    static WebDriverWait explicitWait;
    public static void main(String[] args) throws WebDriverException, IOException {
        test();
    }
    public static void test() throws WebDriverException, IOException {
        Drivers drivers = new Drivers();
        String driverPath = drivers.getDriverPath(Browser.CHROME, 63, "");

        System.setProperty(ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY, driverPath);

        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        driver = new ChromeDriver( capabilities );
        explicitWait = new WebDriverWait(driver, 10);

        //Maximize browser window
        driver.manage().window().maximize();
        //Go to URL which you want to navigate
        driver.get("https://spicejet.com/");

        clickElement("//input[@id='ctl00_mainContent_ddl_originStation1_CTXT'][1]");
        clickElement("//div[@id='ctl00_mainContent_ddl_originStation1_CTNR']//a[@text='Guwahati (GAU)']");
        clickElement("//input[@id='ctl00_mainContent_ddl_destinationStation1_CTXT'][1]");
        clickElement("//div[@id='ctl00_mainContent_ddl_destinationStation1_CTNR']//a[@text='Goa (GOI)']");

        clickUsingJavaScript("//div[contains(@class, 'ui-datepicker-group-first')]//a[contains(@class, 'ui-state-active')]");
    }
}
public static void clickElement(String locator) {
    By findBy = By.xpath( locator );
    WebElement element = explicitWait.until(ExpectedConditions.elementToBeClickable( findBy ));
    element.click();
}

public static void clickUsingJavaScript( String locator ) {
    StringBuffer click = new StringBuffer();
    click.append("var elem = document.evaluate(\""+locator+"\", window.document, null, 9, null ).singleNodeValue;");
    click.append("elem.click();");
    System.out.println("JavaScript Click.");
    jse.executeScript( click.toString() );
}

Для автоматического управления исполняемым файлом драйвера Selenium во время выполнения для Java используйте SeleniumWebDrivers< /а>

ПРИМЕЧАНИЕ. Если вы выбираете DEPART DATE, который был выбран автоматически, селен выдает исключение.

Исключение в потоке «основной» org.openqa.selenium.WebDriverException: неизвестная ошибка: элемент <input type="text" readonly="readonly" id="ctl00_mainContent_view_date2" class="custom_date_pic required home-date-pick"> не доступен для клика в точке (784, 241). Другой элемент получит клик: <span class="ui-datepicker-month">...</span>

person Yash    schedule 29.10.2018
comment
Можно решить более простым способом: new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath(//table[@class='ui-datepicker-calendar']//tr//a [содержит(@class,'ui-state-default') и содержит(.,'31')]))).click(); - person Rohn Kerry; 30.10.2018
comment
@RohnKerry мы можем решить разными способами, это нормально. Это решает вашу проблему или не связано с вашим вопросом. - person Yash; 30.10.2018

Я надеюсь, что приведенный ниже код будет полезен и обработает дату отправления и возвращения.

public class SpicejetDropdowns1 {	
public static void main(String[] args) throws InterruptedException
{	System.setProperty("webdriver.chrome.driver","E:\\ChromeDriver\\ChromeDriver2.46\\chromedriver.exe");
WebDriver driver=new ChromeDriver();   
driver.get("http://www.spicejet.com/");
driver.manage().window().maximize();
System.out.println(driver.getTitle());	    driver.findElement(By.cssSelector("#ctl00_mainContent_rbtnl_Trip_1")).click();
// OriginStation
driver.findElement(By.xpath(".//*[@id='ctl00_mainContent_ddl_originStation1_CTXT']")).click();
driver.findElement(By.cssSelector("a[value='DEL']")).click();     
// Destination
driver.findElement(By.xpath(".//*[@id='ctl00_mainContent_ddl_destinationStation1_CTXT']")).click();
driver.findElement(By.xpath("(//a[@value='HYD'])[2]")).click();
Thread.sleep(3000);	driver.findElement(By.xpath("//input[@id='ctl00_mainContent_view_date1']")).click();
if(driver.findElement(By.id("Div1")).getAttribute("style").contains("1"))
{
System.out.println("its enabled");
Assert.assertTrue(true);
}
else
{
Assert.assertTrue(false);
}
while(!driver.findElement(By.cssSelector("div[class='ui-datepicker-title'] [class='ui-datepicker-month']")).getText().contains("October"))
{
// driver.findElement(By.xpath("//span[contains(text(),'Next')]")).click();
driver.findElement(By.xpath("//a[@class='ui-datepicker-next ui-corner-all']/span[@class='ui-icon ui-icon-circle-triangle-e']")).click();
System.out.println(driver.findElement(By.cssSelector("div[class='ui-datepicker-title'] [class='ui-datepicker-month']")).getText());
}
List<WebElement> dates= driver.findElements(By.xpath("//table[@class='ui-datepicker-calendar']//tr//td"));
int count= dates.size();
for(int i=0; i<count; i++)
{
String txt = driver.findElements(By.xpath("//table[@class='ui-datepicker-calendar']//tr//td")).get(i).getText();
if(txt.equalsIgnoreCase("28"))
{
driver.findElements(By.xpath("//table[@class='ui-datepicker-calendar']//tr//td")).get(i).click();
System.out.println(txt);
break;
}
}
// Return Date  Selection
Thread.sleep(3000);	driver.findElement(By.xpath("//input[@id='ctl00_mainContent_view_date2']")).click();
while(!driver.findElement(By.cssSelector("div[class='ui-datepicker-title'] [class='ui-datepicker-month']")).getText().contains("October"))
{
// driver.findElement(By.xpath("//span[contains(text(),'Next')]")).click();
driver.findElement(By.xpath("//a[@class='ui-datepicker-next ui-corner-all']/span[@class='ui-icon ui-icon-circle-triangle-e']")).click();
System.out.println(driver.findElement(By.cssSelector("div[class='ui-datepicker-title'] [class='ui-datepicker-month']")).getText());
}
List<WebElement> MDates= driver.findElements(By.xpath("//table[@class='ui-datepicker-calendar']//tr//td"));
int Mcount= dates.size();
for(int i=0; i<Mcount; i++)
{
String txt = driver.findElements(By.xpath("//table[@class='ui-datepicker-calendar']//tr//td")).get(i).getText();
if(txt.equalsIgnoreCase("31"))
{
driver.findElements(By.xpath("//table[@class='ui-datepicker-calendar']//tr//td")).get(i).click();
System.out.println(txt);
break;
}
}
//Select Passengers
Thread.sleep(4000);
driver.findElement(By.xpath(".//*[@id='divpaxinfo']")).click();
Thread.sleep(4000);
WebElement Adults = driver.findElement(By.xpath("//select[@id='ctl00_mainContent_ddl_Adult']")); Select adultsdrp = new Select(Adults);
adultsdrp.selectByValue("2");
WebElement childs = driver.findElement(By.xpath("//select[@id='ctl00_mainContent_ddl_Child']"));
Select childsdrp = new Select(childs);
childsdrp.selectByValue("2");
driver.findElement(By.xpath(".//*[@id='divpaxinfo']")).click();
System.out.println(driver.findElement(By.xpath(".//*[@id='divpaxinfo']")).getText());
//Static Currency Dropdown
WebElement Currency =  driver.findElement(By.id("ctl00_mainContent_DropDownListCurrency"));
Select currencydrp = new Select(Currency);
currencydrp.selectByValue("USD");	Assert.assertEquals(driver.findElement(By.id("ctl00_mainContent_DropDownListCurrency")).getAttribute("value"), "USD");	System.out.println(driver.findElement(By.id("ctl00_mainContent_DropDownListCurrency")).getAttribute("value"));
}
}

person Ramesh Korla    schedule 30.10.2019