如何从WebElement中提取元素

时间:2013-01-25 17:39:50

标签: xpath webdriver selenium-webdriver

有没有办法从WebElement中提取多个Web元素?例如,我有以下内容:

        String filterRowXpath = "(//div[@id=\"tabItemFilters\"]//div[@id=\"RowExpGridWidgetGridPanel\"]//div[@class=\"x-grid3-body\"]//tbody)";
    List<WebElement> filterRows = driver.findElements(By.xpath(filterRowXpath));

我最终得到一个包含5个元素的WebElement,有没有办法让我引用元素2和3?

2 个答案:

答案 0 :(得分:0)

如果你有类似的话:

<tbody>
<webelement>1<webelement/>
<webelement>2<webelement/>
<webelement>3<webelement/>
</tbody>

如果你想要2或3,你可以添加相当于[position()=2][position()=3]的[2]或[3]。

所以对于你的XPath,如果你正在寻找其中任何一个职位,它将是...... //tbody[position()=2 or position()=3]。请注意,如果您要搜索多个位置,则不能像上一个语句中那样使用简写。

<强>更新

filterRowXpath= "(((//div[@id=\"tabItemFilters\"]//div[@id=\"RowExpGridWidgetGridPanel\"]//div[@class=\"x-grid3-body\"]//tbody)[" + i + "])//td)[position()=2 or position()=3]

这将返回两个节点结果,而不是为每个结果执行单独的xpath。

List<WebElement> filterRows = driver.findElements(By.xpath(filterRowXpath));

然后将您的条件应用于WebElements。您几乎就在原始问题中发布的片段中。

答案 1 :(得分:0)

以下是我提出的建议:

    String ipFromValueXpath; 
    String ipToValueXpath;

    for(int i=1; i<=filterRows.size(); ++i) {
        ipFromValueXpath = "(((//div[@id=\"tabItemFilters\"]//div[@id=\"RowExpGridWidgetGridPanel\"]//div[@class=\"x-grid3-body\"]//tbody)[" + i + "])//td)[2]";
        ipToValueXpath = "(((//div[@id=\"tabItemFilters\"]//div[@id=\"RowExpGridWidgetGridPanel\"]//div[@class=\"x-grid3-body\"]//tbody)[" + i + "])//td)[3]";

        WebElement e1 = driver.findElement(By.xpath(ipFromValueXpath));
        String ipFromValue = e1.getText();

        WebElement e2 = driver.findElement(By.xpath(ipToValueXpath));
        String ipToValue = e2.getText();

        if(ipFromValue.equals(ipFrom) && ipToValue.equals(ipTo)) {
            e1.click();
            element = driver.findElement(By.xpath(deleteFilterButtonXpath));
            element.click();
            Thread.sleep(500);
            AdminFunctions.apply();
            return;
        }

    }

我必须为每个元素获取Xpath,然后遍历每一行以查找匹配项。我不认为这是最有效的方式。