无法使用JavascrtptExecutor从下拉列表中选择选项

时间:2016-10-12 15:19:22

标签: java selenium webdriver

任何人都可以为我提供一个故障保护(ish)方法,用于从我正在练习的此页面上的下拉列表中选择文本吗?

https://www.club18-30.com/club18-30

具体来说,'来自'和'到'机场下拉菜单。我使用以下代码:

   public void selectWhereFrom(String query, String whereFromSelect) throws InterruptedException {
    WebElement dropDownContainer = driver.findElement(By.xpath(departureAirportLocator));
    dropDownContainer.click();

    selectOption(query,whereFromSelect);
}

public void selectOption(String query, String option) {
    String script =
            "function selectOption(s) {\r\n" +
                    "   var sel = document.querySelector(' " + query + "');\r\n" +
                    "   for (var i = 0; i < sel.options.length; i++)\r\n" +
                    "   {\r\n" +
                    "       if (sel.options[i].text.indexOf(s) > -1)\r\n" +
                    "       {\r\n" +
                    "           sel.options[i].selected = true;\r\n" +
                    "           break;\r\n" +
                    "       }\r\n" +
                    "   }\r\n" +
                    "}\r\n" +
                    "return selectOption('" + option + "');";

    javaScriptExecutor(script);
}

这似乎成功填充了包含文字的方框,但是当我点击“搜索”时然后我收到一条消息说我需要选择一个选项,建议它没有注册选择?

我宁愿避免使用JavaScriptExecutor但是还没有能够使这些Selects能够使用常规的Selenium Select机制

1 个答案:

答案 0 :(得分:0)

我会为每个下拉菜单设置一个功能,一个用于设置出发机场,另一个用于设置目的地机场。我已经测试了下面的代码并且它可以工作。

功能

public static void setDepartureAirport(String airport)
{
    driver.findElement(By.cssSelector("div.departureAirport div.departurePoint")).click();
    String xpath = "//div[contains(@class, 'departurePoint')]//ul//li[contains(@class, 'custom-select-option') and contains(text(), '"
            + airport + "')]";
    driver.findElement(By.xpath(xpath)).click();
}

public static void setDestinationAirport(String airport)
{
    driver.findElement(By.cssSelector("div.destinationAirport div.airportSelect")).click();
    String xpath = "//div[contains(@class, 'destinationAirport')]//ul//li[contains(@class, 'custom-select-option') and contains(text(), '"
            + airport + "')]";
    driver.findElement(By.xpath(xpath)).click();
}

你称之为

driver.get("https://www.club18-30.com/club18-30");
setDepartureAirport("(MAN)");
setDestinationAirport("(IBZ)");

我建议您使用3个字母的机场代码进行搜索,例如:曼彻斯特的“(MAN)”。这对每个机场都是独一无二的,但您可以使用文本的任何独特部分。