硒可以处理自动完成吗?

Posted

技术标签:

【中文标题】硒可以处理自动完成吗?【英文标题】:Can selenium handle autocomplete? 【发布时间】:2010-10-14 08:44:41 【问题描述】:

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

【问题讨论】:

您的意思是自动完成作为 AJAX 功能,而不是作为浏览器内置功能? 【参考方案1】:

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

【讨论】:

【参考方案2】:

我会这样做:

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

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

【讨论】:

【参考方案3】:

对于 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();

【讨论】:

在哪里可以找到locator 定位器是如何定义的?【参考方案4】:

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

    类型键 waitForTextPresent 鼠标悬停 点击在

效果很好

【讨论】:

【参考方案5】:

我最近写了一篇关于这个主题的 HOWTO - using Selenium to test an AJAX-driven JQuery autocomplete menu:

【讨论】:

【参考方案6】:

你的问题有点模棱两可。

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

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

【讨论】:

我明白为什么我的问题可能模棱两可,但我的意思是在你回答的第二部分。就我而言,我有一个基于 ajax 的文本字段,它为用户提供基于部分输入值的选项。您可以使用 selenium 来捕获这些选项并验证其中包含预期值吗?【参考方案7】:

我发现在执行 typeKeys 之前,我需要先对字段进行 focus 才能使其发挥作用。

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

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

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

【讨论】:

【参考方案12】:

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

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

所以使用这个组合

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

这似乎运作良好。

【讨论】:

【参考方案13】:

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

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

【讨论】:

【参考方案14】:

我可以通过使用以下函数来解决这个问题: 下面的函数将您要选择的文本作为参数。 例如:如果您想选择“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");
    

【讨论】:

【参考方案15】:

使用 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();

希望这会有所帮助!

【讨论】:

【参考方案16】:

我在 Selenium IDE 2.9.1 版本中使用了这些命令 自动完成文本字段。 sendKeys(定位器,值) clickAt(定位器,坐标字符串) 点击(定位器)

【讨论】:

【参考方案17】:

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

我用来从 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();

【讨论】:

以上是关于硒可以处理自动完成吗?的主要内容,如果未能解决你的问题,请参考以下文章

Vim - 自动完成 Java

iOS 自动布局:这可以用 IB 完成吗?

相机自动对焦完成后directshow有回调吗?

pycharm 可以建议或自动完成或插入类型提示吗?

使用这个 google maps API 自动完成示例。这个函数可以修改得到经度和纬度吗?

知道为啥这个 Jquery 自动完成功能不起作用吗?