【问题标题】:How to send text to the search box which uses autocomplete in selenium webdriver如何将文本发送到在 selenium webdriver 中使用自动完成功能的搜索框
【发布时间】:2018-11-30 12:39:00
【问题描述】:

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

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

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

我收到以下错误:

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

知道如何定位文本框元素吗?

【问题讨论】:

  • 在找到文本框之前等待页面加载完成几秒钟。
  • 我已经等过了,我可以看到有文本框的页面,但我仍然找不到元素。
  • @tupacshakur 该网站有点棘手。您可以阅读我的回答以了解究竟发生了什么,如果您有不明白的地方,请随时在此处发表评论。
  • 是的,我不明白如何定位元素以使其可见。当然我有几件事要理解:1.如何定位元素以使其可见? 2.开始输入名称时如何选择第一个选项并选择自动完成建议的第一次出现?

标签: java selenium selenium-webdriver webdriver webdriverwait


【解决方案1】:

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

您需要单击特定元素://*[@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.如何定位元素以使其可见? 2.开始输入名称时如何选择第一个选项并选择自动完成建议的第一次出现?
  • 好的,我试过了,终于明白怎么做了。这是一个提高 selenium webdriver 技能的好网站!
  • 我尝试做的是在完成航班搜索后,我希望能够使用 'driver.findelements(By.xpath("")' 我该怎么做?@KunLun
  • @tupacshakur 看看我的新编辑。如果有什么不清楚的地方想谈,可以通过链接在聊天中留言,我会尽快回复(定期查看)。 chat.stackoverflow.com/rooms/184544/…
【解决方案2】:

在网页https://www.phptravels.net/上点击FLIGHTS标签并发送一个字符序列到搜索框示例Pune可以使用以下解决方案:

driver.get("https://www.phptravels.net/");
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[contains(.,'Flights')]"))).click();
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class='select2-chosen' and contains(.,'Enter City Or Airport')]")))click();
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='select2-search']/input[@class='select2-input select2-focused']"))).sendKeys("Pune");

【讨论】:

  • 谢谢丹尼尔,但我指的是“航班”标签而不是酒店。
  • @tupacshakur 查看我的更新答案,让我知道状态。
  • 谢谢!可以按预期工作,但我不明白您放置的 xpath,xpath 字符串中的包含是什么?开始输入机场名称时如何选择第一个建议?
【解决方案3】:

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

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);

【讨论】:

  • 只选择逻辑。
猜你喜欢
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多