如何处理 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如果要表演真人不推荐
    测试。

  • selectRJourneyselectJourney 是重复的方法并且包含相同的代码。尝试将它们合并为一个。

************************ 已编辑 ** ************************

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