在xlen中为selenium webdriver

时间:2017-07-18 12:56:46

标签: selenium xpath selenium-webdriver ui-automation

HTML code:

<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-trash”的按钮,但它在li类中。我在页面上的列表上列出了li类更改。

我从excel文件中提供testdata,因此我无法使用直接值。

我试图使用这个xpath

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

其中li值每次都会从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();

尝试上面的代码,但它只从列表中删除一个,我已经传递了另外两个需要删除的testdata。

需要建议

2 个答案:

答案 0 :(得分:1)

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

我们说你的testData是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以获取文本,然后返回父节点以找到您的按钮:{ {1}}

../span[contains(@class, 'fa fa-trash')]

告诉我它是否有帮助

答案 1 :(得分:1)

我知道你已经接受了答案但是有更好的方法来做到这一点。您可以在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