如何处理 Selenium webdriver 在 Abhibus 中的 return 旅程的第二个日期选择器?
How to handle Second datepicker for return journey in Abhibus by Selenium webdriver?
我正在为 select 旅程日期和 return 旅程日期编写代码,但 return 旅程没有得到 selected。驱动程序直接跳转到搜索按钮而不输入 return 日期。
public class Callender {
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:\Program Files\selenium\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.abhibus.com/");
//to select leaving from
WebElement source =driver.findElement(By.xpath("//*[@id='source']"));
source.clear();
source.sendKeys("Tenal");
Thread.sleep(2000);
source.sendKeys(Keys.ENTER);
//to select destination
WebElement destination =driver.findElement(By.xpath("//*[@id='destination']"));
destination.clear();
destination.sendKeys("Hyderaba");
Thread.sleep(2000);
destination.sendKeys(Keys.ENTER);
WebElement element = driver.findElement(By.xpath("//*[@id=\"datepicker1\"]"));
String journeydate="04-10-2019";
selectJourney(driver,element,journeydate);
Thread.sleep(3000);
WebElement element1 = driver.findElement(By.xpath("//*[@id=\"datepicker2\"]"));
String returndate="06-10-2019";
selectRJourney(driver,element1,returndate);
//to click search button
driver.findElement(By.xpath("//*[@id=\"roundTrip\"]/a")).click();
}
public static void selectRJourney(WebDriver driver, WebElement element1, String returndate) {
JavascriptExecutor je=(JavascriptExecutor)driver;
je.executeScript("arguments[0].setAttribute('value','"+returndate+"');", element1);
// TODO Auto-generated method stub
}
public static void selectJourney(WebDriver driver,WebElement element,String journeydate) {
JavascriptExecutor js= (JavascriptExecutor)driver;
js.executeScript("arguments[0].setAttribute('value','"+journeydate+"');",element);
}
你能帮我弄清楚哪里出了问题或者我做错了什么吗?
请使用以下代码。通过使用 document.getElementById('datepicker1').value = "Your_Date"
设置日历值。
String journeydate="04-10-2019";
selectJourney(driver,journeydate);
Thread.sleep(3000);
String returndate="06-10-2019";
selectRJourney(driver,returndate);
我修改了你的代码:
public static void selectRJourney(WebDriver driver, String returndate) {
JavascriptExecutor je=(JavascriptExecutor)driver;
je.executeScript("document.getElementById('datepicker2').value = '"+returndate+"';");
}
public static void selectJourney(WebDriver driver,String journeydate) {
JavascriptExecutor je=(JavascriptExecutor)driver;
je.executeScript("document.getElementById('datepicker1').value = '"+journeydate+"';");
}
建议:
而不是使用 xpath
,您可以轻松地使用 id
.
JavascriptExecutor
如果要表演真人不推荐
测试。
selectRJourney
和 selectJourney
是重复的方法并且包含相同的代码。尝试将它们合并为一个。
************************ 已编辑 ** ************************
String journeydate="04-10-2019";
selectDateFromCalender(driver,"datepicker1",journeydate);
Thread.sleep(3000);
String returndate="06-10-2019";
selectDateFromCalender(driver,"datepicker2",returndate);
您可以创建通用方法 selectDateFromCalender
并将日期选择器 ID 作为参数传递:
public static void selectDateFromCalender(WebDriver driver, String datePickerId, String returndate) {
JavascriptExecutor je=(JavascriptExecutor)driver;
je.executeScript("document.getElementById('"+datePickerId+"').value = '"+returndate+"';");
}
***** 根据您的主要要求破解 ******
driver.findElement(By.id("datepicker1")).click();
int currentSelectedDate = Integer.parseInt(driver.findElement(By.cssSelector(".ui-state-highlight")).getText());
driver.findElement(By.cssSelector(".ui-state-highlight")).click();
driver.findElement(By.id("datepicker2")).click();
if(currentSelectedDate>=30)
driver.findElement(By.xpath("//a[@class='ui-state-default'][contains(text(),'1')]")).click();
else
driver.findElement(By.xpath("//a[@class='ui-state-default'][contains(text(),'"+(currentSelectedDate+1)+"')]")).click();
试试这个方法。
我使用自动管理 webdriver 的 Selenide。
您可以修改日期选择以满足您的需要。
BusSearchTest.java
package com.abhibus;
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.SelenideElement;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static com.codeborne.selenide.Condition.appear;
import static com.codeborne.selenide.Condition.text;
import static com.codeborne.selenide.Selenide.$;
import static com.codeborne.selenide.Selenide.open;
public class BusSearchTest {
@DataProvider
public static Object[][] itineraries() {
return new String[][]{
{"Tenal", "Tenali", "Hyderaba", "Hyderabad", "Tenali → Hyderabad"}
};
}
@BeforeTest
public void setup() {
Configuration.timeout = 10 * 1000;
}
@BeforeMethod
public void beforeMethod() {
open("https://www.abhibus.com/");
}
@Test(description = "Search Buses", dataProvider = "itineraries")
public void busSearch(String from, String fromExpected, String to, String toExpected, String expected) {
//to select leaving from
$("#source").setValue(from);
$("#ui-id-1 li.ui-menu-item")
.shouldHave(text(fromExpected))
.shouldBe(appear)
.click();
//to select destination
$("#destination").setValue(to);
$("#ui-id-2 li.ui-menu-item")
.shouldHave(text(toExpected))
.shouldBe(appear)
.click();
// from date: 04-October-2019
$("#datepicker1").click();
SelenideElement datePicker1 = $(".ui-datepicker-group-first");
while (!datePicker1.find("span.ui-datepicker-month").text().trim().equals("October")) {
$(".ui-datepicker-group-last").find("span").shouldHave(text("Next")).click();
}
datePicker1.findAll("tr td a").filterBy(text("4")).first().click();
// to date: 06-October-2019
$("#datepicker2").click();
SelenideElement datePicker2 = $(".ui-datepicker-group-first");
while (!datePicker2.find("span.ui-datepicker-month").text().trim().equals("October")) {
$(".ui-datepicker-group-last").find("span").shouldHave(text("Next")).click();
}
datePicker2.findAll("tr td a").filterBy(text("6")).first().click();
// click search
$("a[title='Search Buses']").click();
// assert search page
$("#SubHead1way h1").shouldHave(text(expected));
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>tech.webisto</groupId>
<artifactId>abhibus-tests</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<suiteXmlFiles>
<suiteXmlFile>test.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
</dependency>
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>selenide</artifactId>
<version>5.2.8</version>
</dependency>
</dependencies>
</project>
您可以在此处签出代码:
https://github.com/WebistoTech/AbhiBusTests.git
我正在为 select 旅程日期和 return 旅程日期编写代码,但 return 旅程没有得到 selected。驱动程序直接跳转到搜索按钮而不输入 return 日期。
public class Callender {
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:\Program Files\selenium\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.abhibus.com/");
//to select leaving from
WebElement source =driver.findElement(By.xpath("//*[@id='source']"));
source.clear();
source.sendKeys("Tenal");
Thread.sleep(2000);
source.sendKeys(Keys.ENTER);
//to select destination
WebElement destination =driver.findElement(By.xpath("//*[@id='destination']"));
destination.clear();
destination.sendKeys("Hyderaba");
Thread.sleep(2000);
destination.sendKeys(Keys.ENTER);
WebElement element = driver.findElement(By.xpath("//*[@id=\"datepicker1\"]"));
String journeydate="04-10-2019";
selectJourney(driver,element,journeydate);
Thread.sleep(3000);
WebElement element1 = driver.findElement(By.xpath("//*[@id=\"datepicker2\"]"));
String returndate="06-10-2019";
selectRJourney(driver,element1,returndate);
//to click search button
driver.findElement(By.xpath("//*[@id=\"roundTrip\"]/a")).click();
}
public static void selectRJourney(WebDriver driver, WebElement element1, String returndate) {
JavascriptExecutor je=(JavascriptExecutor)driver;
je.executeScript("arguments[0].setAttribute('value','"+returndate+"');", element1);
// TODO Auto-generated method stub
}
public static void selectJourney(WebDriver driver,WebElement element,String journeydate) {
JavascriptExecutor js= (JavascriptExecutor)driver;
js.executeScript("arguments[0].setAttribute('value','"+journeydate+"');",element);
}
你能帮我弄清楚哪里出了问题或者我做错了什么吗?
请使用以下代码。通过使用 document.getElementById('datepicker1').value = "Your_Date"
设置日历值。
String journeydate="04-10-2019";
selectJourney(driver,journeydate);
Thread.sleep(3000);
String returndate="06-10-2019";
selectRJourney(driver,returndate);
我修改了你的代码:
public static void selectRJourney(WebDriver driver, String returndate) {
JavascriptExecutor je=(JavascriptExecutor)driver;
je.executeScript("document.getElementById('datepicker2').value = '"+returndate+"';");
}
public static void selectJourney(WebDriver driver,String journeydate) {
JavascriptExecutor je=(JavascriptExecutor)driver;
je.executeScript("document.getElementById('datepicker1').value = '"+journeydate+"';");
}
建议:
而不是使用
xpath
,您可以轻松地使用id
.JavascriptExecutor
如果要表演真人不推荐
测试。selectRJourney
和selectJourney
是重复的方法并且包含相同的代码。尝试将它们合并为一个。
************************ 已编辑 ** ************************
String journeydate="04-10-2019";
selectDateFromCalender(driver,"datepicker1",journeydate);
Thread.sleep(3000);
String returndate="06-10-2019";
selectDateFromCalender(driver,"datepicker2",returndate);
您可以创建通用方法 selectDateFromCalender
并将日期选择器 ID 作为参数传递:
public static void selectDateFromCalender(WebDriver driver, String datePickerId, String returndate) {
JavascriptExecutor je=(JavascriptExecutor)driver;
je.executeScript("document.getElementById('"+datePickerId+"').value = '"+returndate+"';");
}
***** 根据您的主要要求破解 ******
driver.findElement(By.id("datepicker1")).click();
int currentSelectedDate = Integer.parseInt(driver.findElement(By.cssSelector(".ui-state-highlight")).getText());
driver.findElement(By.cssSelector(".ui-state-highlight")).click();
driver.findElement(By.id("datepicker2")).click();
if(currentSelectedDate>=30)
driver.findElement(By.xpath("//a[@class='ui-state-default'][contains(text(),'1')]")).click();
else
driver.findElement(By.xpath("//a[@class='ui-state-default'][contains(text(),'"+(currentSelectedDate+1)+"')]")).click();
试试这个方法。 我使用自动管理 webdriver 的 Selenide。
您可以修改日期选择以满足您的需要。
BusSearchTest.java
package com.abhibus;
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.SelenideElement;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static com.codeborne.selenide.Condition.appear;
import static com.codeborne.selenide.Condition.text;
import static com.codeborne.selenide.Selenide.$;
import static com.codeborne.selenide.Selenide.open;
public class BusSearchTest {
@DataProvider
public static Object[][] itineraries() {
return new String[][]{
{"Tenal", "Tenali", "Hyderaba", "Hyderabad", "Tenali → Hyderabad"}
};
}
@BeforeTest
public void setup() {
Configuration.timeout = 10 * 1000;
}
@BeforeMethod
public void beforeMethod() {
open("https://www.abhibus.com/");
}
@Test(description = "Search Buses", dataProvider = "itineraries")
public void busSearch(String from, String fromExpected, String to, String toExpected, String expected) {
//to select leaving from
$("#source").setValue(from);
$("#ui-id-1 li.ui-menu-item")
.shouldHave(text(fromExpected))
.shouldBe(appear)
.click();
//to select destination
$("#destination").setValue(to);
$("#ui-id-2 li.ui-menu-item")
.shouldHave(text(toExpected))
.shouldBe(appear)
.click();
// from date: 04-October-2019
$("#datepicker1").click();
SelenideElement datePicker1 = $(".ui-datepicker-group-first");
while (!datePicker1.find("span.ui-datepicker-month").text().trim().equals("October")) {
$(".ui-datepicker-group-last").find("span").shouldHave(text("Next")).click();
}
datePicker1.findAll("tr td a").filterBy(text("4")).first().click();
// to date: 06-October-2019
$("#datepicker2").click();
SelenideElement datePicker2 = $(".ui-datepicker-group-first");
while (!datePicker2.find("span.ui-datepicker-month").text().trim().equals("October")) {
$(".ui-datepicker-group-last").find("span").shouldHave(text("Next")).click();
}
datePicker2.findAll("tr td a").filterBy(text("6")).first().click();
// click search
$("a[title='Search Buses']").click();
// assert search page
$("#SubHead1way h1").shouldHave(text(expected));
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>tech.webisto</groupId>
<artifactId>abhibus-tests</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<suiteXmlFiles>
<suiteXmlFile>test.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
</dependency>
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>selenide</artifactId>
<version>5.2.8</version>
</dependency>
</dependencies>
</project>
您可以在此处签出代码: https://github.com/WebistoTech/AbhiBusTests.git