我有一个测试用例,需要在基于 ajax 的文本字段中输入部分值并验证列表是否具有预期内容。如果是,请选择内容。知道如何进行这项工作吗?
17 回答
type命令可能不足以触发自动完成。戴夫韦伯的建议在其他方面是正确的。我唯一的补充是您可能需要typeKeys命令,这会导致触发稍微不同的 JavaScript 事件,这可能更有可能触发自动完成小部件。
我会这样做:
type
在文本字段中输入值。waitForTextPresent
或verifyTextPresent
检查自动完成内容click
或mouseDown
单击自动完成列表中的项目
诀窍是让决赛click
在正确的地方进行。您应该能够使用 XPath 表达式来搜索您希望找到的文本。
对于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();
我最近写了一篇关于这个主题的 HOWTO -使用 Selenium 测试 AJAX 驱动的 JQuery 自动完成菜单:
我在IDE中使用了以下序列,
- 类型键
- waitForTextPresent
- 鼠标移到
- 点击At
并且工作得很好
你的问题有点模棱两可。
大多数浏览器保留基于字段名称的值缓存:即使您以前可能从未访问过该站点,浏览器也会建议您自动完成该值。此功能在所有浏览器中都是非标准的,并且 selenium 将没有标准的方法来检测/分析这一点。您仍然可以这样做,但您必须制作自己确定值的 javascript 函数。然后您可以在 selenium 中使用“eval”来执行这些功能。我还没有看到任何 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 label 是我要单击的值。
同样,它可能并不适合所有人,但它对我有用,我认为分享是谨慎的。
请使用 typeKeys 而不是 type。也使用 mouseDown 而不是单击。它工作正常。
Patrick的回答肯定很重要,我还发现Jquery UI的最后一个版本需要focus和mouseDown。我录制了一段测试视频,以便您可以看到它在 Sauce Labs 中运行: https ://saucelabs.com/jobs/ad8c561be39bb7a42c9bb3a063214c95
我们在使用 typeKeys 时遇到了一些问题。sendKeys 似乎成为了最终的解决方案,但它仍处于试验阶段。从参考:
此命令是实验性的。将来它可能会取代 typeKeys 命令。
对于那些对细节感兴趣的人,与试图触发 keyDown、keyUp 和 keyPress 事件的 typeKeys 命令不同,此命令由 Selenium 2 中的原子支持,并提供了一个更健壮的实现,该实现将在未来。
在 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<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");
}
}
使用 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();
}
希望这可以帮助!
我在 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<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();