17

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

4

17 回答 17

16

type命令可能不足以触发自动完成。戴夫韦伯的建议在其他方面是正确的。我唯一的补充是您可能需要typeKeys命令,这会导致触发稍微不同的 JavaScript 事件,这可能更有可能触发自动完成小部件。

于 2009-03-20T01:22:09.547 回答
8

我会这样做:

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

诀窍是让决赛click在正确的地方进行。您应该能够使用 XPath 表达式来搜索您希望找到的文本。

于 2009-03-19T17:07:34.010 回答
7

对于WebDriver,试试这个

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

driver.findElement(By.id("your searchBox")).sendKeys("your partial keyword");
Thread.sleep(3000);
List <WebElement> listItems = driver.findElements(By.xpath("your list item locator"));
listItems.get(0).click();
driver.findElement(By.id("your searchButton")).click();
于 2013-05-16T10:36:19.937 回答
3

我最近写了一篇关于这个主题的 HOWTO -使用 Selenium 测试 AJAX 驱动的 JQuery 自动完成菜单

于 2010-07-11T18:08:21.393 回答
3

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

  1. 类型键
  2. waitForTextPresent
  3. 鼠标移到
  4. 点击At

并且工作得很好

于 2011-10-19T07:15:39.917 回答
2

你的问题有点模棱两可。

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

另一种选择是使用 ajax 对部分输入的值进行服务器端提交。在这种情况下,只需在文本框中输入值并断言预期值出现。通常,自动完成建议会显示在客户端的某个层中。

于 2009-03-19T17:00:47.050 回答
1

我发现在执行typeKeys之前我需要关注该领域才能使其工作。

于 2009-10-26T17:02:49.787 回答
1

这可能不适用于所有人,但我只是添加了一种方法,允许我延迟输入字符。

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 label 是我要单击的值。

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

于 2014-02-20T03:00:40.857 回答
0

请使用 typeKeys 而不是 type。也使用 mouseDown 而不是单击。它工作正常。

于 2009-09-08T05:22:56.887 回答
0

Patrick的回答肯定很重要,我还发现Jquery UI的最后一个版本需要focus和mouseDown。我录制了一段测试视频,以便您可以看到它在 Sauce Labs 中运行: https ://saucelabs.com/jobs/ad8c561be39bb7a42c9bb3a063214c95

于 2011-01-10T20:59:59.620 回答
0

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

此命令是实验性的。将来它可能会取代 typeKeys 命令。

对于那些对细节感兴趣的人,与试图触发 keyDown、keyUp 和 keyPress 事件的 typeKeys 命令不同,此命令由 Selenium 2 中的原子支持,并提供了一个更健壮的实现,该实现将在未来。

于 2013-05-24T11:33:27.543 回答
0

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

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

所以使用这个组合

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

这似乎运作良好。

于 2013-08-14T10:24:51.820 回答
0

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

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

于 2014-07-04T07:24:12.770 回答
0

我可以通过使用下面的函数来解决这个问题:下面的函数将您要选择的文本作为参数。例如:如果您想选择“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<WebElement> 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");
    }
}
于 2015-10-07T23:50:40.227 回答
0

使用 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 <WebElement> listItems = driver.findElements(By.cssSelector(".ui-autocomplete-item.ui-autocomplete-list-item"));
    listItems.get(idx).click();
}

希望这可以帮助!

于 2016-10-06T13:29:24.913 回答
0

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

于 2016-10-25T13:58:43.860 回答
0

这里的代码几乎没有答案。所以,我会做我的贡献。

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

driver.findElement(By.id(codigoBanco_input)).sendKeys("text");
waitForElementLocated(By.cssSelector(listItensSelector), 5);
List<WebElement> 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();
于 2017-11-29T15:39:27.763 回答