Java Selenium WebDriver:无法访问下拉列表(未排序列表)的元素

Java Selenium WebDriver:无法访问下拉列表(未排序列表)的元素,java,selenium,selenium-webdriver,webdriver,Java,Selenium,Selenium Webdriver,Webdriver,我试图访问无序列表中的元素,但这似乎是个问题。这是我的功能代码 public void getLinks() throws Exception { new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.id("create-study"))); driver.findElement(By.id("create-study")).click()

我试图访问无序列表中的元素,但这似乎是个问题。这是我的功能代码

public void getLinks() throws Exception
    {
        new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.id("create-study")));
        driver.findElement(By.id("create-study")).click();
        Thread.sleep(600);
        List<WebElement> studyLinks = driver.findElements(By.cssSelector("#warren-nav > div.collapse.navbar-collapse.navbar-ex1-collapse > ul > li.dropdown.open > ul"));
        int sSize = studyLinks.size();
        System.out.println("No of links: " + sSize);
    }
public void getLinks()引发异常
{
新WebDriverWait(驱动程序,10)。直到(预期条件。元素的可视性定位(By.id(“创建研究”)));
driver.findElement(By.id(“创建研究”))。单击();
睡眠(600);
List studyLinks=driver.findElements(按.cssSelector(“#warren nav>div.collapse.navbar-collapse.navbar-ex1-collapse>ul>li.dropdown.open>ul”);
int sSize=studyLinks.size();
System.out.println(“链接数:+sSize”);
}
我在我的测试用例中,在另一个类中调用上述函数(该类没有问题,所以不在这里发布)

列表的HTML为:

<li class="dropdown">
    <a class="dropdown-toggle" data-toggle="dropdown" href="#" id="create-study">
        <i class="fa fa-plus-circle warren-nav-icon"></i>Create
    </a>
    <ul class="dropdown-menu create-dropdown">
        <li data-study-type="event">
            <a href="/finance/warren/studies/new/kensho.event" class="create-study-link event" target="_self">
                <i class="fa fa-calendar" title="event"></i> Event Analysis
            </a>
        </li>
        <li data-study-type="cyclical">
            <a href="/finance/warren/studies/new/kensho.cyclical" class="create-study-link cyclical" target="_self">
                <i class="fa fa-retweet" title="cyclical"></i> Cyclical Analysis
            </a>
        </li>
        <li data-study-type="conditional">
            <a href="/finance/warren/studies/new/kensho.conditional" class="create-study-link conditional" target="_self">
                <i class="fa fa-random" title="conditional"></i> Conditional Analysis
            </a>
        </li>
        <li data-study-type="multi_condition">
            <a href="/finance/warren/studies/new/kensho.multi_condition" class="create-study-link multi_condition" target="_self">
                <i class="fa fa-random" title="multi_condition"></i> Multiple Conditions Analysis
            </a>
        </li>
        <li data-study-type="relative">
            <a href="/finance/warren/studies/new/kensho.relative" class="create-study-link relative" target="_self">
                <i class="fa fa-bar-chart-o" title="relative"></i> Relative Analysis
            </a>
        </li>
        <li data-study-type="relative_multiple">
            <a href="/finance/warren/studies/new/kensho.relative_multiple" class="create-study-link relative_multiple" target="_self">
                <i class="fa fa-bar-chart-o" title="relative_multiple"></i> Relative Analysis: Multiple Date Ranges
            </a>
        </li>
        <li data-study-type="regime_change">
            <a href="/finance/warren/studies/new/kensho.regime_change" class="create-study-link regime_change" target="_self">
                <i class="fa fa-globe" title="regime_change"></i> Global Scenario Analysis
            </a>
        </li>
        <li data-study-type="consensus_analysis">
            <a href="/finance/warren/studies/new/kensho.consensus_analysis" class="create-study-link consensus_analysis" target="_self">
                <i class="fa fa-puzzle-piece" title="consensus_analysis"></i> Economic Consensus/Surprise Analysis
            </a>
        </li>
        <li data-study-type="trigger">
            <a href="/finance/warren/studies/new/kensho.trigger" class="create-study-link trigger" target="_self">
                <i class="fa fa-random" title="trigger"></i> Trigger Analysis
            </a>
        </li>
        <li data-study-type="earnings_analysis">
            <a href="/finance/warren/studies/new/kensho.earnings_analysis" class="create-study-link earnings_analysis" target="_self">
                <i class="fa fa-dot-circle-o" title="earnings_analysis"></i> Earnings Consensus/Surprise Analysis
            </a>
        </li>
        <li data-study-type="price_movement_analysis">
            <a href="/finance/warren/studies/new/kensho.price_movement_analysis" class="create-study-link price_movement_analysis" target="_self">
                <i class="fa fa-line-chart" title="price_movement_analysis"></i> Price Movement Trigger Analysis
            </a>
        </li>
    </ul>
</li>
  • HTML代码的检查如下:, 第一行表示一个按钮单击,显示下拉列表,下一行表示包含列表元素的div容器。当我运行我的测试用例时,我得到的大小是1,而链接的数量是11


    谁能告诉我我做错了什么吗。谢谢

    我想你停得太早了,因为你想数一数a元素,你还需要“询问”它们

    我还将选择器缩减到有趣的部分:

    List<WebElement> studyLinks = driver.findElements(By.cssSelector(" li.dropdown > ul > a"));
    
    List studyLinks=driver.findElements(By.cssSelector(“li.dropdown>ul>a”);
    
    基本上,您需要在css查询中添加“>a”


    我在css查询中不理解的是,您试图找到一个li元素,它的类为“dropdown”和“open”,其中html代码只显示一个带有“dropdown”类的li,而不显示一个带有“open”类的li。但可能您没有发布所有代码。

    如果您不介意使用xpath:

    List<WebElement> studyLinks = driver.findElements(By.xpath("//*[contains(@href, 'finance')]"));
    
    List studyLinks=driver.findElements(By.xpath(“//*[contains(@href,'finance')]”);
    
    旁注。。。您可以在函数的第一行执行此操作,然后左转并执行
    线程。sleep()
    两行之后:(为什么不使用另一个
    wait.until()
    来处理单击后的任何更改?
    Thread.sleeps()
    应该避免,原因有两个……1)如果有时600毫秒的时间不够呢?那么你的测试还是失败了。2) 如果600毫秒的时间太长怎么办?即使页面已准备就绪,您的测试仍将等待。使用适当的等待,您的测试将更快,更不容易间断中断。当您发布HTML时,请使用类似的HTML格式化程序。它使它更易于阅读,使用起来也非常简单和快捷。@JeffC我使用Thread.sleep(),因为我希望我的执行在那一点上等待600毫秒,即使元素是可见的,但我需要它等待这一次。如果有其他方法可以做到这一点,请告诉我。