代码之家  ›  专栏  ›  技术社区  ›  Payal Dhameliya

selenium webdriver中“ul”html代码在xpath中出现问题

  •  1
  • Payal Dhameliya  · 技术社区  · 8 年前

    HTML代码:

    <div id="routingPanel" class="">
    <div id="routingPanelRight">
    <ul id="routingList" class="ui-sortable">
    <li class="ui-menu-item ui-draggable" style="display: list-item;" role="presentation" data-type="srl" data-id="15">
    <a class="ui-corner-all" tabindex="-1">AS-HTTS-US-LAN-SW</a>
    <span class="fa fa-trash"/>
    <span class="type">[srl]</span>
    </li>
    <li class="ui-menu-item ui-draggable" style="display: list-item;" role="presentation" data-type="queue" data-id="119">
    <a class="ui-corner-all" tabindex="-1">AS-EMEA-NORTH</a>
    <span class="fa fa-trash"/>
    <span class="type">[queue]</span>
    </li></ul></div></div>
    

    我需要点击一个按钮,它有span类“fa fa垃圾”,但它在李类内。我在页面上有一个按钮列表,李在换课。

    我尝试使用这个xpath

    .//*[@id='routingList']/li[5]/span[1] //testdata1
    .//*[@id='routingList']/li[2]/span[1] //testdata2
    

    其中李值每次从excel文件中更改。

    WebDriverWait wait = new WebDriverWait(driver, 15);
            wait.until(ExpectedConditions.visibilityOfElementLocated((By.xpath("//ul[@id='routingList']/li/span[1]")))).click();
    
            List<WebElement> options = driver.findElements(By.xpath("//ul[@id='routingList']/li/span[1]"));
            for (WebElement option : options) {
                  if(testData.equals(option.getText()))
                    option.click();
    

    尝试了上面的代码,但它只从列表中删除了一个,我在列表中又传递了两个需要删除的测试数据。

    需要建议吗

    2 回复  |  直到 8 年前
        1
  •  1
  •   Nicolas G. Duvivier    8 年前

    根据您在评论中给我的信息,我认为问题在于您试图从不包含文本的元素中获取文本。

    假设您的测试数据是 AS-HTTS-US-LAN-SW 。在您提供的HTML和您提到的xpath中,您正在选择自动关闭标记 <span class="fa fa-trash"/>

    <ul id="routingList" class="ui-sortable">
        <li class="ui-menu-item ui-draggable" style="display: list-item;" role="presentation" data-type="srl" data-id="15">
            ===========================
            <a class="ui-corner-all" tabindex="-1">AS-HTTS-US-LAN-SW</a>  ----> The text is contained here
            <span class="fa fa-trash"/> ---> No text in that tag
            ===========================
            <span class="type">[srl]</span>
        </li>
    </ul>
    

    因此,基本上,您必须从以下方面修改xpath: //ul[@id='routingList']/li/span[1] 收件人: //ul[@id='routingList']/li/a 要获取文本,然后返回父节点以查找按钮,请执行以下操作: ../span[contains(@class, 'fa fa-trash')]

    WebDriverWait wait = new WebDriverWait(driver, 15);
    wait.until(ExpectedConditions.visibilityOfElementLocated((By.xpath("//ul[@id='routingList']/li/span[1]")))) // removed the click here because you were clicking on the first element of the list
    
    List<WebElement> options = driver.findElements(By.xpath("//ul[@id='routingList']/li/a"));
    for (WebElement option : options) {
        if(testData.equals(option.getText()))
            option.findElement(By.xpath("../span[contains(@class, 'fa fa-trash')]")).click();
    

        2
  •  1
  •   JeffC    8 年前

    我知道你已经接受了一个答案,但有一个更有效的方法来做到这一点。可以将要查找的文本指定为XPath的一部分。因此,您只需进行一次搜索,而不是遍历所有选项,如果有许多选项,这些选项可能会影响性能。同样,有了这样的东西,你可能会不止一次地使用它,所以把它放在一个函数中。

    public void selectRegion(String regionName)
    {
        driver.findElement(By.xpath("//a[.='" + regionName + "']/following-sibling::span[@class='fa fa-trash']")).click();
    }
    

    你会这样称呼它

    selectRegion(testData);
    

    A 包含所需文本的标记,然后单击同级 SPAN fa fa-trash