selenium能处理自动完成吗?
我有一个测试用例,需要在基于ajax的文本字段中键入部分值,并validation列表是否具有预期的内容。 如果是,请选择内容。 知道如何使这项工作?
type命令可能不足以触发自动完成。 Dave Webb的建议在其他方面都有发现。 我唯一的补充是你可能需要typeKeys命令,这会导致稍微不同的JavaScript事件被触发,这可能更有可能触发自动完成小部件。
我这样做如下:
-
type
以在文本字段中输入值。 -
waitForTextPresent
或verifyTextPresent
检查自动完成内容 -
click
或click
以单击自动完成列表中的项目
诀窍是让最终click
恰好在正确的位置。 您应该能够使用XPath表达式来搜索您希望找到它的文本。
对于WebDriver ,试试这个
以下代码用于自动从自动建议中搜索文本; 主要用于列表项 。
driver.findElement(By.id("your searchBox")).sendKeys("your partial keyword"); Thread.sleep(3000); List listItems = driver.findElements(By.xpath("your list item locator")); listItems.get(0).click(); driver.findElement(By.id("your searchButton")).click();
我在IDE中使用了以下序列,
- typeKeys
- waitForTextPresent
- 鼠标移到
- clickAt
并且运作良好
我最近在这个主题上写了一篇HOWTO – 使用Selenium来测试一个由AJAX驱动的JQuery自动完成菜单 :
你的问题有些暧昧。
大多数浏览器保留一个基于字段名称的值缓存:这是您的浏览器建议自动完成的值,即使您之前可能从未访问过该站点。 这个function在所有浏览器中都是非标准的,并且selenium没有标准的方法来检测/分析它。 你仍然可以这样做,但你必须自己制作确定值的javascript函数。 然后你可以在selenium中使用“eval”来执行这些function。 我没有看到任何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标签是我想要点击的值。
同样,它可能不适用于所有人,但它对我有用,我认为分享是谨慎的。
请使用typeKeys而不是type。 也可以使用mouseDown而不是click。 它工作正常。
Patrick的答案绝对重要,我还发现在Jquery UI的最新版本中需要focus和mouseDown。 我录制了一个测试video,以便您可以在Sauce Labs中看到它运行: https : //saucelabs.com/jobs/ad8c561be39bb7a42c9bb3a063214c95
我们在使用typeKeys时遇到了一些问题。 sendKeys似乎成为最终的解决方案,但它仍然是实验性的。 从参考:
这个命令是实验性的。 它可能在将来替换typeKeys命令。
对于那些对细节感兴趣的人,与尝试触发keyDown,keyUp和keyPress事件的typeKeys命令不同,这个命令由来自Selenium 2的primefaces支持,并提供了一个更强大的实现,将在未来。
在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 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 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 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();
- 在Firefox中自动下载pdf文件
- 使用selenium java在firefox gecko驱动程序中自动下载pdf
- Java Web Start Applet打开新的浏览器窗口/选项卡忽略目标
- 使用selenium的java出错:预期
- 使用Selenium WebDriver未检测到Firefox警报框
- 如何在多个浏览器中运行Selenium测试,以便使用Java进行跨浏览器测试?
- Firefox浏览器没有打开selenium webbrowser代码
- 45000 ms后无法在端口7055上连接到主机127.0.0.1。 用FF版26.0和selenium独立jar2.39
- 使用selenium Java(Mac OSX)将Firefox浏览器置于前端