[英]Unable to select depart date in https://spicejet.com through Selenium and Java
I am trying to select a "Depart date" as of 31st october 2018 from the calender https://spicejet.com/ But I am getting error "unknown error: Element is not clickable at point (832, 242). Other element would receive the click: ..." Please help me out.我正在尝试从日历https://spicejet.com/ 中选择截至 2018 年 10 月 31 日的“出发日期”但我收到错误“未知错误:元素在点 (832, 242) 处不可点击。其他元素会收到点击:...”请帮帮我。 Here is my code getting such exception:
这是我的代码得到这样的异常:
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();
}
}
To select From (eg Guwahati(GAU) ), To (eg Goa(GOI) ) destination and DEPART DATE as 31/10 within the url https://spicejet.com/
you need to induce WebDriverWait for the desired element to be clickable and you can use the following solution:要在url
https://spicejet.com/
选择From (eg Guwahati(GAU) )、 To (eg Goa(GOI) ) 目的地和DEPART DATE作为31/10 ,您需要诱导WebDriverWait以使所需元素可点击您可以使用以下解决方案:
Code Block:代码块:
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(); } }
Browser Snapshot:浏览器快照:
There is lots of different factors which results into this exception, i like to suggest you to try putting some wait.导致此异常的因素有很多,我建议您尝试等待。
WebDriverWait wait = new WebDriverWait(utilObj.getdriver(), 10);
wait.until(ExpectedConditions.elementToBeClickable(By.id("ctl00_mainContent_ddl_originStation1_CTXT")));
then try clicking element,然后尝试单击元素,
utilObj.getdriver().findElement(By.id("ctl00_mainContent_ddl_originStation1_CTXT")).click();
You can click on element by Action class, based on Exception type:您可以根据异常类型按 Action 类单击元素:
Actions action = new Actions(driver);
action.moveToElement(WebElement to click).click().perform();
Updated answer to click next date.更新了点击下一个日期的答案。
//div[contains(@class, 'ui-datepicker-group-first')]//td[@data-month='9' and @data-year='2018']/a[.=31]
You can modify the above XPATH
to select date based on YEAR/MONTH/DATE
.您可以修改上面的
XPATH
以根据YEAR/MONTH/DATE
选择日期。 for more XPath creation go-through my answers
.更多
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();
When you enter FROM
and TO
data, then DEPART DATE
field get auto selected.当您输入
FROM
和TO
数据时, DEPART DATE
字段将被自动选中。 So, just you need to select the first data using javascript.因此,您只需要使用 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')]
sample test program.示例测试程序。
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() );
}
For Automatic management of Selenium Driver Executable's in run-time for Java use
SeleniumWebDrivers
为了在 Java 运行时自动管理 Selenium 驱动程序可执行文件,请使用
SeleniumWebDrivers
NOTE: If you are selecting DEPART DATE
which got auto selected then selenium throws exception注意:如果您选择了自动选择的
DEPART DATE
,则 selenium 会抛出异常
Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: Element
<input type="text" readonly="readonly" id="ctl00_mainContent_view_date2" class="custom_date_pic required home-date-pick">
is not clickable at point (784, 241).线程“main” org.openqa.selenium.WebDriverException 中的异常:未知错误:元素
<input type="text" readonly="readonly" id="ctl00_mainContent_view_date2" class="custom_date_pic required home-date-pick">
不可点击在点 (784, 241)。 Other element would receive the click:<span class="ui-datepicker-month">...</span>
其他元素会收到点击:
<span class="ui-datepicker-month">...</span>
I hope below code is helpful and handle departure and return date我希望下面的代码有帮助,并处理出发和返回日期
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")); } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.