如何将文本发送到使用硒webdriver中的自动完成功能的搜索框

时间:2018-11-30 12:39:00

标签: java selenium selenium-webdriver webdriver webdriverwait

我正在尝试使用此网站https://www.phptravels.net/

预订航班

有一个文本框,您可以开始输入航班始发机场,它会为您提供自动完成建议,即使我在文本框中使用了“检查元素”,我也无法找到它,这是我发现的xpath:

driver.findElement(By.xpath("//*[@id=\"select2-drop\"]/div/input")).click();

enter image description here

我遇到以下错误:

Unable to locate element: {"method":"xpath","selector":"//*[@id="select2-drop"]/div/input"}

任何想法如何找到textbox元素?

3 个答案:

答案 0 :(得分:2)

网站的HTML有点棘手。 您的输入//*[@id='select2-drop']/div/input是“隐藏的”(HTML和硒的观点)。

您需要单击特定元素://*[@id='flights']/form/div[1]以使其“可见”。

所以您的代码必须像这样:

//After click on FLIGHTS...

driver.findElement(By.xpath("//*[@id='flights']/form/div[1]")).click();
Thread.sleep(2*1000);

driver.findElement(By.xpath("//*[@id='select2-drop']/div/input")).sendKeys("Moon");
Thread.sleep(2*1000);

如果您想编写更好的Selenium代码,建议您阅读explicit wait

使用显式等待,您的代码将如下所示:

(new WebDriverWait(driver, 10)).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id='flights']/form/div[1]"))).click();

(new WebDriverWait(driver, 10)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='select2-drop']/div/input")).sendKeys("Moon");

看起来更糟,但是更好。

编辑1

要获取建议列表:

//after type in input, put a wait to be sure the suggestion list is loaded.

List<WebElement> list = driver.findElements(By.xpath("//*[@id='select2-drop']/ul/li/div"));

for(WebElement aux : list) {

    System.out.println(aux.getText());

}

答案 1 :(得分:0)

在网页GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer()); 上单击航班标签,并将字符序列发送到搜索框示例 Pune ,您可以使用以下解决方案:< / p>

https://www.phptravels.net/

答案 2 :(得分:0)

下面的代码可用于在自动完成搜索框中选择第一个建议值。

new WebDriverWait(driver, 
20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='select2- 
search']/input[@class='select2-input select2-focused']"))).sendKeys(Keys.ArrowDown);

new WebDriverWait(driver, 
20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='select2- 
search']/input[@class='select2-input select2-focused']"))).sendKeys(Keys.Enter);