selenium能处理自动完成吗?

我有一个测试用例,需要在基于ajax的文本字段中键入部分值,并validation列表是否具有预期的内容。 如果是,请选择内容。 知道如何使这项工作?

type命令可能不足以触发自动完成。 Dave Webb的建议在其他方面都有发现。 我唯一的补充是你可能需要typeKeys命令,这会导致稍微不同的JavaScript事件被触发,这可能更有可能触发自动完成小部件。

我这样做如下:

  • type以在文本字段中输入值。
  • waitForTextPresentverifyTextPresent检查自动完成内容
  • clickclick以单击自动完成列表中的项目

诀窍是让最终click恰好在正确的位置。 您应该能够使用XPath表达式来搜索您希望找到它的文本。

对于WebDriver ,试试这个

以下代码用于自动从自动建议中搜索文本; 主要用于列表项

 driver.findElement(By.id("your searchBox")).sendKeys("your partial keyword"); Thread.sleep(3000); List  listItems = driver.findElements(By.xpath("your list item locator")); listItems.get(0).click(); driver.findElement(By.id("your searchButton")).click(); 

我在IDE中使用了以下序列,

  1. typeKeys
  2. waitForTextPresent
  3. 鼠标移到
  4. clickAt

并且运作良好

我最近在这个主题上写了一篇HOWTO – 使用Selenium来测试一个由AJAX驱动的JQuery自动完成菜单 :

你的问题有些暧昧。

大多数浏览器保留一个基于字段名称的值缓存:这是您的浏览器建议自动完成的值,即使您之前可能从未访问过该站点。 这个function在所有浏览器中都是非标准的,并且selenium没有标准的方法来检测/分析它。 你仍然可以这样做,但你必须自己制作确定值的javascript函数。 然后你可以在selenium中使用“eval”来执行这些function。 我没有看到任何js库可以以跨浏览器兼容的方式告诉你这些值。

另一种方法是使用ajax对部分输入的值进行服务器端提交。 在这种情况下,只需在文本框中键入值并声明预期值出现即可。 通常,自动填充建议会显示在客户端的某个层中。

我发现在做typeKeys之前我需要专注于该领域以使其工作。

这可能对每个人都不起作用,但我只是添加了一个允许我输入延迟字符的方法。

 Actions builder = new Actions(this.webDriver); WebElement element = this.getWebElement(); for (char c : value.toCharArray()) { builder = builder.sendKeys(element, c + ""); builder.pause(100); } builder.build().perform(); 

然后我找到了我要点击的项目(

 resultsElement.findElement(By.xpath("//li[.='" + valueLabel + "']")) 

其中container是resultsElement是包含结果集的WebElement,value标签是我想要点击的值。

同样,它可能不适用于所有人,但它对我有用,我认为分享是谨慎的。

请使用typeKeys而不是type。 也可以使用mouseDown而不是click。 它工作正常。

Patrick的答案绝对重要,我还发现在Jquery UI的最新版本中需要focus和mouseDown。 我录制了一个测试video,以便您可以在Sauce Labs中看到它运行: https : //saucelabs.com/jobs/ad8c561be39bb7a42c9bb3a063214c95

我们在使用typeKeys时遇到了一些问题。 sendKeys似乎成为最终的解决方案,但它仍然是实验性的。 从参考:

这个命令是实验性的。 它可能在将来替换typeKeys命令。

对于那些对细节感兴趣的人,与尝试触发keyDown,keyUp和keyPress事件的typeKeys命令不同,这个命令由来自Selenium 2的primefaces支持,并提供了一个更强大的实现,将在未来。

在typeKeys命令的帮助文本中,它说:

在某些情况下,您可能需要使用简单的“type”命令来设置字段的值,然后使用“typeKeys”命令来发送与您刚输入的内容相对应的击键事件。

所以使用这种组合

 type(selector, text); typeKeys(selector, text); 

这似乎运作良好。

有时TypeKeys不起作用。 这时你可以使用keyDown

单击输入框并在框中键入value和keyDown。

我能够通过使用以下函数来解决这个问题:下面的函数将您想要选择的文本作为参数。 例如:如果要选择“javascript”,只需在文本框中键入“java”并传递要选择的文本,在这种特定情况下,它是“javascript”。

  public void selectOptionWithText(String textToSelect) { try { //Add the below sleep if necessary // Thread.sleep(1000); WebElement autoOptions = driver.findElement(By.className("autocomplete")); List optionsToSelect = autoOptions().findElements(By.tagName("div")); for (WebElement option : optionsToSelect) { if (option.getText().equals(textToSelect)) { System.out.println("Trying to select: " + textToSelect); option.click(); break; } } } catch(Exception e){ System.out.println("Error"); } } 

使用Prashanth的答案有点变化:

  /** * Selects the element at position idx from the autocomplete combo, considering the partialKeyword * @param driver * @param element * @param partialKeyword * @param idx * @throws InterruptedException */ public static void selectAutoCompleteValue(WebDriver driver, WebElement element, String partialKeyword, Integer idx) throws InterruptedException{ element.sendKeys(partialKeyword); Thread.sleep(1000); List  listItems = driver.findElements(By.cssSelector(".ui-autocomplete-item.ui-autocomplete-list-item")); listItems.get(idx).click(); } 

希望这可以帮助!

我在Selenium IDE 2.9.1版本中使用这些命令作为自动完成文本字段。 sendKeys(locator,value)clickAt(locator,coordString)click(locator)

这里的代码答案很少。 所以,我会做出我的贡献。

我用来从PrimeFaces 2.2中选择自动完成组件中的项目的代码:

 driver.findElement(By.id(codigoBanco_input)).sendKeys("text"); waitForElementLocated(By.cssSelector(listItensSelector), 5); List listItems = driver.findElements(By.cssSelector(listItensSelector)); Actions builder = new Actions(driver); builder.moveToElement(listItems.get(0)).build().perform(); WebDriverWait wait = new WebDriverWait(driver, 5); wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(itemSelector))); driver.findElement(By.cssSelector(itemSelector)).click();