首页 文章

列表项目li不是通过Selenium WebDriver从下拉列表中选择的

提问于
浏览
1

我需要在下拉框中选择一个项目 . 此下拉框用作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

    首先:将WebElement存储在内存中是不好的做法,因为它可能导致StaleElementExceptions . 它可能现在可以正常工作,但在未来的道路上,你最终会因为此而发生奇怪的故障 .

    其次,您可以使用单个选择器处理元素的选择,而不是将所有<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是否有效 .

相关问题