【问题标题】:how to click in a link inside a list inside another list如何在另一个列表中的列表中单击链接
【发布时间】:2017-10-24 21:39:43
【问题描述】:

我不能让司机点击名为“sell”的链接文本 我已经尝试了很多可能性,包括这个:

List <WebElement> eventLogList = driver.findElements(By.className("nav navbar-nav"));

这是 HTML 代码:

<ul class="nav navbar-nav">
            <li class="dropdown open">
                <a class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">event log<span class="caret"></span></a>
                <ul class="dropdown-menu" role="menu">
                    <li><a href="/scan/receive"><span class="text">income</span></a></li>
                    <li><a href="/scan/delivery"><span class="text">outcome</span></a></li>
                </ul>
            </li>

            <li class="dropdown">
                <a class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Consult<span class="caret"></span></a>
                <ul class="dropdown-menu" role="menu">
                    <li><a href="/report/trackable"><span class="text" id="trackable_report">buy</span></a></li>
                    <li><a href="/report/event"><span class="text" id="event">details</span></a></li>
                </ul>
            </li>

            <li class="dropdown">
                <a class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">serie number<span class="caret"></span></a>
                <ul class="dropdown-menu" role="menu">
                    <li><a href="/generate-ium"><span class="text" id="generate-ium">sell</span></a></li>
                    <li><a href="/generate-ium"><span class="text" id="generate-ium">resell</span></a></li>
                </ul>
            </li>

        </ul>

【问题讨论】:

  • 尝试通过 xpath:"//ul//a/span[@text='sell']" 找到它,在您的描述中您可能指向确切的元素,我花了一段时间才找到它。 PS:2个id同名是不对的!

标签: java selenium selenium-webdriver automation automated-tests


【解决方案1】:

By.className 不允许使用多个类,只能使用一个作为名称。

你要的是By.cssSelector:

List <WebElement> eventLogList = driver.findElements(By.cssSelector(".nav .navbar-nav"));

【讨论】:

    【解决方案2】:

    您可以直接尝试点击链接使用

    driver.findElement(By.linkText("sell").click();
    

    【讨论】:

      【解决方案3】:

      你可以尝试如下使用cssselector:

       List <WebElement> eventLogList = driver.findElements(By.cssSelctor(".nav.navbar-nav"));
      

      然后点击出售使用:

       eventLogList.get(0).findElement(By.cssSelector("li:nth-child(3) ul>li>a")).click();
      

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题。这是悬停/单击时打开菜单的下拉菜单。在单击菜单项之前,您需要确保下拉菜单已展开并且菜单项在被单击之前可见。当下拉菜单可见时,aria-expanded 将设置为 true

        我是这样处理的:

        public boolean selectFromDropdown(String parentMenuText, String childMenuText) {
            boolean flag = false;
            // Get the nav bar
            WebElement navBar = driver.findElement(By.cssSelector(".nav.navbar-nav"));
        
            // Get all parent menu items
            List<WebElement> allNavItems = navBar.findElements(By.xpath(".//li[contains(@class,'dropdown')]"));
        
            // Loop through allNavItems to find the parentMenuText
            for(WebElement parentMenuItem : allNavItems) {
                WebElement parentMenuLink = parentMenuItem.findElement(By.xpath(".//a[contains(text(),'" + parentMenuItem + "')]"));
                String actualText = parentMenuLink.getText();
                if(actualText.equalsIgnoreCase(parentMenuText) {
                    // if true, found parent menu item
                    parentMenuLink.click();
                    // When parentMenuLink is clicked, it will trigger a DOM update in the aria-expanded attributes and therefore we need to re-initialize the element to avoid StaleElementException
                    parentMenuLink = parentMenuItem.findElement(By.xpath(".//a[contains(text(),'" + parentMenuItem + "')]"));
                    if(parentMenuLink.getAttribute("aria-expanded").equals("true")) {
                        //Get the child UL
                        WebElement childMenuContainer = parentMenuItem.findElement(By.xpath(".//ul[@role='menu']"));
        
                        // Get the child menu link
                        WebElement childMenuLink = childMenuContainer.findElements(By.xpath(".//li/a/span[@class='text' and contains(text(),'" + childMenuText + "')]/.."));
                        // Click on the child menu link
                        childMenuLink.click();
                        flag = true;
                    }
                }
                if(flag) {
                    break; // Break out of the loop if child menu link has been clicked
                }
            }
        }
        

        【讨论】:

          【解决方案5】:

          问题解决了! 我已经在开发开始时尝试过这个解决方案,由于某种原因它不起作用。 经过一些尝试,下面的解决方案解决了我的问题 代码如下:

                  WebElement btnConsult= driver.findElement(By.xpath("//*[@id='bs-example-navbar-collapse-1']/ul[1]/li[2]/a"));
              btnConsult.click();
          
              WebElement btnDetails = driver.findElement(By.linkText("Details"));
              btnDetails.click();
          

          【讨论】:

            猜你喜欢
            • 2017-06-03
            • 1970-01-01
            • 1970-01-01
            • 2011-01-19
            • 2018-07-11
            • 1970-01-01
            • 2021-07-08
            • 1970-01-01
            • 2014-09-12
            相关资源
            最近更新 更多