列表项li不是通过Selenium WebDriver

时间:2015-05-20 20:02:49

标签: java selenium selenium-webdriver webdriver

我需要在下拉框中选择一个项目。此下拉框用作 ul li 项目。

下拉菜单被识别为span元素,并且单击下拉按钮时显示的列表被识别为 ul li 项目。

当使用以下代码选择项目时,错误消息显示点击时无法看到这个问题。

li 元素 innerHTML 属性正确返回状态文本,但getText()方法返回空。

即使打开下拉列表框,

oStatusLi.isDisplayed()也始终返回false。

WebElement statusUl = driver.findElement(By.xpath("//*[@id='ddlCreateStatus-" + strProjId + "_listbox']"));
statusUl.click();
Thread.sleep(3000);

List<WebElement> oStatusLis = statusUl.findElements(By.tagName("li"));

for(WebElement oStatusLi: oStatusLis){

    if(oStatusLi.getAttribute("innerHTML")=="Paused")
    {

    oStatusLi.click();
    break;
    }
}

感谢是否有任何团体可以帮助我在java代码上选择列表项。

1 个答案:

答案 0 :(得分:0)

首先:将WebElement存储在内存中是不好的做法,因为它可能导致StaleElementExceptions。它现在可能会起作用,但是在未来的道路上,你最终会因为此而发生奇怪的失败。

其次,您可以使用单个选择器处理元素的选择,而不是加载所有&lt; li>元素进入内存并迭代它们。

//Store the selectors rather than the elements themselves to prevent receiving a StaleElementException
String comboSelector = "//*[@id='ddlCreateStatus-" + strProjId + "_listbox']";
String selectionSelector = comboSelector + "//li[contains(.,'Paused')]";

//Click your combo box.  I would suggest using a WebDriverWait or FluentWait rather than a hard-coded Thread.sleep here
driver.findElement(By.xpath(comboSelector)).click();
Thread.sleep(3000);

//Find the element to verify it is in the DOM 
driver.findElement(By.xpath(selectionSelector));    

//Execute JavaScript function scrollIntoView on the element to verify that it is visible before clicking on it.
JavaScriptExecutor jsExec = (JavaScriptExecutor)driver;
jsExec.executeScript("arguments[0].scrollIntoView();", driver.findElement(By.xpath(selectionSelector)));
driver.findElement(By.xpath(selectionSelector)).click();

您可能最终还是必须执行JavaScript函数,同时单击该元素,具体取决于scrollIntoView是否有效。