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

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

【问题讨论】:

  • 您的意思是自动完成作为 AJAX 功能,而不是作为浏览器内置功能?

标签: java firefox junit selenium


【解决方案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 中使用了以下序列,

      1. 类型键
      2. waitForTextPresent
      3. 鼠标悬停
      4. 点击在

      效果很好

      【讨论】:

        【解决方案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();
                              

                              【讨论】:

                                猜你喜欢
                                • 2019-08-12
                                • 2011-03-20
                                • 1970-01-01
                                • 2012-03-01
                                • 2013-02-21
                                • 2014-12-16
                                • 2017-05-06
                                • 1970-01-01
                                相关资源
                                最近更新 更多