硒可以处理自动完成吗?
Posted
技术标签:
【中文标题】硒可以处理自动完成吗?【英文标题】:Can selenium handle autocomplete? 【发布时间】:2010-10-14 08:44:41 【问题描述】:我有一个测试用例,需要在基于 ajax 的文本字段中输入部分值并验证列表是否具有预期内容。如果是,请选择内容。知道如何完成这项工作吗?
【问题讨论】:
您的意思是自动完成作为 AJAX 功能,而不是作为浏览器内置功能? 【参考方案1】:type 命令可能不足以触发自动完成。戴夫韦伯的建议在其他方面是正确的。我唯一的补充是您可能需要 typeKeys 命令,这会导致触发稍微不同的 javascript 事件,这可能更有可能触发自动完成小部件。
【讨论】:
【参考方案2】:我会这样做:
type
在文本字段中输入值。
waitForTextPresent
或 verifyTextPresent
检查自动完成内容
click
或 mouseDown
点击自动完成列表中的项目
诀窍是让最终的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();
【讨论】:
以上是关于硒可以处理自动完成吗?的主要内容,如果未能解决你的问题,请参考以下文章